알고리즘 스터디 정렬 - 1874번
정렬 알고리즘 1874번 풀이
study인사말
안녕하세요. 송민선입니다.
어느덧 알고리즘 스터디를 시작한 지 3주 째가 됐네요.
하다보니 점점 더 익숙해지는 것 같기도 하면서 어려운 문제가 나오면 현타가 씨게 오네요…
다들 꾸준히 열심히 해봅시다!!
문제해석
이번 문제는 꽤나 저한테 난이도가 있는 편이었습니다.
간단히 문제를 보자면
입력
첫 줄에 n (1 ≤ n ≤ 100,000)이 주어진다. 둘째 줄부터 n개의 줄에는 수열을 이루는 1이상 n이하의 정수가 하나씩 순서대로 주어진다. 물론 같은 정수가 두 번 나오는 일은 없다.
출력
입력된 수열을 만들기 위해 필요한 연산을 한 줄에 한 개씩 출력한다. push연산은 +로, pop 연산은 -로 표현하도록 한다. 불가능한 경우 NO를 출력한다.
간단하게 예시를 들자면
입력
4
2
3
4
1
이면
step 1
push
스택 => [1]
step2
push
스택 => [1,2]
step3
pop
스택 => [1]
수열 => 2
step4
push
스택 => [1,3]
수열 => 2
step5
pop
스택 => [1]
수열 => 2 3
step6
push
스택 => [1,4]
수열 => 2 3
step7
pop
스택 => [1]
수열 => 2 3 4
step8
pop
스택 => []
수열 => 2 3 4 1
와 같이 나오기 때문에 출력값으로
+
+
-
+
-
+
-
-
가 나오게 됩니다.
풀이방법
import sys
num = int(sys.stdin.readline())
stack_list = []
answer_list = []
count = 1
is_valid = True
for i in range(num):
value = int(sys.stdin.readline())
while count <= value:
stack_list.append(count)
answer_list.append("+")
count += 1
if stack_list[-1] == value:
stack_list.pop()
answer_list.append("-")
else:
is_valid = False
if is_valid:
for i in answer_list:
print(i)
else:
print("NO")
마무리
처음엔 무작정 [1,2,3,4,5,6] 이런식으로 스택을 만들어주고 그 스택을 기반으로 반복문을 썼더니 잘 풀리지 않았습니다.
이 문제에서 수열은 1부터 n까지 이루어진 정수가 하나씩 주어진다라는 점이 중요하였습니다.
그래서 count라는 변수를 만들어주고 처음 pop이 나오기전까지 count를 계속 더해주었습니다.
어차피 모든 수는 한번 씩 나오기 때문에 pop이 나온 후에 push과정이 필요하면 그 전 count값에서 마저 이어가도 문제가 발생하지 않습니다.
처음엔 이러한 본질을 잘 파악하지 못하여 해결하지 못했습니다.ㅠㅠ 앞으로 더 열심히 해여겠어요 ㅜㅜㅜ