문제:
입력:
출력:
풀이 방법:
문제를 풀기에 앞서서 문제를 이해를 하는 것조차 어려웠다. 1~n까지의 수가 있을 때 각 수를 스택 구조를 유지하는 배열에 넣었다가 빼면서 우리가 입력으로 넣은 수열을 만드는 것이 문제의 목표이다.
처음에는 while로 넣었다가 빼는 과정을 조절하려고 했으나 적절한 조건을 찾기 어려웠다. 그래서 예외처리 구문을 사용해서 빈 리스트에서 pop을 하려 할 때 오류가 발생해서 빠져나오도록 만들었다.
우선 입력으로 처음 넣은 값을 만들기 위해서 그 값까지 모든 값들을 계속 순차적으로 넣어야 한다. 그래서 맨 처음 i로 반복되는 for 반복문이 첫 원소를 만들기 위한 과정이다. 이후 j 반복문을 통해서 본격적으로 원하는 수열을 만들고자 한다. 일단 우선적으로 answer가 비어있다면 하나 추가를 하는 과정을 거친 뒤 stack인 answer 배열의 맨 윗 값이 원하는 값인지 비교를 하는 조건문을 만들었다. 만약 원하는 값이라면 -를 하고 그렇지 않다면 아직 answer에 들어가 있지 않은 것이라면 반복문 i처럼 계속넣어주면 되기 때문에 이번에는 while로 넣어주도록 한다. 그리고 다시 끝 값을 비교하고 빼도록 한다.
하지만 j-for를 반복하면서 더하거나 빼는 작업을 한 번도 하지 않았다면 이 것은 문제가 생긴 경우 이므로 somethingtodo라는 부울 함수를 사용해 NO를 출력하도록 한다. (주로 빼야할 수가 이미 들어가 있을 경우 발생한다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | n=int(input()) def sol(n): answer_list=[int(input()) for i in range(n)] answer=[] ans=[] k=0 try: for i in range(1,answer_list[0]+1): k+=1 answer.append(k) ans.append("+") for j in range(n): somethingtodo=False if len(answer)==0: k+=1 answer.append(k) ans.append("+") somethingtodo=True if answer[-1]==answer_list[j]: answer.pop() ans.append('-') somethingtodo=True else: while answer_list[j]>answer[-1]: k+=1 answer.append(k) ans.append("+") somethingtodo=True if answer[-1]==answer_list[j]: answer.pop() ans.append("-") somethingtodo=True if somethingtodo: pass else: print("NO") return print(*ans,sep="\n") except: print("No") sol(n) | cs |
'Algorithm > Python' 카테고리의 다른 글
[BOJ]2504. 괄호의 값 (0) | 2019.04.18 |
---|---|
[BOJ]9012.괄호 (0) | 2019.04.17 |
[BOJ]10828. 스택 (0) | 2019.04.15 |
[BOJ]4948.베르트랑 공준 (0) | 2019.04.14 |
[BOJ]1929. 소수 구하기 (0) | 2019.04.13 |