코딩테스트 연습 - [3차] n진수 게임 | 프로그래머스 스쿨 (programmers.co.kr)
#include <string>
#include <vector>
#include <iostream>
using namespace std;
char list[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
string change(int num, int n)
{
string result = "";
while (num / n > 0)
{
string temp = result;
result = list[num % n];
result += temp;
num /= n;
}
string temp = result;
result = list[num % n];
result += temp;
return result;
}
string solution(int n, int t, int m, int p) {
string answer = "";
string str="";
for(int i =0; i <= t * m; i++)
str += change(i, n);
for(int i = 0; i < t; i++)
answer += str[m * i + p - 1];
return answer;
}
100퍼센트 내힘으로 푼건 아니지만...
그래도 얻는게 있었던 문제
10진수-> n진수로 변환을 하려면
원래 num에서 n을 계속 나누며 나눗셈을 더해야하는것은 알았다.
하지만 평범하게 구현을 한다면 무조건 거꾸로 출력이 될텐데...
라는 생각이었는데, 천재적인 방법이 있었다.
1 ) result라는 string값을 지정한 다음,
2 ) for문을 돌 때마다 temp라는 또다른 string을 만들어서 지금까지 만들어진 result를 넣어주고
3 )새로 우리가 넣어줄 값을 result로 할당해주면 result의 맨 앞에 위치하게 된다.
4) 이 result에 temp를 붙여주면, 그때그때 string이 새로 할당이 되면서 마치 앞쪽에다 새로운 값을 붙이는 것처럼 할 수 있다.
이것이 vector보다 list(string)이 나은점..이랄까(기술면접에서 틀렸던 문제)
이것만 해결했다면 쉽다.
그 다음부터는 그냥 한사람씩 말할 긴 string을 우리가 앞서 만든 change함수를 통해 계속 붙여주면서 완성시킨다.
그 후, 해당하는 인덱스의 string 값을 answer에 붙여주면 그것이 정답이다.
틀렸던 이유
for(int i =0; i <= t * m; i++)
str += change(i, n);
이를 하는 과정에서, for문을 몇번이나 돌려야 할지 몰라서 그냥 i <= 1000으로 잡았었는데 계쏙 오답이 뜨더라...
아마도 2진수로 했을 경우 문자열이 지나치게 길어지며 string이 제대로 할당되지 않는 것이 원인이었을 듯 싶다.
테스트케이스를 고려할때는 가장 극단적으로 작은 값 뿐만 아니라, 큰값을 넣을 때를 고려해보자.
(그리고 내가 출력했을 때도 너무 비정상적으로 긴 무언가가 출력됐을 때는.. 오류의 원인이 시간초과나 그런것이 됐을 가능성도 있음.)
'알고리즘 공부(C++)' 카테고리의 다른 글
[C++] 백준 2606 <바이러스> (0) | 2023.08.20 |
---|---|
[C++]프로그래머스 개인정보 수집 유효기간 (0) | 2023.08.20 |
[C++]프로그래머스 징검다리 건너기(이진탐색) (0) | 2023.08.03 |
[C++]백준 1072 게임 (이진탐색) (0) | 2023.08.02 |
[C++]프로그래머스 주식가격(스택) (0) | 2023.07.27 |