본문 바로가기
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);
    }
}

 

댓글