문제
https://www.acmicpc.net/problem/1874
풀이
풀었지만 다른사람들의 코드가 더 좋아보여서 가져와봤다! 내 코드는 밑에 있음.. 반성하자,,
n = int(input())
s = []
op = []
count = 1
temp = True
for i in range(n):
num = int(input())
while count <= num:
s.append(count)
op.append('+')
count += 1
if s[-1] == num:
s.pop()
op.append('-')
else:
temp = False
if temp == False:
print('NO')
else:
for i in op:
print(i)
1부터 n까지의 수를 스택에 넣고 빼면서 하나의 수열을 만들어야한다.
- count는 n까지의 수, s는 넣고 뺄 스택, op는 +와 -를 넣을 리스트, temp는 가능, 불가능 확인
- count가 입력받는 수 보다 작거나 같을때까지 s에 더해주고 +를 op에 더해준다. count도 +1해주었다.
- 만약 s의 가장 마지막 수가 num과 같으면 s를 pop해주고 op에 -를 더해준다.
- 같지 않다면 수열을 만들 수 없기 때문에 temp에 False 넣기
- 만약 False면 no출력, 아니면 op 출력
내 코드
n=int(input())
arr,s,answer=[],[],[]
for i in range(n):
x = int(input())
arr.append(x)
sol=False
i=0
while True:
if not arr and not s: #1
sol=True
break
if i==n and s and arr[0] != s[-1]: #2
sol=False
break
if s and arr[0] == s[-1]: #3
arr.pop(0)
s.pop()
answer.append("-")
else: #4
i+=1
s.append(i)
answer.append("+")
print('\n'.join(answer)) if sol else print("NO")
- 만들어야하는 수열을 입력받아 arr에 저장해주었다. 이 수열과 같은지 비교해줄것이다.
- 반복문을 돌리면서 스택에 넣고 뺄 것이다. 스택은 s라고 하였다.
- #1 (break문) : 만약 arr 과 s가 둘다 비었으면 True를 sol에 저장해준다.
- #2 (break문) : 만약 i가 n과 같고 s가 비지않았고 arr의 첫번째가 s의 마지막과 다르면 False 저장
- #3 (- if문) : s[-1] 즉, 가장 마지막 수를 구하기 위해서 s가 비어있는지 확인해준다. 그리고 arr의 첫번째가 s의 마지막과 같으면 arr[0]을 pop하고 s[-1]도 pop 해준다. 그리고 answer 리스트에 -를 더해준다.
- #4 (+ if문) 위의 #3의 경우가 아니면 +를 추가해준다.
- sol의 결과에 따라서 출력
느낀점
이 문제는 일단 이해하는데 좀 걸렸다.. 문제읽고 응? 이라는 생각이 들었음., 그렇게 푼 코드도 바보같이 나왔다 ㅠ 다른사람꺼보니까 더 바보같음!!!!! 담엔 더 열심히 생각해보자..
'코딩테스트 > Python' 카테고리의 다른 글
[Python] 백준 #2164 - 카드2 (1) | 2021.12.07 |
---|---|
[Python] 백준 #18258 - 큐 2 (1) | 2021.12.07 |
[Python] 백준 #4949 - 균형잡힌 세상 (0) | 2021.12.03 |
[Python] 백준 #9012 - 괄호 (0) | 2021.12.02 |
[Python] 백준 #10773- 제로 (0) | 2021.12.01 |