[Python] 1541번 - 잃어버린 괄호

허창원·2023년 3월 2일
0
post-thumbnail
post-custom-banner


풀이를 떠올린 과정

  1. '-'가 커야한다. 첫 숫자와 마지막 숫자에 괄호가 오고 '-' 앞뒤에 괄호가 와야한다.
  2. 괄호를 어떻게 삽입할 것인가? insert()는 문자열에서는 활용할 수 없다. 문제에서 첫번째와 마지막에는 숫자가 온다고 했으므로 첫번째 수가 음수일 수 없다. 풀이 방법은 쉽게 떠올렸으나 구현하는 것이 어렵다.
  3. split('-')을 하면 첫번째 원소만 양수이고 그 뒤 원소들은 음수다.(이걸 알아채는 데 2시간 넘게 걸렸다.)
  4. '090+090-100+090-090' 이런 문자열이 있을 수 있다. 그래서 처음에 0이 오는 숫자의 0을 제거해야한다.
  5. ★ split('-')하고 따로 split('+')을 해서 합쳐두자(이걸 떠올리는데 30분 이상 걸렸다.)

첫 번째 코드

n = input()
A = n.split('-') 
B=[] 
for plus_num in A:
    q = plus_num.split('+') 
    for x in range(len(q)):
        q[x]=int(q[x])
    B.append(sum(q))
Sum = B[0]
for j in range(1,len(B)): 
    Sum-=B[j]
print(Sum)

수정 후 코드

A = input().split('-') # '-'를 기준으로 나누어 A[0]만 양수이고 나머지는 음수다.

Sum=[] 

for pn in A:
    Sum.append(sum(map(int,pn.split('+')))) # '+'를 기준으로 문자를 나누어주고 합해준다. 

print(Sum[0] - sum(Sum[1:])) # Sum의 첫 요소만 양수이고 그 후는 음수이다.

개선점

  1. line 1,2의 input()과 split()을 나누어 적을 이유가 없다.
  2. map() 함수는 새로운 자료구조 혹은 객체를 정의할 때 사용하는 함수이다. 객체보다는 주로 새로운 자료구조를 필요로 하는 경우에 많이 사용한다. 또, 주어진 값을 새로운 값으로 구성하는 함수라고도 말할 수 있다. for문을 통해서 요소들을 변환하는 것은 번거로우므로 map() 함수를 통해서 변환하자.
  3. 단순 연산을 for문으로 하지말고 리스트 슬라이싱을 통해 계산하는 방법이 있다.

공부할 숏 코드

a,*b=[sum(map(int,s.split('+')))for s in input().split('-')];print(a-sum(b))

*는 언패킹, 패킹할 때 사용하는 연산자이다. 리스트 혹은 튜플의 요소들을 풀어헤치는 언패킹을 하거나 다수의 요소들을 변수 하나로 패킹할 수 있다.

a,*b = [1,2,3,4]
a # 1
b # [2,3,4]

*a,b = [1,2,3,4]
a # [1,2,3]
b # 4

위와 같은 경우는 a요소 하나와 *b를 나머지 리스트로 받은 것이다.

post-custom-banner

0개의 댓글