baekjoon 1181

0_23·2022년 12월 21일
0

[BOJ][Java]

목록 보기
54/55
post-thumbnail

처음에 작성한 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());
        String[][] coordinateArray= new String[N][2];
        int x, y;
        for (int n = 0; n < N; n++){
            String word = br.readLine();
            coordinateArray[n][0] = word;
            coordinateArray[n][1] = String.valueOf(word.length());
        }
        Arrays.sort(coordinateArray, (eX1, eX2) -> {
            if(Integer.parseInt(eX1[1])==Integer.parseInt(eX2[1]))
                return dictionaryAlignment(eX1[0], eX2[0]);
            else
                return Integer.parseInt(eX1[1]) - Integer.parseInt(eX2[1]);
        });
        for (int n = 0; n < N; n++)
            if(n > 0 && !coordinateArray[n][0].equals(coordinateArray[n-1][0]))
                sb.append(coordinateArray[n][0]).append('\n');
            else if(n==0)
                sb.append(coordinateArray[n][0]).append('\n');
        System.out.print(sb);
        br.close();
    }
    static int dictionaryAlignment(String s1, String s2){
        char[] string1ToCharArr = s1.toCharArray();
        char[] string2ToCharArr = s2.toCharArray();
        for (int c = 0; c < string2ToCharArr.length; c++){
            if((int)string1ToCharArr[c] > (int)string2ToCharArr[c])
                return 1;
            else if((int)string1ToCharArr[c] < (int)string2ToCharArr[c])
                return -1;
        }
        return 0;
    }
}

위 코드를 사용 시 작동은 잘 되지만.. RuntimeError에 걸릴 것이다. 그럼 어떻게 할 것인가? 답은 str.compareTo() 이다.

str.compareTo()를 사용하면 같은 크기의 소문자만 비교를 하기에 별다른 처리필요없이 사용하면 된다. return값은 같은 문자일 때 0을 주지만 우리는 같은 문자일 때만 비교를 할 것이기 때문에 이부분 또한 무시해도 된다. (int)a-(int)b 같은 수식으로 진행되다가 다른 문자이 나타나면 그 문자들의 아스키값을 return해준다. 고로 만약 a가 b보다 아스키값이 높다면 정렬을 유지를 할 것이고 아니면 재정렬을 하게 될 것이다. 이부분을 이용해서 다음과 같은 코드를 작성했다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());
        String[][] coordinateArray= new String[N][2];
        int x, y;
        for (int n = 0; n < N; n++){
            String word = br.readLine();
            coordinateArray[n][0] = word;
            coordinateArray[n][1] = String.valueOf(word.length());
        }
        Arrays.sort(coordinateArray, (eX1, eX2) -> {
            if(Integer.parseInt(eX1[1])==Integer.parseInt(eX2[1]))
                return eX1[0].compareTo(eX2[0]);
            else
                return Integer.parseInt(eX1[1]) - Integer.parseInt(eX2[1]);
        });
        for (int n = 0; n < N; n++)
            if(n > 0 && !coordinateArray[n][0].equals(coordinateArray[n-1][0]))
                sb.append(coordinateArray[n][0]).append('\n');
            else if(n==0)
                sb.append(coordinateArray[n][0]).append('\n');
        System.out.print(sb);
        br.close();
    }
}

0개의 댓글