[프로그래머스 / JAVA] Level 2 124 나라의 숫자 (12899)

⏰ 2021-12-27 (월) 01:42:47

screener
시리즈 모아보기
프로그래머스

70 / 78

Table of Contents

  • 1. 124 나라의 숫자






124 나라의 숫자

랭크사용 언어
Level 2
JAVA

🔗 🔗 124 나라의 숫자

문제 설명

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

  • 124 나라에는 자연수만 존재합니다.
  • 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

10진법124 나라10진법124 나라
11614
22721
34822
411924
5121041

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

제한사항

  • n은 500,000,000이하의 자연수 입니다.

입출력 예

nresult
11
22
34
411

풀이

124 나라라는 이상한 나라가 있다.

국제적으로 통용되는 10진법을 쓰지 않고, 굳이 124 법칙이라는 이상한 진법을 고수하여 당신을 피곤하게 만들고 있다.

이 124 진법을 해석하는 알고리즘을 구성하여 만성 피로에서 벗어나보자.


규칙 자체는 별거 없다. [ 1, 2, 4 ] 순으로 번갈아가며 숫자가 표기된다.

10진법124 나라
11
22
34
411
512
614
721
822
924
1041
1142
1244
13111
14112
15114

대충 이런 식으로 전개된다. 끝에 3이 아닌 4가 껴버리는 바람에 살짝 헷갈릴 수 있다.

규칙적인 데이터을 가지고 있으므로, 이를 통해 패턴을 유추해보자.

숫자 3개로 표현되니, 3진법을 만드는 방식과 매우 유사할 것이다.


MOD 연산을 통해 124 진법으로 변환할 수 있다.

  1. n % 3 연산을 수행하여 나머지를 구한다.
  2. n / 3 연산을 수행하여 n에 할당한다.
    1. 만약 n % 3 == 0일 경우 할당된 n에서 1을 뺀다.
  3. n = 0일 때까지 위 과정을 반복한다.

n = 5일 경우, 아래와 같다.

  1. 5 % 3 연산을 수행하여 나머지 2를 구한다.
    1. 124의 두 번째 숫자는 2이므로, 첫 번째 자리는 2가 된다.
  2. 5 / 3 연산을 수행하여 n을 1로 할당한다.
  3. 1 % 3 연산을 수행하여 나머지 1을 구한다.
    1. 124의 첫 번째 숫자는 1이므로, 두 번째 자리는 1이 된다.
  4. 1 / 3 연산을 수행하여 n을 0으로 할당한다.
  5. n = 0이므로 종료한다. 5는 124 진법으로 12가 된다.

그러나 n % 3 == 0일 경우 특이한 조건이 붙는데, 이는 3의 배수를 직접 연산해보면 알 수 있다.

  1. 6 % 3 연산을 수행하여 나머지 0을 구한다.
    1. 124의 0 번째 숫자는 4이므로, 첫 번째 자리는 4가 된다.
  2. 6 / 3 연산을 수행하여 n을 2로 할당한다.
  3. 2 % 3 연산을 수행하여 나머지 2을 구한다.
    1. 124의 두 번째 숫자는 2이므로, 두 번째 자리는 2가 된다.
  4. 2 / 3 연산을 수행하여 n을 0으로 할당한다.
  5. n = 0이므로 종료한다. 6은 124 진법으로 24가 된다...?

계산에 의하면 24가 되는데, 실제로는 14다. 3의 배수일 경우, 자릿수가 하나 올라가기 때문에, n을 하나 빼서 이를 보정해줘야 한다.

코드

JAVA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.ArrayList;
import java.util.Collections;

/**
 * 124 나라의 숫자 클래스
 *
 * @author RWB
 * @since 2021.12.27 Mon 00:36:19
 */
class Solution
{
	private static final String[] DIGIT = { "4", "1", "2" };
	
	/**
	 * 해답 반환 메서드
	 *
	 * @param n: [int] 자연수
	 *
	 * @return [String] 해답
	 */
	public String solution(int n)
	{
		ArrayList<String> list = new ArrayList<>();
		
		while (n != 0)
		{
			int index = n % 3;
			
			n /= 3;
			
			// 인덱스가 0일 경우
			if (index == 0)
			{
				n--;
			}
			
			list.add(DIGIT[index]);
		}
		
		Collections.reverse(list);
		
		return list.stream().reduce(String::concat).isPresent() ? list.stream().reduce(String::concat).get() : "";
	}
}

🏷️ 태그
# 프로그래머스
# 알고리즘
# JAVA(자바)
# Level 2

읽어주셔서 고마워요!

도움이 되셨다면, 공감이나 댓글을 달아주시는 건 어떤가요?

블로그 운영에 큰 힘이 됩니다.

https://hits.seeyoufarm.com/api/count/incr/badge.svg?count_bg=%23484848&icon=react.svg&icon_color=dodgerblue&title=view&title_bg=%23242424&url=https%3A%2F%2Fblog.itcode.dev%2Fposts%2F2021%2F12%2F27%2Fprogrammers-a0070