목차
문제 : 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);
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 23040 - 누텔라 트리 (Easy) (java) (0) | 2023.11.22 |
---|---|
[자바] 백준 11108 - TV 전쟁 (java) (0) | 2023.11.21 |
[자바] 백준 20956 - 아이스크림 도둑 지호 (java) (0) | 2023.11.21 |
[자바] 백준 3151 - 합이 0 (java) (3) | 2023.11.21 |
[자바] 백준 14257 - XOR 방정식 (java) (0) | 2023.08.11 |
댓글