풀이방법 및 문제점
2022.11.09
어이 없는 이유로 계속 실패하다가 오늘 해결에 성공한 문제이다.
이 문제를 풀 수 있는 완벽한 로직은 9달 전부터 알고 있었다.
그러나 그 때에는 Comparator를 아직 알지 못해, 매우 비효율적인 방식으로 값들을 정렬하였다.
그래서 시간초과를 받았다.
그리고 오늘 다시 도전하였다.
오늘은 Comparator를 아는 상태이기 때문에 시간초과는 받지 않았다.
그러나 for문에 break를 넣어서 틀렸다. 넣을 이유가 없는데 왜 넣었는지 모르겠다. 정말 멍청한 실수였다!
break를 지우니 정답 처리가 되었다.
코드
Java(2022.01.22) 시간초과를 받은 코드
import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Integer[] ds = new Integer[n];
Integer[] ts = new Integer[n];
for(int i = 0; i<n; i++) {
ds[i]= sc.nextInt();
ts[i]= sc.nextInt();
}
Integer[] tsSorted = new Integer[n];
for(int i = 0; i<n; i++) {
tsSorted[i] = ts[i];
}
Arrays.sort(tsSorted,Comparator.reverseOrder());
Integer[] dsSorted = new Integer[n];
for(int i = 0; i<n; i++) {
for(int j = 0; j<n; j++) {
if(tsSorted[i] == ts[j]) {
dsSorted[i] = ds[j];
ts[j] = -1;
break;
}
}
}
int ans = tsSorted[0] - dsSorted[0];
for(int i = 1; i<n; i++) {
if(ans>tsSorted[i]) ans = tsSorted[i] - dsSorted[i];
else ans -= dsSorted[i];
}
System.out.print(ans);
sc.close();
}
}
Java(2022.11.09) break 때문에 틀린 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
/*
* 입력값 읽어오기
*/
//과제의 개수
int n = Integer.parseInt(br.readLine());
//과제들
Homework[] hws = new Homework[n];
for(int i=0; i<n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
hws[i] = new Homework(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
//과제를 마감 일자가 늦은 순으로 정렬
Arrays.sort(hws, new Comparator<Homework>() {
@Override
public int compare(Homework h1, Homework h2) {
// TODO Auto-generated method stub
if (h1.getT()<h2.getT()) return 1;
else return -1;
}
});
int ans = hws[0].getT()-hws[0].getD();
for(int i=1; i<n; i++) {
if(hws[i].getT()>ans) {
ans = ans - hws[i].getD();
break;
}
else ans = hws[i].getT() - hws[i].getD();
}
System.out.print(ans);
}
}
//과제 클래스
class Homework {
private int d; //하는 데 걸리는 일 수
private int t; //마감일자
public Homework (int d, int t) {
this.d = d;
this.t = t;
}
public int getD(){
return d;
}
public int getT() {
return t;
}
}
'알고리즘 문제풀이 > 백준-오답노트' 카테고리의 다른 글
오답노트 #10971 : 외판원 순회 2 (0) | 2022.11.29 |
---|---|
오답노트 #4436 : 엘프의 검 (0) | 2022.11.22 |
오답노트 #16564 : 히오스 프로게이머 (0) | 2022.06.10 |
오답노트 #2370 : 시장 선거 포스터 (0) | 2022.06.08 |
오답노트 #1325 : 효율적인 해킹 (0) | 2022.05.28 |