PS, 언어 공부/알고리즘 문제풀이

[Python] 백준 온라인 저지 1541 잃어버린 괄호

Emil :) 2023. 2. 19. 19:16
728x90
반응형

목차

문제


https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

설계&풀이


아이디어는 옳게 접근했으나, 구현을 못했다.

요건은 간단하다. -를 기준으로 split 해주고, 나머지 애들을 다 묶어버리면 된다.
여러가지 케이스가 있는데..

  1. 10+20-10
    맨 앞이 +로 시작해서 묶이는 경우
  2. 10-20
    맨 앞이 단순 숫자인 경우
  3. 10-20+30
    맨 앞은 숫자, 뒤가 +로 묶이는 경우
  4. 10
    하나만 들어오는 경우
  5. 10+20
    +만 들어오는 경우
  6. 10-20-20
    -만 들어오는 경우
  7. 10-20+30-10
    도중에 +로 묶어주고 마지막으로 -해주는 경우
  8. 등등등..

이런걸 다 케이스로 나눠서 하려고 짠 코드가... 다음과 같다.
사실 도중에 뭔가 잘못됨을 깨달았지만 뭔가 될거같아서 어거지로 풀려고했는데, 계속 틀려서 결국 답지를 봤다..

# 틀린 풀이
s = input().split('-')

if len(s) == 1:
    s = s[0]
    # 10+20+30 처럼 +만 있는 경우는 len(s) == 1임
    if s.find('+') != -1:
        temp = list(map(int, s.split('+')))
        print(sum(temp))
    # 아니면 숫자만 주어지는 경우
    else:
        print(s)
else:
    # 55-50+40-40+20-20 = -115
    tempSum = 0
    # s[0]이 10+20 이렇게 더해진 값이 아닐 때 사용되는 flag
    flag = True
    if s[0].find('+') == -1:
        tempSum = int(s[0])
    else:
        tempSum = sum(list(map(int, s[0].split('+'))))
        flag = False
    n = len(s)
    for i in range(n):
        if s[i].find('+') != -1 and flag:
            temp = list(map(int, s[i].split('+')))
            tempSum -= sum(temp)
        # 마지막에 - 인 경우 그냥 -= 해줌
        if s[i].find('+') == -1 and i == len(s)-1:
            tempSum -= int(s[i])
            
    print(tempSum)

그리고 답은 정말 깔끔하다
이게 - 로 split 하고나서 첫 숫자도 계산해버리는 경우를 어떻게 해야하나 해서 flag를 따로 뒀었는데 (사실 맞는 방법이라곤 생각안함, 이 때부턴 그냥 맞춘다 마인드였음)
그냥 애초에 1부터 n까지로 for문 돌리면되는거였다..

s = input().split('-')
num = []
for i in s:
    cnt = 0
    s = i.split('+')
    for j in s:
        cnt += int(j)
    num.append(cnt)
n = num[0]
for i in range(1, len(num)):
    n -= num[i]
print(n)

코드 GIT 주소


PS_study/1.py at main · kkkapuq/PS_study · GitHub

 

GitHub - kkkapuq/PS_study: 1일1솔 스터디

1일1솔 스터디. Contribute to kkkapuq/PS_study development by creating an account on GitHub.

github.com

 

코드


'''
문제 : 잃어버린 괄호
난이도 : 실버 2
링크 : https://www.acmicpc.net/problem/1541
'''
'''
1. - 뒤에 붙는 애들을 싹 다 묶어버리면 그게 최소다
2. + 로 split 하고 sum(list) 해준걸 계속 -= 해주자
'''
'''
# 틀린 풀이
s = input().split('-')

if len(s) == 1:
    s = s[0]
    # 10+20+30 처럼 +만 있는 경우는 len(s) == 1임
    if s.find('+') != -1:
        temp = list(map(int, s.split('+')))
        print(sum(temp))
    # 아니면 숫자만 주어지는 경우
    else:
        print(s)
else:
    # 55-50+40-40+20-20 = -115
    tempSum = 0
    # s[0]이 10+20 이렇게 더해진 값이 아닐 때 사용되는 flag
    flag = True
    if s[0].find('+') == -1:
        tempSum = int(s[0])
    else:
        tempSum = sum(list(map(int, s[0].split('+'))))
        flag = False
    n = len(s)
    for i in range(n):
        if s[i].find('+') != -1 and flag:
            temp = list(map(int, s[i].split('+')))
            tempSum -= sum(temp)
        # 마지막에 - 인 경우 그냥 -= 해줌
        if s[i].find('+') == -1 and i == len(s)-1:
            tempSum -= int(s[i])
            
    print(tempSum)
'''

s = input().split('-')
num = []
for i in s:
    cnt = 0
    s = i.split('+')
    for j in s:
        cnt += int(j)
    num.append(cnt)
n = num[0]
for i in range(1, len(num)):
    n -= num[i]
print(n)

결과


 

 

구독 및 하트는 정보 포스팅 제작에 큰 힘이됩니다♡

728x90
반응형