728x90
백준 2970: 수학숙제
풀이
이 문제는 숫자가 아닌 문자로 구해야 하는 문제이다.
각 줄은 최대 100글자이고, 항상 알파벳 소문자와 숫자로만 이루어져 있다.
100글자가 모두 숫자로 채워져있다면 int와 long의 범위를 훌쩍 넘어버리기 때문이다.
NumberFormat 에러는 여기서 발생했을 것이다.
그럼 문자로 해결을 하면 되는데, 주의해야할 점은 000001 이 나올 경우 1로 출력해야한다.
그래서 문자를 넣기 전에 숫자의 첫번째 문자가 "0"이라면,
앞에나오는 0을 생략해주는 Check0 함수를 사용해줬다.
Check0함수 내에서 0이 나오면 replace해주는 코드를 만들었는데
계속해서 replace하면서 숫자의 길이가 실시간으로 변경되는 문제가 발생했다.
static void Check0() {
int cnt = 0;
for(int i=0; i<num.length(); i++) {
if(cnt > 0) {
return;
}
if(cnt == 0 && num.charAt(i)=='0') {
num = num.replace("0", "");
}else {
cnt++;
}
}
}
이전에 짠 코드인데, 이렇게 코드를 짤 경우 num의 길이가 실시간으로 바뀌기 때문에 문제가 발생한다.
입력값: 000000020
출력값: 2
뒤에 나오는 0마저도 생략해버리는 문제가 발생한 것이다.
해당 함수를 고쳐주니 해결할 수 있었다.
매번 우선순위 큐에서만 Comparator를 사용해와서
list Comparator를 자주 사용하지 않아 어떻게 사용해야하는지 헷갈렸는데
다음부터는 list나 array에서도 Comparator를 잘 사용할 수 있을 것 같다.
전체코드
import java.io.*;
import java.util.*;
public class Main {
static String num;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
List<String> list = new ArrayList<>();
int N = Integer.parseInt(br.readLine());
for(int i=0; i<N; i++) {
String word = br.readLine();
num = "";
for(int j=0; j<word.length(); j++) {
if(word.charAt(j)<65) {
num += word.charAt(j);
}else {
if(num.length() > 0) {
if(num.charAt(0) == '0') {
Check0();
}
list.add(num);
num = "";
}else {
continue;
}
}
}
if(num.length() > 0) {
if(num.charAt(0) == '0') {
Check0();
}
list.add(num);
}else {
continue;
}
}
Collections.sort(list, new Comparator<>() {
public int compare(String o1, String o2) {
if(o1.length() == o2.length()) {
return o1.compareTo(o2);
}else {
return o1.length() - o2.length();
}
}
});
for(int i=0; i<list.size(); i++) {
sb.append(list.get(i)).append('\n');
}
bw.write(sb.toString());
bw.close();
}
static void Check0() {
int cnt = 0;
int n = num.length();
for(int i=0; i<n; i++) {
if(cnt == 0 && num.charAt(0)=='0') {
num = num.substring(1, num.length());
}else {
cnt++;
return;
}
}
if(num.length() == 0) {
num = "0";
}
}
}
728x90
'코딩테스트 > Algorithm' 카테고리의 다른 글
[Programmers] 연속된 부분 수열의 합 (JAVA) (2) | 2024.07.23 |
---|---|
[Programmers] 튜플 (JAVA) (1) | 2024.07.22 |
[Programmers] 2 x n 타일링 (JAVA) (0) | 2024.07.18 |
[Programmers] 땅따먹기 (JAVA) (0) | 2024.07.17 |
[Programmers] 정수 삼각형 (JAVA) (0) | 2024.07.16 |