mojo's Blog

124 나라의 숫자 본문

프로그래머스/Level 2

124 나라의 숫자

_mojo_ 2021. 9. 7. 00:29

문제 링크 => 코딩테스트 연습 - 124 나라의 숫자 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr


구현 문제이다.

 

124 나라에서는 숫자 1, 2, 3, 4, ... 를 다음과 같이 표기한다.

 

1 => 1   /   2 => 2   /   3 => 4

4 => 11   /   5 => 12   /   6 => 14

7 => 21   /   8 => 22   /   9 => 24

10 => 41   /   11 => 42   /   12 => 44

...

 

124 나라의 숫자를 분석해보면 다음과 같은 규칙성을 가지고 있다.

 

예를 들어서 12421 를 살펴보도록 한다.

 

12421 = 1 * 3^4 + 2 * 3^3 + 3 * 3^2 + 2 * 3 + 1

 

여기서 1, 3, 3^2, ... , 3^(m-1), ... 이런식으로 계수에 곱해지면서 더하는 형태인데 계수가 1, 2 일때 그대로 곱하고 4 일때 3을 곱한다.

 

그렇다면 124 나라의 숫자를 구하는 방법은 다음과 같은 규칙을 가지고 어떻게 구할까?

 

먼저 변수 sum, x 를 설정하고 sum = 1 + 3 + 3^2 + ... + 3^m , x = 3^m 를 만족하는 m 이 있다고 한다.

 

sum <= n  && n < (sum + 3^m * 3)  두 조건을 동시에 만족하는 m 을 발견할 경우 n 값이 0 이 될 때까지  다음과 같은 반복문을 돌린다.

 

그 전에 다음과 같은 예시를 살펴보도록 한다.

 

142 를 예로 들면, 142 = 3^2 + 3 * 3 + 2 = 20 이다.

 

여기서 sum = 13, x = 9 인데 (20 - 13) >= (1 - 1) * x && (20 - 13) < 1 * x 를 만족하는 것을 확인할 수 있다.

 

일반화 하자면 tmp = n - sum 이라고 할 때 tmp >= (i - 1) * x && tmp < i * x  ( i = 1, 2, 3 ) 인 경우 i 에 대하여 124 숫자를 구할 수 있음을 알 수 있다.

 

이러한 규칙성을 가지고 코드를 작성하면 다음과 같다.

 

풀이 Code

 

#include <string>
#include <vector>

using namespace std;

string solution(int n) {
	string answer = "";
	int sum = 0, x = 0;
	for (int i = 1; i <= 500000000; i *= 3) {
		sum += i;
		if (sum <= n && n < (sum + i * 3)) {
			x = i;
			break;
		}
	}
	
	while (n) {
		int op = 0;
		for (int i = 1; i <= 3; i++) {
			int tmp = n - sum;
			if (tmp >= (i - 1) * x && tmp < i * x) {
				op = i;
				break;
			}
		}

		if (op == 1) answer += "1";
		else if (op == 2) answer += "2";
		else answer += "4";

		sum -= x;
		n -= x * op;
		x /= 3;
	}

	return answer;
}

 

 

 

'프로그래머스 > Level 2' 카테고리의 다른 글

H-Index  (0) 2021.09.07
위장  (0) 2021.09.07
소수 찾기  (0) 2021.09.06
문자열 압축  (0) 2021.09.05
더 맵게  (0) 2021.09.05
Comments