알고리즘 문제풀이/백준-오답노트

오답노트 #7983 : 내일 할거야

모항 2022. 11. 9. 20:01

풀이방법 및 문제점

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;
	}
}