코딩 테스트/Level 2

6. 쇠막대기

컴닥 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;
    }
}
반응형