코린이의 소소한 공부노트

[백준 온라인 저지] 1431. 시리얼 번호 본문

코딩테스트 풀이/JAVA

[백준 온라인 저지] 1431. 시리얼 번호

무지맘 2023. 5. 24. 20:17

1. 입력

- 첫째 줄에 기타의 개수 N이 주어진다. N50보다 작거나 같다.

- 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어져 있다. 시리얼 번호는 중복되지 않는다.

 

2. 출력

- 첫째 줄부터 차례대로 N개의 줄에 한줄에 하나씩 다음 조건에 따라 시리얼 번호를 정렬한 결과를 출력한다.

// 시리얼번호 A가 시리얼번호 B의 앞에 오는 경우는 다음과 같다.

  - AB의 길이가 다르면, 짧은 것이 먼저 온다.

  - 만약 서로 길이가 같다면, A의 모든 자리수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저온다. (숫자인 것만 더한다)

  - 만약 1,2번 둘 조건으로도 비교할 수 없으면, 사전순으로 비교한다. 숫자가 알파벳보다 사전순으로 작다.

 

3. 예제

 

4. 코드

import java.util.*;
import java.io.*;
class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.valueOf(br.readLine());
        String[] word = new String[n];
        for(int i=0 ; i<n ; i++)
        	word[i] = br.readLine();
        String temp;
        for(int i=0 ; i<word.length-1 ; i++) {
        	int j = i; // 정렬하고자 하는 요소의 위치. i-1번째 까지는 정렬이 된 상태
        	while(j>=0 && compare(word[j],word[j+1])) { // i번째 요소의 적절한 위치를 찾아간다.
        		   temp = word[j];
        		   word[j] = word[j+1];
        		   word[j+1] = temp; j--; // 적절한 위치를 찾을 때까지 인덱스를 감소시킨다. 
        	}
        }
        for(int i=0 ; i<n ; i++)
        	bw.write(word[i]+"\n");
        bw.flush(); bw.close();
    }
    
    static boolean compare(String s1, String s2) { // true: 더 뒤로 가야하는 단어
    	if(s1.length()==s2.length()) {
    		int sum1 = 0, sum2 = 0;
    		for(int i=0 ; i<s1.length(); i++) {
    			char c1 = s1.charAt(i), c2 = s2.charAt(i);
    			if(Character.isDigit(c1)) sum1 += c1-'0'; // 여기를 그냥 c1, c2로 했더니
    			if(Character.isDigit(c2)) sum2 += c2-'0'; // 계속 틀렸다고 나옴
    		}
    		if(sum1==sum2)
    			return s1.compareTo(s2)>0;
            else
                return sum1>sum2;
    	}
    	else
    		return s1.length()>s2.length();
    }
}

 

2) 사람들의 도움을 받아 람다식으로 바꿔본 코드

import java.util.*;
import java.io.*;
class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.valueOf(br.readLine());
        String[] word = new String[n];
        for(int i=0 ; i<n ; i++)
        	word[i] = br.readLine();
        Arrays.sort(word, (s1,s2) ->
        	s1.length()==s2.length() ?
                    (sum(s1)!=sum(s2) ? sum(s1)-sum(s2) : s1.compareTo(s2))
                    : s1.length()-s2.length());  // 양수: 더 뒤로 가야 하는 단어
        for(int i=0 ; i<n ; i++)
        	bw.write(word[i]+"\n");
        bw.flush(); bw.close();
    }
    
    static int sum(String s) {
    	int ans = 0;
    	for(int i=0 ; i<s.length(); i++)
    		if(Character.isDigit(s.charAt(i)))
    			ans += s.charAt(i)-'0';
    	return ans;
    }
}