문제 출처: https://programmers.co.kr/learn/courses/30/lessons/12899
Lv 2
규칙을 찾으면 된다.
대충 이런 규칙을 찾을 수 있게 된다. 3개씩 분류한 이유는 숫자가 1,2,4 3개이기 때문에 숫자 3개가 끝나면 일의 자리 숫자가 다시 1로 돌아오기 때문이다. 이런 특이점에서 숫자 n을 3으로 나누어서 어떻게 하는 규칙이 있겠구나!를 알아차릴 수 있다.
우측에 써놓은 회색 숫자는 이미 10진법을 3으로 나눈 몫이고 몫에서 또 몫과 나머지로 이어지게 된다. 이렇게 계속 하다보면 몫으로 나온 1,2,0은 일의자리 숫자와 관계 있다고 추리할 수 있다.
주의할 점
3마다 나뉘었지만 그 나눌 타이밍에 3으로 나누어 떨어지는 값 처리를 해줘야한다.
몫이 1이 나오기 때문에 3 -> 4로 나오지 않고 3->14로 나오기 때문이다.
그래서 3으로 나누고 3으로 나누어 떨어진 n만 n--; 처리를 해줬다.
#include <string>
#include <vector>
using namespace std;
string return124Num(int n) {
string res = "";
while (n > 0) {
int idx = n % 3;
n /= 3;
if (idx == 0) {
res = "4" + res;
n--;
}else{
res = to_string(idx) + res;
}
}
return res;
}
string solution(int n) {
string answer = "";
answer = return124Num(n);
return answer;
}
처음에는 아래와 같이 짰다.
int num[3] = { 4,1,2 };
int return124Num(int n) {
int res = 0;
while (n > 0) {
int idx = n % 3;
res = (res * 10) + num[idx];
n /= 3;
if (idx == 0) n--;
}
return res;
}
string solution(int n) {
string answer = "";
int res = return124Num(n);
answer = to_string(res);
reverse(answer.begin(), answer.end());
return answer;
}
그러나 정확성 테케 12,13,14 에서 틀리고 효율성 테스트에서 0점이 나왔다. 아마 int로 받고 string으로 변환하는데 여기서 또 다시 reverse 하는 과정에서 오류가 생기거나 시간 초과가 나는 거 같다고 추측했다.
하지만 string으로 받자고 생각하니 res += var; 만을 생각한 난 아무리 생각해도 push_back이 됐다. 다른 분의 코드를 참고해서 res = var + res;로 해도 된다는 걸ㅋㅋ 깨달았고.. 멍청이 됐다.. 그리고 if else로 나누어 var을 지정해서 넣었다. 이것도 char num[3] = {'4','1','2'}
해서 풀어도 될듯하다.