본문 바로가기
PS/BOJ

[자바] 백준 29730 - 임스의 데일리 인증 스터디 (java)

by Nahwasa 2023. 11. 21.

목차

    문제 : boj29730

     

     

    필요 알고리즘

    • 문자열, 파싱, 정렬
      • 문자열을 파싱할 줄 알고, 원하는 방식으로 정렬할 수 있어야 한다.

    ※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.

     

     

    풀이

      이 문제를 풀기위해 해결해야 하는건 다음과 같다. 내 경우엔 이하의 코드처럼 해결했다.

     

    1. 'boj.kr/문제 번호' 형태를 판단할 수 있어야 한다. 이 때 '문제 번호'는 정수여야하고 1부터 30000의 범위여야 한다. 테스트 케이스는 모르지만 분명 boj.kr/30001 이런 데이터도 있을 것이고, 이건 원하는 형태가 아니므로 일반 학습 기록으로 쳐야 한다. 또한 boj.kr/abc123 이런 형태도 마찬가지다. try - catch 해둔 부분은 그냥 정수가 아닌 경우 혹은 'boj.kr/' 과 같은 데이터를 처리하기 귀찮았기 때문에 아무튼 정수로 변경해보고 에러나면 넘어가기 위해서이다 ㅋㅋ

    if (cur.startsWith("boj.kr/")) {
        int num = -1;
        try {
            num = Integer.parseInt(cur.substring(7));
        } catch (Exception e) {}
    
        if (num >= 1 && num <= 30000) {
            boj.add(num);
            continue;
        }
    }

     

     

    2. 백준 문제를 푼 것과 일반 학습 기록을 나눠서 저장했다면 이제 문제에서 제시된대로 정렬하고 출력만 해주면 된다. 문제 푼 것이야 그냥 정렬로 가능하지만, 일반 학습 기록의 경우 우선 길이가 짧은 순으로 정렬한 후 길이가 동일한 경우에만 일반적인 문자열 정렬을 수행해야 한다.

    Collections.sort(study, (a, b)->{
        if (a.length() == b.length())
            return a.compareTo(b);
        return a.length() - b.length();
    });
    Collections.sort(boj);

     

     

     

    코드 : github

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.*;
    
    public class Main {
        static BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1<<16);
        private static final int MAX = 10080;
    
        public static void main(String[] args) throws Exception {
            new Main().solution();
        }
    
        public void solution() throws Exception {
            int n = Integer.parseInt(br.readLine());
    
            List<String> study = new ArrayList<>();
            List<Integer> boj = new ArrayList<>();
            while (n-->0) {
                String cur = br.readLine();
                if (cur.startsWith("boj.kr/")) {
                    int num = -1;
                    try {
                        num = Integer.parseInt(cur.substring(7));
                    } catch (Exception e) {}
    
                    if (num >= 1 && num <= 30000) {
                        boj.add(num);
                        continue;
                    }
                }
    
                study.add(cur);
            }
    
            Collections.sort(study, (a, b)->{
                if (a.length() == b.length())
                    return a.compareTo(b);
                return a.length() - b.length();
            });
            Collections.sort(boj);
    
            StringBuilder sb = new StringBuilder();
            for (String s : study) sb.append(s).append('\n');
            for (Integer num : boj) sb.append("boj.kr/").append(num).append('\n');
            System.out.print(sb);
        }
    }

     

    댓글