728x90
반응형
1. 문제
'n번 숫자 세고 말하기' 프로그램을 구현해야 한다.
n번 숫자 세고 말하기는, '숫자 세고 말하기'를 총 n번 반복하는 프로그램으로, '숫자 세고 말하기'는 아래와 같이 정의한다.
- 입력된 숫자의 각 자릿수를 보고 어떤 숫자가 몇개씩 있는지 센다.
- 작은 숫자부터 순서대로 해당 숫자와 갯수를 나열하여 숫자를 만든다.
예를 들어, 입력인 숫자 num이 15223인 경우 1이 1개, 2가 2개, 3이 1개, 5가 1개이므로, 그 출력ㅇ느 11223151이 된다.
숫자 세고 말하기를 반복하게 될 경우 마지막 출력을 입력으로 한다.
즉, 입력이 15223이고, '2번 세고 말하기'를 할 경우
15223 -> 11223151 -> 14223151
위 과정을 거쳐 최종 출력은 14223151 이 된다.
단, 숫자가 너무 커질 수 있으므로 최종 출력은 10004로 나눈 나머지를 반환하시오.
또한 자릿수에 0이 있어 이를 카운트해야 하는 경우, 리딩제로(숫자 맨 앞에 추가로 붙는 0)을 허용하여 이를 표현하시오.
2. 입력 설명
- 1 <= n <= 10000
- 1 < num <= 1000000
3. 출력 설명
위 프로그램의 결과를 정수로 출력
4. 매개변수 형식
n = 3
num = 54223
5. 반환값 형식
5451
6. 입출력 예시 설명
아래 과정을 거쳐 위와 같은 출력이 된다.
54223 -> 22314151 -> 1322314151 -> 1422324151 % 10004 = 5451
7. 코드 구현
import java.math.BigInteger;
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public int solution(int n, int num) {
if(n == 0) {
return num;
}
// 문자열로 변환해서 각 자릿수에 접근
String numString = String.valueOf(num);
for(int i = 0; i < n; i++) {
// Set을 이용하여 중복된 문자 제거
Set<Integer> numSet = new HashSet<>();
for (char c : numString.toCharArray()) {
numSet.add(Character.getNumericValue(c));
}
// Set -> List 로 변환하여 오름차순 정렬
List<Integer> numList = numSet.stream().sorted().collect(Collectors.toList());
// 숫자-갯수 형식으로 재조립
StringBuilder sb = new StringBuilder();
for(int j : numList) {
long c = numString.chars().filter(ch -> ch == (char)(j + '0')).count();
sb.appedn(j);
sb.append(c);
}
numString = sb.toString();
}
// n 번 변형한 출력을 10004로 나눈 후 정수로 변환
// 숫자가 매우 크면 int로 변환 시 값이 변할 수 있으므로 BigInteger 사용
BigInteger bigInteger = new BigInteger(numString);
return bigInteger.mod(new BigInteger("10004")).intValue();
}
}반응형
'Coding Test Study > Programmers' 카테고리의 다른 글
| [Java] 이어 붙인 문자열 (1) | 2024.02.25 |
|---|---|
| [Java] 사전식 배열 (1) | 2024.02.25 |
| [Java] 네비게이션 테스트 - 최단 거리 (1) | 2024.02.18 |
| [Java] 동적계획법 - 점프 ! (0) | 2024.02.18 |
| [Java] 거꾸로 BFS (0) | 2024.02.18 |