Coding Test Study/Programmers

[Java] n번 숫자 세고 말하기

똑똑한망치 2024. 2. 25. 00:37
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