[Python] 백준 1541: 잃어버린 괄호

nimoh·2023년 7월 30일


이 문제는 정답 비율이 내가 풀 당시 기준으로 52%로 꽤 높았다.
하지만 역시 틀렸다..

내가 생각한 방법은 다음과 같다.

  1. 입력한 식을 연산자 배열과 숫자 배열을 구분한다.
  2. 반복문을 돌며 연산자에 마이너스가 오면 다음 마이너스가 올 때까지 모두 더해 임시값에 저장한다.
  3. 다음 마이너스가 들어오면 임시값을 정답값에 뺀다.
question = input()
digits = []
operations = []
tmp_num = ''
answer = 0
for i in question:
    if i.isdigit():
        tmp_num += i
    else:
        digits.append(int(tmp_num))
        tmp_num = ''
        operations.append(i)
digits.append(int(tmp_num))
if len(digits) == 0:
    print(0)
    exit(0)

tmp_num = 0
isMinus = False
for i in range(len(digits)):
    if i == 0:
        answer+= digits[i]
        continue
    if isMinus:
        if operations[i-1] == '+':
            tmp_num += digits[i]
        else:
            answer -= tmp_num
            answer -= digits[i]
            isMinus = False
    else:
        if operations[i-1] == '+':
            answer += digits[i]
        else:
            isMinus = True
            tmp_num += digits[i]
if tmp_num:
    answer -= tmp_num
print(answer)

정말 코드가 난장판이다.
그냥 생각나는대로 코딩해본건데 나 역시 짜면서 이런 난잡한 코드가 답일 리가 없다라는 생각이 들었다.
생각한 답은 잘 출력되었지만 왜인지 백준에 제출하면 실패가 떴다.
이유를 알 수 없어 답안지를 보았다.

arr = input().split('-')
s = 0
for i in arr[0].split('+'):
    s += int(i)
for i in arr[1:]:
    for j in i.split('+'):
        s -= int(j)
print(s)
  1. 식을 '-'로 나눠 배열로 만든다. ( 그렇다면 배열에는 숫자와 +만 남을 것이다. )
  2. '-'로 나뉜 배열의 첫 번째 식은 마이너스가 없으므로 무조건 정답에 더해준다.
  3. 나머지 식(arr[1:])은 모두 마이너스를 하면된다. 왜냐하면 지금 식에는 +밖에 없는데, - 뒤에 나오는 +는 어차피 모두 마이너스기 때문이다.

실패 후 성장

나는 코딩테스트 문제를 풀 때 정말 직관적으로 생각해보고, 답이 도출되는 과정을 작성해본 후 그것을 곧이곧대로 구현하곤 한다.
이 방식이 완전 잘못된 건 아닌 것 같지만 때론 이 문제의 정답과 같이 창의적으로 생각할 필요도 있을 것 같다.
특히, 내가 생각한 과정이 Python에서 구구절절 길어진다면 과감하게 다시 생각해볼 필요가 있을 것같다. 코딩테스트 문제는 핵심 아이디어를 캐치하면 코드를 간단하게 도출할 수 있다는 말을 어디선가 본 것 같다.

profile
부족함을 인정하는 순간이 성장의 시작점이다.

0개의 댓글