안녕하세요!

FE 개발자 유진주입니다.

Language/JAVA

백준 10610번(Java)

ypearl 2023. 8. 11. 01:10

10610번: 30 (acmicpc.net)

 

10610번: 30

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한

www.acmicpc.net

 

<어려웠던 부분>

- 접근했던 방식

처음에는 while문으로 입력받은 int형의 n을 숫자 하나씩 num 배열에 저장한 후,

내림차순 정렬로 정렬해 마지막 원소가 0인지, 그리고  원소의 합(sum)이 3의 배수인지

이 두 가지 조건에 모두 만족하는지를 확인한 후 배열의 원소를 순서대로 출력하고자 하였다.

 

- 문제점1 : 내림차순 정렬

접근 방법은 맞는 것 같지만, 크나큰 문제가 있었다.

우선, 위의 방법으로 시도했을 때에 내림차순 정렬에서 고뇌를 겪었다.

왜냐하면 일반적인 오름차순은 Arrays.sort(배열)을 이용하면 되지만,

내림차순의 경우, sort()의 인자에 추가로 Collections.reverseOrder()를 전달해야 한다.

  • Collections.reverseOrder()

그런데 이 내림차순 정렬이 계속해서 문제가 있었다...

알고보니 배열이 int형으로 선언되었기에,

이를 integer 형의 배열로 옮겨주어야 했다.

(int형은 Collections.reverseOrder()가 적용되지 않기에)

 

p.s. 사실 아직까지도 int형과 integer형의 차이가 무엇인지 명확하게 모르겠다.

나는 당연히 int == integer인줄 알았는데... 둘이 다른 것인가보다.

 

- 문제점2 : 큰 정수(n) 범위

위의 첫번째 문제가 해결되고 나니 다 풀렸다고 생각했으나

(예제들이 모두 올바른 출력으로 나왔기에)

'N는 최대 10^5개의 숫자로 구성되어 있으며'라는 문제의 조건에 의해

계속해서 InputMismatch 오류가 발생했다.

10^5개의 숫자라 함은 n의 값이 최대 100000임을 의미하는 것이 아니었다.

배열 생성에서는 int[100000]으로 값을 주면 되지만,

n을 입력받을 때에는 int나 long으로는 감당하지 못할 숫자들이 나오게 된다.

이 조건을 제대로 인지하지 못해 처음 n을 입력받는 데에서 오류가 발생하는 것이었다.

 

ㄴ 해결방법: int형이 아닌, 문자열(String)으로 입력받아 char의 형태로 쪼개 저장하기

* 이를 Array.sort로 정렬하고(오름차순),

for문을 거꾸로 돌려 숫자의 형태로(charArr[i]-'0') 새로운 num 배열에 저장한다.

 

 

느낀 점

- 정수라고해서 무조건 int나 long으로만 접근할 것이 아니라,

  제시된 조건에 따라 String(char)로도 풀이할 수 있다는 것을 알게 되었다.

- 그리고 오름차순, 내림차순 정렬 방법에 대해 배울 수 있었다.

 

 

import java.util.Scanner;
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		
		String str;
		int sum=0, k=0;
		int[] num=new int[100000];
		
		str=sc.nextLine();
		
		char[] charArr=str.toCharArray();
		int len=charArr.length;
		Arrays.sort(charArr);
		if (charArr[0]=='0') {
			k=1;
		}
		
		int t=0;
		for(int i=charArr.length-1; i>=0; i--) {
			num[t] = charArr[i]-'0';
			sum+=num[t];
			t++;
		}
		
		if ((k==1)&&(sum%3==0)) {	//true
			for(int i=0; i<len; i++) {
				System.out.print(num[i]);
			}
		}
		
		else {	//false
			System.out.println(-1);
		}
		
	}

}

 

결과적으로, 많은 시도 끝에 성공!