본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 1 : 3진법 뒤집기 C언어

by starfish22 2021. 11. 26.
728x90

▶문제 : 코딩 테스트 연습 - 3진법 뒤집기 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 3진법 뒤집기

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

programmers.co.kr

 

▶코드 작성(개선 코드 밑에 있음)

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

char str[101];
int len;

void func(int n) //3진법 뒤집어서 str 저장
{
    if (n / 3 >= 1) func(n / 3); //재귀함수를 먼저 호출
    str[len++] = n % 3 + '0'; //문자열에 숫자를 저장하기 위해 '0'을 더함
}

int solution(int n)
{
    int answer = 0;
    int i, j, res;

    func(n); //3진법 뒤집어서 저장하는 재귀함수 호출

    for (i = 0; i < len; i++)
    {
        res = 1;
        for (j = 0; j < i; j++) //3씩 곱함
        {
            res *= 3;
        }
        answer += (str[i] - '0') * res; //3진법으로 저장된 str[i]을 10진법으로 저장
    }

    return answer;
}

3진법으로 변환한 값을 문자열 str에 저장하는 부분을 제거해보면 어떤지 생각해서 다시 코드를 짜보았다.

 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int n)
{
    int answer = 0;
    int i, len = 0, res;

    for (i = n; i / 3 >= 1; i /= 3, len++);//3진법 자리수 구하기

    while (n >= 1)
    {
        res = 1;
        for (i = 0; i < len; i++)//3진법 자리수만큼 3을 곱해줌
        {
            res *= 3;
        }
        answer += (n % 3) * res;
        n /= 3;
        len--;//자리수 감소
    }
    return answer;
}

 

▶해석

for문을 이용해 3진수의 자릿수를 구하고 n값을 3으로 나눈 나머지 값에 그 자릿수에 맞게 3을 곱하여 값을 구한다. 사실 말로 설명하기가 힘들다. 못 알아듣는 것도 맞는 말이다.

728x90

댓글