[C언어]3진법 뒤집기

tnrms08·2022년 6월 28일

프로그래머스

목록 보기
11/21

문제 설명

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항

n은 1 이상 100,000,000 이하인 자연수입니다.

입출력 예

nresult
457
125229

입출력 예 설명

입출력 예 #1

답을 도출하는 과정은 다음과 같습니다.

n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
45120000217

따라서 7을 return 해야 합니다.

입출력 예 #2

답을 도출하는 과정은 다음과 같습니다.

n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
1251112222111229

따라서 229를 return 해야 합니다.


풀이 코드

원래 작성한 코드(해결 X)

#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으로 변경하였더니 오류가 발생하지 않고 잘 수행되었다. 조건을 잘 지정하는 것도 중요한 것 같다.

0개의 댓글