난이도: Level 2
문제 링크: https://programmers.co.kr/learn/courses/30/lessons/12899
코딩테스트 연습 - 124 나라의 숫자
programmers.co.kr
10진수 입력값을 '124 숫자'로 바꾸어 출력하는 문제입니다.
124 숫자는 모든 값을 '1', '2', '4'를 이용해 나타냅니다.
문제에서 주어진 예시를 확장해 보면 아래와 같습니다.
10진수 | 124 숫자 | 10진수 | 124 숫자 | 10진수 | 124 숫자 |
1 | 1 | 6 | 14 | 11 | 42 |
2 | 2 | 7 | 21 | 12 | 44 |
3 | 4 | 8 | 22 | 13 | 111 |
4 | 11 | 9 | 24 | 14 | 112 |
5 | 12 | 10 | 41 | 15 | 114 |
접근한 방법
숫자 3개를 이용하여 값을 나타낸다고 하면, 바로 떠오르는 것이 '3진법' 입니다.
2진법이 0, 1 두 개의 숫자를 이용해 모든 값을 표현하듯, 3진법은 0, 1, 2를 이용해 모든 값을 표현합니다.
그러면 10진수를 3진법으로 표현해 볼까요?
10진수 | 3진법 | 10진수 | 3진법 | 10진수 | 3진법 |
1 | 1 | 6 | 20 | 11 | 102 |
2 | 2 | 7 | 21 | 12 | 110 |
3 | 10 | 8 | 22 | 13 | 111 |
4 | 11 | 9 | 100 | 14 | 112 |
5 | 12 | 10 | 101 | 15 | 120 |
보시는 바와 같이 몇몇 값은 겹치지만, 겹치지 않는 값이 존재합니다.
이번에는 124 숫자와 3진법 값을 비교해 보겠습니다.
124 숫자 | 3진법 | 124 숫자 | 3진법 | 124 숫자 | 3진법 |
1 | 1 | 14 | 20 | 42 | 102 |
2 | 2 | 21 | 21 | 44 | 110 |
4 | 10 | 22 | 22 | 111 | 111 |
11 | 11 | 24 | 100 | 112 | 112 |
12 | 12 | 41 | 101 | 114 | 120 |
두 경우가 일치하지 않는 경우는 언제일까요?
우선, 각각 사용하지 않는 숫자가 있습니다. 124 숫자는 0, 3진법은 4를 사용하지 않습니다.
그렇다고 단순히 숫자를 치환해서는 해결될 문제가 아닙니다.
3진법은 0에서부터 세기 시작합니다. 즉 0, 1, 2의 다음 순서는 10으로, 두 자리 수가 됩니다.
반면 124 숫자는 1에서부터 세기 시작합니다. 3진법의 10에 해당하는 값은 124 숫자에서는 아직 한 자리 수입니다.
이것을 감안하여 구현해 주면 됩니다.
기본적인 구현 방법은 n진수 계산법과 유사합니다.
코드 링크: GitHub
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string decimal_to_124 (int n) {
string answer = "";
// 숫자가 3 이상일 동안 반복
while(n >= 3) {
int remaining = n % 3;
// 나머지가 0일 경우, 값을 4로 대체하고, n값을 하나 줄임
if (remaining == 0) {
answer = '4' + answer;
n = (n/3) - 1;
}
else {
answer = to_string(remaining) + answer;
n /= 3;
}
}
answer = to_string(n) + answer;
// 맨 앞에 0이 있을 경우 제거
if (answer[0] == '0') return answer.substr(1);
else return answer;
}
string solution(int n) {
string answer = decimal_to_124(n);
return answer;
}
이 문제는 정확성 테스트는 물론, 효율성 테스트까지 있기 때문에 시간복잡도를 고려해서 코드를 작성해야 합니다.
입력받는 수 n은 최대 500,000,000의 값을 가지므로, 제가 작성한 코드에서는 최대 18번 while문이 돌게 됩니다.
아마 3진법으로 계산하고 이를 후처리 하는 방식으로 구현하면 시간복잡도에서 걸리지 않을까... 하는 예상을 해 봅니다.
'알고리즘, 문제해결 > 알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 메뉴 리뉴얼 (0) | 2022.03.18 |
---|---|
[프로그래머스] 짝지어 제거하기 (0) | 2022.03.17 |
[프로그래머스] 카카오프렌즈 컬러링북 (0) | 2022.03.11 |
[프로그래머스] 단체사진 찍기 (0) | 2022.03.10 |
[백준 4179번] 불! (0) | 2022.01.23 |
댓글