2021. 6. 11. 09:30ㆍTIL(Today I learned)
📕Facts(한 것)
- 알고리즘 복습
- 프로그래머스 문제 풀기
- 수업듣기
- 학교 과제
📕Findings(배운 것)
그리디 알고리즘을 복습하면서 어제 풀다만 프로그래머스 문제가 생각나서 다시 시도해봤다.
큰 수 만들기라는 문제인데,
첫번째 시도는 문자열을 오름차순으로 정렬한 후 인덱스 0부터 k까지 큐에 저장한 후
원래 문자열에서 빼는 방식이었다.
이런 방식은 테스트 케이스 1, 2번은 통과하지만 3번 케이스는 통과하지 못하는데,
작은 수를 빼내어도 가장 큰 수가 되지 못했기 때문이었다.
두번째 시도는 C++ string 라이브러리 메서드인 str.erase()를 활용한 풀이방법이었다.
문자열 인덱스 i와 i+1을 비교한 후, i가 더 작다면 i를 erase()함수를 통해서 지우는 방식이다.
이러한 방식은 테스트 케이스는 모두 통과하지만 체점하는 케이스에서 실패를 했다.
마지막 시도는 두번째 방식에서 놓친 부분을 보완한 방식인데,
두번째 시도한 방식은 문자열이 모두 같은 숫자일 때를 걸러주지 못하는 문제점이 있었다.
그렇기 때문에 이를 해결하기 위해서 erase() 실행 전후로 문자열의 길이를 비교하였다.
erase()실행 전후의 길이가 같다면 erase()함수가 작동하지 않은 것이고,
이 말은 index i 와 i+1이 같은 상황에 모든 문자열에 걸쳐있다는 뜻이고
결국 모든 문자열이 동일한 숫자로 이루어져 있다는 것을 의미한다.
이 경우 문자열에서 어떤 인자를 삭제해도 return하는 답에는 영향을 주지 않기 때문에
가장 뒤에 있는 인자를 pop하였다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string number, int k) {
while(k--) {
int len = number.length();
if(number.length() - k <= 1)
break;
for(int i = 0; i < number.size(); i++) {
if(number[i] < number[i+1]) {
number.erase(number.begin() + i);
break;
}
}
if(len == number.length()) {
number.pop_back();
}
}
return number;
}
📕Feeling(느낀 점)
문제를 풀 당시에 갖을 노력을 해도 풀리지 않는 문제가 있다.
(나의 경우)이런 문제는 경험상 오래 붙잡고 있는 것 보다는
덮어두고 하루정도 생각을 하거나, 그 다음날 문제를 보면
다른 풀이 방안이 생각난다.
학점이 크게 중요하지 않음을 알면서도
'지금껏 받아온 학점을 유지하고 싶다' 라는 생각의 실천 비용이 너무나 크다.
스트레스는 크지만, 그만큼 성장한다는 것을 위안삼아 정진하자.
📕Affirmation(자기 선언)
- 日日新又日新
- 순간에 최선을
📕여담
운동을 못 갔다, 아니 안 갔다.
운동 갈 시간에 조금이라도 공부를 더 하려고 했는데
이렇게 적게 할 거였으면 차라리 운동가는게 나을 뻔 했다.
내일은 아침에 운동가야지.
'TIL(Today I learned)' 카테고리의 다른 글
(TIL) 20210613 (0) | 2021.06.13 |
---|---|
(TIL) 20210612 (0) | 2021.06.12 |
(TIL) 20210609 (0) | 2021.06.09 |
(TIL) 20210608 (0) | 2021.06.08 |
(TIL) 20210607 (0) | 2021.06.07 |