https://school.programmers.co.kr/learn/courses/30/lessons/12899

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

 

1, 2, 4의 3가지의 숫자로만 표현해야해서 3진수가 바로 생각이 났다. 

아-주 쉽게 풀겠구만 했는데 처음부터 오답만 나와서 살짝 당황했다. 

 

간단하게 10진수가 들어온다면 그 숫자를 3으로 나눈 나머지 값에 따라 변환하고

받은 정수를 3으로 계속 나눠가는 것이다. 

 

오답 노트 (5점 코드)

while(n > 0)
{
int temp = n % 3;
switch(temp)
{
case 1 :
answer += "1";
break;
case 2 :
answer += "2";
break;
case 0 :
answer += "4";
break;
}
n /= 3;
}

 

 

하나 하나 써보기 시작했다. 

알고리즘을 풀 때, 특히 점화식을 찾을 때는 하나 하나 써보는게 좋은거 같다. 

 

 

124의 나라는 3진수와 비슷하지만 0이 없다는 것이다. 

5점짜리 코드는 자리올림이 될 때에 대한 처리가 없었다. 

 

n / 3과 n % 3 을 했을 때 10진수 3은 123나라의 4가 되고 

10진수 4는 자리올림이 되어 11이 되어야 한다. 

 

저 오답 코드에서 3이 들어왔을 때 3을 3으로 나눈 값은 1이니 

다시한번 while문을 수행하게 되어 출력이 41으로 나온다. 

 

어떻게 하면 좋을까 생각을 하다 

3으로 나눠서 나머지가 없다면 -1을 하는 것이다. 

 

나머지가 없다 -> 자리올림 발생 -> 124나라는 0이 없으니 0자리가 생기지 않게 처리해버림 (쓱-싹)

그리고 바뀐 값을 reverse 해주면 된다.

1의 자리부터 변환되면서 string의 += 으로 끝자리에 붙이기 때문에 이걸 뒤집어주어야 한다.

 

정답 코드 (100점)

#include <string>
#include <algorithm>
using namespace std;
string solution(int n) {
string answer = "";
while(n > 0)
{
int temp = n % 3;
switch(temp)
{
case 1 :
answer += "1";
break;
case 2 :
answer += "2";
break;
case 0 :
answer += "4";
n -= 1;
break;
}
n /= 3;
}
reverse(answer.begin(), answer.end());
return answer;
}

 

'Algorithms' 카테고리의 다른 글

Programmers_Level3_기지국 설치  (2) 2024.06.07
Programmers_Level2_게임 맵 최단거리  (2) 2024.06.06
Programmers_Level2_피로도  (0) 2024.05.25
Programmers_Level3_등굣길  (0) 2024.05.22
Programmers_Level2_구명보트  (0) 2024.05.20
Rudolufoo