ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 1181 자바 java
    개발/코딩테스트 2023. 2. 28. 23:00

    첫째 줄에 단어의 개수 N을 입력하고

    둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 입력하면

    길이가 짧은 것부터 길이가 같으면 사전순서대로 중복을 제거하고 정렬해야한다

     

    코딩테스트를 요새 하기 시작해서 (자바를 손에 익게하려고)

    이 문제는 그런말이 없긴 하지만 심지어 어떤 문제는 초등부ㅠㅠ 문제라는데

    못풀고 있으면 좀 자괴감

    그런 초등생들은 물론 엄청나게 뛰어난 초등부이겠지만

     

    이 문제도 도대체 어떻게 중복제거를 해야할지 감이 안왔는데

     

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            sc.nextLine();
            
            List<String> words = new ArrayList<>();
            for (int i = 0; i < n; i++) {
                String s = sc.nextLine().trim().toLowerCase();
                if (!words.contains(s)) {
                    words.add(s);
                }
            }
            
            Collections.sort(words, new Comparator<String>() {
                @Override
                public int compare(String s1, String s2) {
                    int lenDiff = s1.length() - s2.length();
                    if (lenDiff != 0) {
                        return lenDiff;
                    }
                    return s1.compareTo(s2);
                }
            });
            
            for (String word : words) {
                System.out.println(word);
            }
        }
    }

     

    일단 전체 코드이다

    부분씩 보면

     

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();

     

    스캐너 객체 sc부터 생성하고 int n 부터 읽어온다

    그리고 이거 하면서 처음 알았는데 nextint 다음에 nextline을 바로 쓰면 하나를 먹고 들어가서

    한번 더 저렇게 써줘야 한다고 한다

    자꾸 하나를 덜받아서 내가 뭘 잘못한건가 한참 생각했는데

    이게 원래 그렇다고...

     

    List<String> words = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String s = sc.nextLine();
            if (!words.contains(s)) {
                words.add(s);
            }
        }

     

    빈 문자열 리스트 words를 먼저 만들고 for문에서 n번 반복하면서 한줄씩 입력받는다

    words.contains 앞에 !를 붙여서 s가  words에 포함되어 있지 않으면 words에 추가한다

     

    Collections.sort(words, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                int lenDiff = s1.length() - s2.length();
                if (lenDiff != 0) {
                    return lenDiff;
                }
                return s1.compareTo(s2);
            }
        });

     

    여기부터 좀 어려운데 comparator 객체를 사용해서 words를 정렬한다

    campare는 s1과 s2의 길이를 비교해서 길이가 다르면 s1길이에서 s2길이를 뺀 값을 반환한다

    만약에 반환값이 음수면 앞에 오게된다(반환한 값으로 정렬하니까)

    그리고 만약 길이가 같으면 사전순서대로 비교한다

     

    for (String word : words) {
            System.out.println(word);
        }
    }

     

    그리고 words에 있는 요소를 하나씩 출력한다

    '개발 > 코딩테스트' 카테고리의 다른 글

    [백준] 1000 A+B (자바)  (0) 2023.03.03
    [백준] 11870 좌표 압축(자바)  (0) 2023.03.02

    댓글

Designed by Tistory.