자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
n은 1 이상 100,000,000 이하인 자연수입니다.
| n | result |
|---|---|
| 45 | 7 |
| 125 | 229 |
입출력 예 #1
답을 도출하는 과정은 다음과 같습니다.
| n (10진법) | n (3진법) | 앞뒤 반전(3진법) | 10진법으로 표현 |
|---|---|---|---|
| 45 | 1200 | 0021 | 7 |
따라서 7을 return 해야 합니다.
입출력 예 #2
답을 도출하는 과정은 다음과 같습니다.
| n (10진법) | n (3진법) | 앞뒤 반전(3진법) | 10진법으로 표현 |
|---|---|---|---|
| 125 | 11122 | 22111 | 229 |
따라서 229를 return 해야 합니다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int n) {
int answer = 0;
int num = 0;
while(n>0){
num = num*10;
num = num + (n%3);
n = n/3;
}
int i = 1;
while(num>0){
answer = answer + (num%10)*i;
i = i*3;
num = num/10;
}
return answer;
}
위에 작성한 코드는 일부의 예제에서는 수행되지만 일부 예제에서는 다른 결과값이 나와 실패한 코드이다. 정답률이 60%가 나왔다. 다른 알고리즘이 생각날 듯 하면서도 생각이 안나서 다른 사람들의 코드를 참조하였다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int n)
{
int answer = 0;
int i, len = 0, res;
//3진수로 변경했을 때의
for (i = n; i / 3 >= 1; i /= 3, len++);
while (n >= 1)
{
res = 1;
for (i = 0; i < len; i++)
{
res *= 3;
}
answer += (n % 3) * res;
n /= 3;
len--;
}
return answer;
}
참조한 코드를 올려준 링크는 아래에 첨부하였다.
https://starfish22.tistory.com/31
이 코드를 살펴보니 3진수로 바꾸는 것과 10진수로 바꾸는 과정을 따로 진행한 것이 아니라 한꺼번에 진행했음을 알 수 있었다.
위의 코드를 참조하여 내가 보기 쉽게 변경하였다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int n)
{
int answer = 0;
int len = 0;
int exp;
int num = n;
while(num/3 > 0){ //중요
num = num/3;
len++;
}
while(n>0)
{
exp = 1;
for (int i = 0; i < len; i++)
{
exp = exp*3;
}
answer = answer + (n % 3)*exp;
n = n / 3;
len--;
}
return answer;
}
첫 번째 while문에서 수행조건을 처음에는 num>0으로 지정하였더니 오류가 생겼다. 그래서 num/3으로 변경하였더니 오류가 발생하지 않고 잘 수행되었다. 조건을 잘 지정하는 것도 중요한 것 같다.