ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 6. 쇠막대기
    코딩 테스트/Level 2 2020. 7. 20. 22:12
    반응형

    https://programmers.co.kr/learn/courses/30/lessons/42585

     

    코딩테스트 연습 - 쇠막대기

    여러 개의 쇠막대기를 레이저로 절단하려고 합니다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자릅니다. 쇠막대기와 레�

    programmers.co.kr

    파이썬

     

    def solution(arrangement):
        sum, stack = 0, 0
        for element in arrangement:
            if element == '(':  # '('인 경우
                stack += 1  # 막대가 하나 쌓인다.
                last = '('  # '('을 지나갔음을 기록해 둔다.
            else:  # ')' 인 경우
                if last == '(':  # 직전 블럭이 '(' 이었으면
                    stack -= 1  # 막대가 아니라 레이저니까 쌓은 것에서 하나 빼주고
                    sum += stack  # 쌓은 만큼 잘라주니까 합계에 추가하자.
                else:  # 직전 블럭이 ')' 이니까
                    stack -= 1  # 쌓은 막대에서 하나가 줄어들고
                    sum += 1  # 합계에는 하나 추가된다.
                last = ')'  # ')' 을 지나갔음을 기록해 둔다.
        return sum

    () 를 다른 문자로 치환해서 레이저와 막대를 분류 후 정리하는 것이 더 직관적입니다.

    def solution(arrangement):
        arrangement = arrangement.replace('()', 'L')
        sum, stack = 0, 0
        for element in arrangement:
            if element == '(':  # '('인 경우
                stack += 1  # 막대가 하나 쌓인다.
            elif element == 'L':  # 'L' 인 경우
                sum += stack  # 쌓은 만큼 잘라주니까 합계에 추가하자.
            else:  # 직전 블럭이 ')' 이니까
                stack -= 1  # 쌓은 막대에서 하나가 줄어들고
                sum += 1  # 합계에는 하나 추가된다.
        return sum

     

    자바스크립트

    function solution(arrangement) {
    	arrangement = arrangement.split("()").join("L");
    	var sum = 0;
    	var stack = 0;
    	for (var i = 0; i < arrangement.length; i++) {
    		switch (arrangement[i]) {
    			case '(':
    				stack++;
    				break;
    			case ')':
    				sum++;
    				stack--;
    				break;
    			case 'L':
    				sum += stack;
    				break;
    		}
    	}
    	return sum;
    }

    자바 스크립트의 replace는 1회만 replace 해주기 때문에 이런 편법을 이용합니다. OTL

     

    자바

    class Solution {
        public int solution(String arrangement) {
            arrangement = arrangement.replace("()","L");
            int answer = 0;
            int stack = 0;
            for (char c : arrangement.toCharArray()) {
                if (c == '(') stack++;
                else if (c == 'L') answer += stack;
                else {
                    stack--;
                    answer++;
                }
            }
            return answer;
        }
    }

     

    코틀린

    class Solution {
        fun solution(arrangement: String): Int {
            val arrangement = arrangement.replace("()", "L")
            var answer = 0
            var stack = 0
            for (c in arrangement) {
                when (c) {
                    '(' -> stack++
                    'L' -> answer += stack
                    ')' -> {
                        stack--
                        answer++
                    }
                }
            }
            return answer
        }
    }

     

    C#

    public class Solution
    {
        public int solution(string arrangement)
        {
            arrangement = arrangement.Replace("()", "L");
            int sum = 0;
            int stack = 0;
            foreach (char c in arrangement)
            {
                if (c == '(') stack++;
                else if (c == 'L') sum += stack;
                else // c == ')'
                {
                    stack--;
                    sum++;
                }
            }
            return sum;
        }
    }
    반응형
Designed by Tistory.