https://programmers.co.kr/learn/courses/30/lessons/12899
코딩테스트 연습 - 124 나라의 숫자
programmers.co.kr
프로그래머스 Lv2 문제이며, 카테고리를 묶자면 시뮬레이션 문제로 보인다.
문제를 요약하자면, n 값을 입력받아서 124 나라의 숫자 문법에 맞게 문자열을 출력하는 문제이다.
예를 들어, 1 -> 1, 2 -> 2, 3 -> 4, 4 -> 11, 5 -> 12, 6 -> 14, 7 -> 21 ... 13 -> 111 ... 39 -> 444 순으로 이어지는 문법에서 특정 n 값을 넣었을 때 값을 출력해야 한다.
문제를 해결하기 위해서 자리수를 구분하기 위한 배열을 생성한다.
| 인덱스 | 숫자 |
| 0 | 3 |
| 1 | 12 (+9) |
| 2 | 39 (+27) |
| 3 | 120 (+81) |
| 4 | 363 (+243) |
위에 표를 보면, 3^(인덱스+1) 만큼 값이 더해지는 것을 확인할 수 있다.
예를 들어 10 을 입력 받으면 어떻게 처리해야 할까??
10 은 우선 3 과 12 사이에 있기 때문에 구간 별 차이 값과 10과 3의 차이를 구한다음 범위에 따라 1, 2, 4 중 선택해서 문자열에 추가하는 방식으로 구현하고, 잔여 숫자를 이에 맞춰 빼는 방식으로 구현하면 된다.
구간 값 차이 : 9
10 - 3 차이 : 7
여기서, 7 은 6 보다 크고 9 보다 작거나 같기 때문에 해당 인덱스에 맞는 숫자는 4 이다.
여기서 해야 될것은 10 에서 구간 값 차이인 9를 뺀다. 그럼 1이 남고 1은 그대로 추가하면 된다.
(여기서 유의할 것으로 3이 마지막에 남은 경우, 4를 추가해야 한다)
테스트를 통과한 코드는 아래와 같다.
import java.util.*;
class Solution {
public static String solution(int n) {
String answer = "";
// n이 3이하이면 미리 예외처리한다.
if (n <= 3) {
if (n % 3 == 1) return "1";
if (n % 3 == 2) return "2";
if (n % 3 == 0) return "4";
}
List<Integer> list = new ArrayList<>();
list.add(3);
int base = 3;
// n 보다 작거나 같을 때 까지 기준표를 만든다.
while (list.get(list.size()-1) < n) {
int last = list.get(list.size()-1);
list.add(last + base * 3);
base *= 3;
}
// remain 의 초기값으로 n 을 설정하고, 아래 루프를 돌면서 문자열을 만든다.
int remain = n;
for (int i = list.size()-1; i > 0; i--) {
int diff = list.get(i) - list.get(i-1);
int curDiff = remain - list.get(i-1);
if (curDiff > 0 && curDiff <= diff / 3) {
answer += "1";
remain -= diff / 3;
} else if (curDiff > diff / 3 && curDiff <= diff * 2 / 3) {
answer += "2";
remain -= diff * 2 / 3;
} else {
answer += "4";
remain -= diff;
}
}
// 마지막에 남은 숫자를 문자열 끝에 추가해야 한다
if (remain % 3 == 1) answer += "1";
if (remain % 3 == 2) answer += "2";
if (remain % 3 == 0) answer += "4";
return answer;
}
}'코딩테스트' 카테고리의 다른 글
| [프로그래머스] 거리두기 확인하기 (0) | 2022.05.30 |
|---|---|
| [프로그래머스] 예상 대진표 (0) | 2022.05.29 |
| [프로그래머스] [1차] 뉴스 클러스터링 (0) | 2022.05.08 |
| [프로그래머스] 징검다리 (0) | 2022.05.08 |
| [프로그래머스] 단속 카메라 (0) | 2022.05.08 |