[백준] 16496 - 큰 수 만들기 (JAVA)

개츠비·2023년 3월 27일
0

백준

목록 보기
45/84
  1. 소요시간 : 15분
  2. 문제 사이트 : 백준
  3. 문제 수준 : 플레티넘 5
  4. 문제 유형 : 그리디 알고리즘, 정렬
  5. 다른 사람의 풀이를 참고 했는가 ? : X
  6. 한 번 풀었다가 다시 푸는 문제인가 ? : X
  7. 문제 링크 : https://www.acmicpc.net/problem/16496
  8. 푼 날짜 : 2023.03.27

1. 사용한 자료구조 & 알고리즘

그리디 알고리즘, 정렬을 사용했다.

2. 사고과정

수를 어떻게 합쳐야 하나 생각해봤을 때
무조건 큰 순서대로 정렬하면 안된다.
그 예로 90과 9가 있을 때 909, 990 중 990이 더 크다.

그렇다면 어떻게 비교해야 하냐면
바로 990, 909 를 직접비교하는 것이다.
둘을 직접 비교하여서 더 큰 값을 앞쪽에, 더 작은 값을 뒤쪽에 배치하면 문제를 해결할 수 있다.

3. 풀이과정

  1. 앞서 말한 9와 90이 있을 때 909와 990을 직접 비교하여 순서를 배치한다. 이때 int 가 아닌 String 으로 입력을 받는다.
  2. 예외처리 해야할 게 하나 있다. 입력으로 00000이 들어왔을 때 00000이 아닌 0을 출력해야 한다. 그래서 마지막으로 최종적으로 출력하기 전 합친 숫자 중 0이 아닌 숫자가 있는지 체크한다.
    하나라도 있다면 boolean 형의 find 가 true 가 된다.
  3. find가 true 면 합친 숫자를, find가 false 면 그냥 "0"을 출력한다.

4. 소스코드

import java.io.*;
import java.util.*;


public class Main {

	static StringBuilder sb=new StringBuilder();
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		int n=Integer.parseInt(br.readLine());
		String arr[]=new String[n];
		st=new StringTokenizer(br.readLine());

		for(int i=0;i<arr.length;i++) 
			arr[i]=st.nextToken();

		Arrays.sort(arr,new Comparator<>() {
			@Override
			public int compare(String n1,String n2) {
				return (n2+n1).compareTo(n1+n2);
			}
		});
		
		for(int i=0;i<arr.length;i++)
			sb.append(arr[i]);

		boolean find=false;
		for(int i=0;i<sb.toString().length();i++) 
			if(sb.toString().charAt(i)!='0')  find=true;
		
		
		if(find)
			System.out.println(sb);
		else
			System.out.println("0");



	}
}

5. 결과

처음에 00000이 입력일 때 0을 출력하는 예외를 처리하지 못해서 한 번 틀렸다.

문제를 다시 읽으면서 반례나 예외가 뭘지 생각했다.

6. 회고

한줄 평: 이게 왜 플레 문제인가요?
어제 골드 문제에서 눈물의 똥꼬쇼 하다가
처음 푸는 플레 문제를 너무 허무하게 맞혀서 좀 기분이 이상하다.

하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212

profile
아이스 카라멜 마끼아또보단 뜨거운 아메리카노를, 맨투맨보단 니트를, 웹툰보단 책을 좋아하고 싶은 사람

0개의 댓글