문제:
풀이 과정:
|
|
|
|
|
|
|
|
|
|
1 |
|
4 |
비교 대상이 없어 통과한다. |
4 |
위 값이 작으므로 그냥 패스한다. |
|
|
|
|
|
|
7 |
|
|
|
|
|
1 |
7을 쌓았을 때 자리를 |
7 |
자리를 바꾼 후 1을 빼 |
|
이 역시 7이 더 크므로 |
4 |
바꾼다. |
4 |
고 다시 4와 비교를 함 |
7 |
자리를 바꾸고 4를 뺌 |
이 작업을 반복해서 하면 큰 수를 만들 수 있다.
하지만 54321, k=1 와 같은 경우에는 하나도 빠지는 것 없이 54321 순으로 쌓이게 된다. 이 규칙으로 쌓았을 때 마지막으로 갈 수록 수가 작아지므로 뒤에서 부터 잘라서 사용하도록 한다.
우선 number가 string이므로 이를 list로 쪼개 하나씩 넣을 수 있도록 만들었다. 그리고 첫 수는 항상 넣고 시작하였다. 하나씩 넣으면서 Tos(Top of stack) 즉 지금 맨 위에 쌓인 부분의 인덱스를 하나씩 늘렸다. while 문이 규칙의 2,3번을 반복하는 과정이다. correct라는 변수는 4177252841와 같은 경우에 7을 넣을 때 두 번 연속 빼야하는데 이와 같은 행위를 하기 위해서 넣은 변수이다.
그리고 맨마지막에 54321 과 같은 경우를 해결하기 위해 뒤에서 부터 자르도록 하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | def solution(number,k): number=list(number) answer=[number[0]] Tos=0 for i in range(1,len(number)): answer.append(number[i]) Tos+=1 correct=1 while (correct and k !=0): correct-=1 for j in range(Tos,len(answer)): if answer[j-1]>=answer[j]: pass else: answer[j-1],answer[j]=answer[j],answer[j-1] answer.pop() correct+=1 Tos-=1 k-=1 break answer="".join(answer) return answer[:len(answer)-k] | cs |
'Algorithm > Python' 카테고리의 다른 글
[Programmers]Lv 2. 소수 찾기 (0) | 2019.02.14 |
---|---|
[Programmers]Lv 1. 체육복 (0) | 2019.02.13 |
[Programmers]Lv 1. K번째수 (0) | 2019.02.11 |
[Programmers]Lv 2.더 맵게 (0) | 2019.02.10 |
[Programmers]Lv 1.같은 숫자는 싫어 (0) | 2019.02.09 |