From b86a8d6559bef11ca437f08ec9d551d15466ae31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=84=EC=9E=AC=EB=AF=BC?= Date: Tue, 24 Mar 2026 14:08:54 +0900 Subject: [PATCH 1/3] =?UTF-8?q?FEAT=20:=20BOJ=5F2457=5F=EA=B3=B5=EC=A3=BC?= =?UTF-8?q?=EB=8B=98=EC=9D=98=20=EC=A0=95=EC=9B=90=20-=20PASS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 그리디 문제가 익숙치 않아서 꽤 힘들었음 - 끝을 저장해야한다는 건 알았는데 그걸 어떻게 이용할지 생각하기가 힘들었음 - 제출 이후 코드 최적화 진행함 --- .../Minjun.java" | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 "0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" diff --git "a/0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" "b/0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" new file mode 100644 index 0000000..f167d5d --- /dev/null +++ "b/0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" @@ -0,0 +1,96 @@ +import java.io.*; +import java.util.*; + +public class Minjun { + + static class Flower implements Comparable { + int start; + int end; + public Flower(int start, int end) { + super(); + this.start = start; + this.end = end; + } + @Override + public int compareTo(Flower o) { + return start - o.start; + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + // N개의 꽃 + // 같은 해에 피고 같은 해에 짐 + // 각 꽃마다 피는 날과 지는 날이 정해져 있음 + // 6월 13일 지는 꽃은 13일부터 볼 수 없음 + // N개의 꽃들 중 두 조건 만족하는 꽃들을 선택 + // 1. 3월 11일 ~ 11월 30일까지 매일 꽃 한개 이상이 피어있도록 + // 2. 심는 꽃들의 수는 가능한 적게 + // 선택한 꽃들의 최소 개수를 출력 + + int flowerNum = Integer.parseInt(br.readLine()); + + ArrayList flowers = new ArrayList<>(flowerNum); + + for (int i = 0; i < flowerNum; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int sM = Integer.parseInt(st.nextToken()); + int sD = Integer.parseInt(st.nextToken()); + int start = 100 * sM + sD; + + int eM = Integer.parseInt(st.nextToken()); + int eD = Integer.parseInt(st.nextToken()); + int end = 100 * eM + eD; + + flowers.add(new Flower(start, end)); + } + + flowers.sort(null); + + + + // 각 꽃마다 시작과 끝이 있음 + // 날짜 사이에 꽃이 하나라도 있어야함 + // 그리디, 정렬 + // 날짜 비교 단순 숫자로 + // 3월 1일 이하의 날짜들 중에서 끝나는 날이 가장 먼 날짜가 그리디한 선택 + // 꽃 클래스 만들기 (시작, 끝) + // 시작을 기준으로 정렬 + // 시작이 3월 1일 이하인지 확인 + // 꽃 선택이 불가능하다면 0을 출력 + // 현재 끝을 해당 꽃으로 갱신 + // 현재 끝이 1130을 초과할 때 까지 반복 + + // 현재 끝을 기록 301 + int target = 301; + int idx = 0; + int cnt = 0; + int maxEnd = 0; + boolean isFound = false; + + // 시작이 301 이하이면서 끝나는 날이 가장 큰 꽃 고르기 + while(target <= 1130) { + isFound = false; + + // 현재 target 이하로 피는 꽃들을 전부 스캔하면서 가장 늦게 지는 날(maxEnd) 찾기 + while (idx < flowerNum && flowers.get(idx).start <= target) { + if (flowers.get(idx).end > maxEnd) { + maxEnd = flowers.get(idx).end; + isFound = true; + if(maxEnd > 1130) break; + } + idx++; + } + + // 2. 만약 isFound가 false라면? + // -> 현재 target을 이어받을 꽃이 아예 없다는 뜻! 중간에 날짜 빵꾸가 났으니 0 출력하고 탈출! + if (isFound == false) { + break; + } else { // 3. 무사히 찾았다면? + target = maxEnd; // -> 이제서야 비로소 target = maxEnd 로 바통 터치! 그리고 cnt++ + cnt++; + } + } + System.out.println(isFound ? cnt : 0); + } +} \ No newline at end of file From 696dbd185310491a232a1a18073d24bfbdf81852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=84=EC=9E=AC=EB=AF=BC?= Date: Tue, 24 Mar 2026 14:36:59 +0900 Subject: [PATCH 2/3] =?UTF-8?q?FIX=20:=20=EB=B8=8C=EB=9E=9C=EC=B9=98=20?= =?UTF-8?q?=EA=BC=AC=EC=97=AC=EC=84=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Minjun.java" | 96 ------------------- 1 file changed, 96 deletions(-) delete mode 100644 "0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" diff --git "a/0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" "b/0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" deleted file mode 100644 index f167d5d..0000000 --- "a/0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" +++ /dev/null @@ -1,96 +0,0 @@ -import java.io.*; -import java.util.*; - -public class Minjun { - - static class Flower implements Comparable { - int start; - int end; - public Flower(int start, int end) { - super(); - this.start = start; - this.end = end; - } - @Override - public int compareTo(Flower o) { - return start - o.start; - } - } - - public static void main(String[] args) throws IOException { - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - // N개의 꽃 - // 같은 해에 피고 같은 해에 짐 - // 각 꽃마다 피는 날과 지는 날이 정해져 있음 - // 6월 13일 지는 꽃은 13일부터 볼 수 없음 - // N개의 꽃들 중 두 조건 만족하는 꽃들을 선택 - // 1. 3월 11일 ~ 11월 30일까지 매일 꽃 한개 이상이 피어있도록 - // 2. 심는 꽃들의 수는 가능한 적게 - // 선택한 꽃들의 최소 개수를 출력 - - int flowerNum = Integer.parseInt(br.readLine()); - - ArrayList flowers = new ArrayList<>(flowerNum); - - for (int i = 0; i < flowerNum; i++) { - StringTokenizer st = new StringTokenizer(br.readLine()); - int sM = Integer.parseInt(st.nextToken()); - int sD = Integer.parseInt(st.nextToken()); - int start = 100 * sM + sD; - - int eM = Integer.parseInt(st.nextToken()); - int eD = Integer.parseInt(st.nextToken()); - int end = 100 * eM + eD; - - flowers.add(new Flower(start, end)); - } - - flowers.sort(null); - - - - // 각 꽃마다 시작과 끝이 있음 - // 날짜 사이에 꽃이 하나라도 있어야함 - // 그리디, 정렬 - // 날짜 비교 단순 숫자로 - // 3월 1일 이하의 날짜들 중에서 끝나는 날이 가장 먼 날짜가 그리디한 선택 - // 꽃 클래스 만들기 (시작, 끝) - // 시작을 기준으로 정렬 - // 시작이 3월 1일 이하인지 확인 - // 꽃 선택이 불가능하다면 0을 출력 - // 현재 끝을 해당 꽃으로 갱신 - // 현재 끝이 1130을 초과할 때 까지 반복 - - // 현재 끝을 기록 301 - int target = 301; - int idx = 0; - int cnt = 0; - int maxEnd = 0; - boolean isFound = false; - - // 시작이 301 이하이면서 끝나는 날이 가장 큰 꽃 고르기 - while(target <= 1130) { - isFound = false; - - // 현재 target 이하로 피는 꽃들을 전부 스캔하면서 가장 늦게 지는 날(maxEnd) 찾기 - while (idx < flowerNum && flowers.get(idx).start <= target) { - if (flowers.get(idx).end > maxEnd) { - maxEnd = flowers.get(idx).end; - isFound = true; - if(maxEnd > 1130) break; - } - idx++; - } - - // 2. 만약 isFound가 false라면? - // -> 현재 target을 이어받을 꽃이 아예 없다는 뜻! 중간에 날짜 빵꾸가 났으니 0 출력하고 탈출! - if (isFound == false) { - break; - } else { // 3. 무사히 찾았다면? - target = maxEnd; // -> 이제서야 비로소 target = maxEnd 로 바통 터치! 그리고 cnt++ - cnt++; - } - } - System.out.println(isFound ? cnt : 0); - } -} \ No newline at end of file From 80c4669914af3c14b1a9c29990568c9b66d8a7b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 24 Mar 2026 14:42:17 +0900 Subject: [PATCH 3/3] =?UTF-8?q?FEAT=20:=20BOJ=5F2457=5F=EA=B3=B5=EC=A3=BC?= =?UTF-8?q?=EB=8B=98=EC=9D=98=20=EC=A0=95=EC=9B=90=20-=20PASS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Minjun.java" | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 "0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" diff --git "a/0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" "b/0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" new file mode 100644 index 0000000..f167d5d --- /dev/null +++ "b/0326/basic_B2457_\352\263\265\354\243\274\353\213\230\354\235\230_\354\240\225\354\233\220/Minjun.java" @@ -0,0 +1,96 @@ +import java.io.*; +import java.util.*; + +public class Minjun { + + static class Flower implements Comparable { + int start; + int end; + public Flower(int start, int end) { + super(); + this.start = start; + this.end = end; + } + @Override + public int compareTo(Flower o) { + return start - o.start; + } + } + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + // N개의 꽃 + // 같은 해에 피고 같은 해에 짐 + // 각 꽃마다 피는 날과 지는 날이 정해져 있음 + // 6월 13일 지는 꽃은 13일부터 볼 수 없음 + // N개의 꽃들 중 두 조건 만족하는 꽃들을 선택 + // 1. 3월 11일 ~ 11월 30일까지 매일 꽃 한개 이상이 피어있도록 + // 2. 심는 꽃들의 수는 가능한 적게 + // 선택한 꽃들의 최소 개수를 출력 + + int flowerNum = Integer.parseInt(br.readLine()); + + ArrayList flowers = new ArrayList<>(flowerNum); + + for (int i = 0; i < flowerNum; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int sM = Integer.parseInt(st.nextToken()); + int sD = Integer.parseInt(st.nextToken()); + int start = 100 * sM + sD; + + int eM = Integer.parseInt(st.nextToken()); + int eD = Integer.parseInt(st.nextToken()); + int end = 100 * eM + eD; + + flowers.add(new Flower(start, end)); + } + + flowers.sort(null); + + + + // 각 꽃마다 시작과 끝이 있음 + // 날짜 사이에 꽃이 하나라도 있어야함 + // 그리디, 정렬 + // 날짜 비교 단순 숫자로 + // 3월 1일 이하의 날짜들 중에서 끝나는 날이 가장 먼 날짜가 그리디한 선택 + // 꽃 클래스 만들기 (시작, 끝) + // 시작을 기준으로 정렬 + // 시작이 3월 1일 이하인지 확인 + // 꽃 선택이 불가능하다면 0을 출력 + // 현재 끝을 해당 꽃으로 갱신 + // 현재 끝이 1130을 초과할 때 까지 반복 + + // 현재 끝을 기록 301 + int target = 301; + int idx = 0; + int cnt = 0; + int maxEnd = 0; + boolean isFound = false; + + // 시작이 301 이하이면서 끝나는 날이 가장 큰 꽃 고르기 + while(target <= 1130) { + isFound = false; + + // 현재 target 이하로 피는 꽃들을 전부 스캔하면서 가장 늦게 지는 날(maxEnd) 찾기 + while (idx < flowerNum && flowers.get(idx).start <= target) { + if (flowers.get(idx).end > maxEnd) { + maxEnd = flowers.get(idx).end; + isFound = true; + if(maxEnd > 1130) break; + } + idx++; + } + + // 2. 만약 isFound가 false라면? + // -> 현재 target을 이어받을 꽃이 아예 없다는 뜻! 중간에 날짜 빵꾸가 났으니 0 출력하고 탈출! + if (isFound == false) { + break; + } else { // 3. 무사히 찾았다면? + target = maxEnd; // -> 이제서야 비로소 target = maxEnd 로 바통 터치! 그리고 cnt++ + cnt++; + } + } + System.out.println(isFound ? cnt : 0); + } +} \ No newline at end of file