프로그래머스의 큰 수 만들기(Lv2) 문제이다.
[ 문제풀이 ]
1) 본인은 이 문제를 스택을 이용해서 한번 생각해 보았다.
전체적인 과정은 다음과 같다.
1. 전체 숫자를 탐색하면서, 가장 앞에 숫자부터 스택에 넣을 수 있는지 판단한다.
2. 여기서 "판단한다" 라는 것은
1) 스택의 가장 위에 있는 값이 현재 넣으려는 숫자보다 더 크다면 그대로 넣어준다.
2) 스택의 가장 위에 있는 값이 현재 넣으려는 숫자보다 작다면, 현재 넣으려는 숫자보다 크거나 같은
숫자가 나올 때 까지, 스택의 값을 빼준 후에 넣어준다.
이러한 과정인데 무슨 말인지 하나도 모르겠으니 예시를 통해서 알아보자.
예제입력으로 주어진 "1924"의 경우를 생각해보자.
"1924"중 2개의 갯수를 빼서 가장 큰 숫자를 만들어야 한다.
1. '1'을 스택에 넣을 수 있는지 판단한다.
이 경우에는 아직 스택에 아무런 값도 없으므로 그대로 넣어준다.
2. '9'를 스택에 넣을 수 있는지 판단한다.
스택의 top에 있는 값이 '1' 이므로, '1'을 빼준 후, 9를 넣어준다. (제거한 횟수 : 1)
3. '2'를 스택에 넣을 수 있는지 판단한다.
스택의 top에 있는 값이 '9'이므로, 현재 넣으려는 숫자보다 스택의 가장 위에 있는 값이 더 큰 경우이므로
그대로 넣어준다.
( 현재 스택의 상태 : [ 2, 9 ] )
4. '4'를 스택에 넣을 수 있는지 판단한다.
스택의 top에 있는 값이 '2' 이므로, 현재 넣으려는 숫자보다 작기 때문에 값을 빼준다. (제거한 횟수 : 2)
( 현재 스택의 상태 : [ 9 ] )
스택의 top에 있는 값이 '9'이므로, 현재 넣으려는 숫자보다 크기 때문에 그대로 넣어준다.
( 현재 스택의 상태 : [ 4 ] )
이렇게 계산을 끝내면 스택에 [ 4 , 9 ] 가 존재하게 된다. 이 후 스택을 역으로 출력을 해주면 된다.
하지만, 이렇게만 생각을 하면 안된다. 예를 들어서 "9876" 에서 2개의 문자를 제거해서 최댓값을 만드는 경우를
생각해보자.
처음에 '9'가 들어가고, '8'이 들어갈 때, 8보다는 9가 더 크기 때문에 그냥 넣어주므로, [ 8, 9 ] 가 된다.
이 후, 7, 6을 순서대로 값을 넣어주더라도 제거되는 숫자 하나 없이, [ 9, 8, 7, 6 ] 이 스택에 저장되어 질 것이다.
이렇게 제거가 되지 않는 경우는 물론, 제거가 몇개 되더라도 문제에서 주어진 K번 만큼 제거하지 못하는 경우가
발생한다.
하지만, 위의 계산대로라면 스택에는 큰 값일수록 가장 아래쪽에, 작은 값일수록 top()쪽에 가깝게 위치하고 있을 것이다.
따라서 남은 횟수만큼 스택에서 값을 빼주면 된다.
"9876"에서 계산을 끝냈더니 스택에 [ 6 , 7, 8, 9 ] 가 존재했고, 아직 문자를 제거한 횟수가 0회 이므로,
2번만큼 제거하기 위해서 스택에서 2번만큼만 pop연산을 하게 되면, [ 8, 9 ] 가 남게 되고, 이를 역순으로 출력하면
"98" 이라는 결과를 얻을 수 있다.
[ 소스코드 ]
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 42 | #include<string> #include<stack> using namespace std; string solution(string S, int K) { string Answer = ""; stack<char> Stack; int Remove_Cnt = 0; int Answer_Size = S.length() - K; for (int i = 0; i < S.length(); i++) { char Num = S[i]; while (Stack.empty() == 0 && Remove_Cnt < K) { char TopNum = Stack.top(); if (TopNum < Num) { Stack.pop(); Remove_Cnt++; } else break; } Stack.push(Num); } while (Answer_Size != Stack.size()) Stack.pop(); stack<char> Temp; while (Stack.empty() == 0) { Temp.push(Stack.top()); Stack.pop(); } while (Temp.empty() == 0) { Answer = Answer + Temp.top(); Temp.pop(); } return Answer; } | cs |
'[ Programmers Code ] > # PG - Level2' 카테고리의 다른 글
[ 프로그래머스 위장 (Lv2) ] (C++) (0) | 2020.03.05 |
---|---|
[ 프로그래머스 소수 찾기 (Lv2) ] (C++) (3) | 2020.02.18 |
[ 프로그래머스 더 맵게 (Lv2) ] (C++) (2) | 2020.02.14 |
[ 프로그래머스 괄호 변환 (Lv2) ] (C++) (0) | 2020.02.13 |
[ 프로그래머스 가장 큰 수 (Lv2) ] (C++) (0) | 2020.02.10 |