컴퓨터 공학/백준

[백준] JAVA 자바 : 30 (10610번)

kim-dev 2024. 3. 14. 16:13
반응형


입력받은 수가 30의 배수라면, 그 수의 자릿수 조합으로 만들 수 있는 최댓값을 출력하는 문제이다.

 

나는 처음에 N이 최대 10^5개의 숫자로 구성된다는 말이, N의 최댓값이 100,000이라는 줄 알아서 그냥 int로 결과값을 만들었는데 계속 틀려서... 질문 게시판을 보니까 이게 자릿수 최댓값이 10만 개라는 뜻이었다...

그래서 결과값을 StringBuilder으로 처리해 줬다... 근데 시간이 꽤 오래 걸리는 이슈...ㅋㅋ

 

난 어떻게 풀었냐면, N의 모든 자릿수를 돌면서 sum에 더해준다. 그 과정에서 0의 개수도 체크해 준다.

그리고 조회한 자릿수는 우선순위 큐에 내림차순으로 넣어 준다.
다 돌고 난 후 sum이 3의 배수이면서 0이 하나 이상 있다면, 그건 30의 배수이므로 우선순위 큐에서 하나씩 빼서 StringBuilder에 append한 값을 출력해주면 된다.

 

import java.lang.StringBuilder;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.PriorityQueue;
import java.util.Collections;

public class Thirty {

    public static int stoi(String str) {
        return Integer.parseInt(str);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PriorityQueue<Character> pQ = new PriorityQueue<>(Collections.reverseOrder()); // 내림차순으로 우선순위 큐
        
        String N = br.readLine();
        
        long sum=0;
        long isZero = 0;
        for (int i=0; i<N.length(); i++) {
          char tmp = N.charAt(i);
          pQ.offer(tmp);
          
          int tmpInt = tmp - '0';
          if (tmpInt == 0) {
            isZero++;
          }
            sum += tmpInt;
        }
        
        if (sum != 0 && sum%3 == 0 && isZero > 0) { // 30의 배수라면
          StringBuilder result = new StringBuilder();
          long size = pQ.size();
          for (long i=0; i<size; i++) {
            result.append(pQ.poll());
          }
          
          System.out.println(result);
        } else { // 30의 배수가 아니라면 -1을 출력
          System.out.println(-1);
        }
        
        br.close();
    }
}

 

 

로그인

 

www.acmicpc.net