코딩 테스트/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;
}
}
반응형