Tags
- ๋ฌธ์์ด
- LV2
- Java
- Study
- dfs
- ๊ต์ฌ
- PGM
- CodingTest
- ์๋ฎฌ๋ ์ด์
- SpringBoot
- greedy
- BOJ
- ๊น์ด ์ฐ์ ํ์
- ๊ตฌํ
- BFS
- Brute Force Algorithm
- ๋๋น ์ฐ์ ํ์
- queue
- Dynamic Programming
- DP
- ์ ๋ ฌ
- ๋ฐฑํธ๋ํน
- ์ํ
- stack
- ์ ์๋ก
- ๊ทธ๋ํ ํ์
- sort
- ์๋ฃ๊ตฌ์กฐ
- ๊ทธ๋ํ ์ด๋ก
- Python
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_7507 : ์ฌ๋ฆผํฝ ๊ฒ์ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- ๋ฌธ์
- ํ ๊ฒฝ๊ธฐ๊ฐ ๋๋์ผ ๋ค์ ๊ฒฝ๊ธฐ๋ฅผ ๋ณผ ์ ์๋ค.
- ์ข ๋ฃ์ ์์ ์๊ฐ์ด ์์ ํ ๊ฐ์๋ ๋ณผ ์ ์๋ค.
- ํ ์คํธ ์ผ์ด์ค ๋ณ, ํ ์ฌ๋์ด ๋ณผ ์ ์๋ ์ต๋ ๊ฒฝ๊ธฐ ์๋ฅผ ์ถ๋ ฅํ๋ค.
- ํ์ด (Greedy)
- ๊ฒฝ๊ธฐ ์ ๋ณด๋ฅผ ๋ ์ง์ ์ข ๋ฃ ์๊ฐ์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํ๋ค.
- ๋ค์ ๊ฒฝ๊ธฐ๋ฅผ ๋ณผ ์ ์์ผ๋ฉด ์นด์ดํธ + 1์ ํ๋ค.
- ๋ค์ ๊ฒฝ๊ธฐ๊ฐ ๋ค์ ๋ ์ง์ด๋ฉด, ๋ฌด์กฐ๊ฑด ๋ณผ ์ ์์ผ๋ฏ๋ก ๋ค์ ๊ฒฝ๊ธฐ๋ก ์ด๋ํ๋ค.
- ๋ค์ ๊ฒฝ๊ธฐ์ ์์์ด ํ์ฌ ๊ฒฝ๊ธฐ์ ์ข ๋ฃ ์๊ฐ๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฌ๋ฉด, ๋ณผ ์ ์๋ ๊ฒฝ๊ธฐ์ด๋ฏ๋ก ๋ค์ ๊ฒฝ๊ธฐ๋ก ์ด๋ํ๋ค.
- ๊ทธ ์ธ๋ ๋ณผ ์ ์๋ ๊ฒฝ๊ธฐ์ด๋ค.
- ๋ง์ง๋ง ๊ฒฝ๊ธฐ๊น์ง ํ์ธํ๋ฉด, ์นด์ดํธ๋ฅผ ์ถ๋ ฅํ๋ค.
๐ธ ์ฝ๋ ๐ธ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 1) Test Case
int n = Integer.parseInt(br.readLine());
for (int t = 1; t <= n; t++) {
// 2) Input
int m = Integer.parseInt(br.readLine());
Game[] games = new Game[m];
for (int i = 0; i < m; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
games[i] = new Game(Integer.parseInt(st.nextToken()), st.nextToken(), st.nextToken());
}
// 3) Sort
Arrays.sort(games);
// 4) Greedy
int answer = 1;
Game game = games[0];
for (int i = 1; i < m; i++) {
if (game.day != games[i].day || game.end.compareTo(games[i].start) <= 0) {
game = games[i];
answer++;
}
}
// 5) Output
sb.append(String.format("Scenario #%d:\n%d\n\n", t, answer));
// print(games, dp);
}
System.out.println(sb);
}
private static class Game implements Comparable<Game> {
int day;
String start;
String end;
public Game(int day, String start, String end) {
this.day = day;
this.start = start;
this.end = end;
}
@Override
public int compareTo(Game o) {
if (this.day != o.day)
return this.day - o.day;
return this.end.compareTo(o.end);
}
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- Game์ด๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด, ๋ ์ง, ์์์๊ฐ, ์ข
๋ฃ์๊ฐ์ ์ ์ฅํ๋ค.
- Comparable ์ธํฐํ์ด์ค๋ฅผ ์์ํด, ๋ ์ง์ ์ข ๋ฃ์๊ฐ์ผ๋ก ์ ๋ ฌํ ์ ์๋๋ก ํ๋ค.
- 1) 2) ํ ์คํธ์ผ์ด์ค ๋ง๋ค ๊ฒฝ๊ธฐ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ์ ๋ ฌํ๋ค.
- 3) ๋ ์ง, ์ข ๋ฃ์๊ฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
- 4) ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ด๋ ๊ฐ๋ฅํ ๊ฒฝ๊ธฐ ์ answer๋ฅผ ์นด์ดํธํ๋ค.
- ์ ๋ ฌํ ๊ฒฝ๊ธฐ ์ ๋ณด๋ฅผ ์ํํ๋ค.
- ํ์ฌ ๊ฒฝ๊ธฐ( game )์ ๋ค์ ๊ฒฝ๊ธฐ( game[i] )๋ฅผ ๋น๊ตํ๋ค.
- ๋ ์ง๊ฐ ๋ฌ๋ผ์ง๊ฑฐ๋, ๋ค์ ๊ฒฝ๊ธฐ์ ์์ ์๊ฐ์ด ํ์ฌ ๊ฒฝ๊ธฐ์ ์์ ์๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด,
๋ค์ ๊ฒฝ๊ธฐ๋ฅผ ํ์ฌ ๊ฒฝ๊ธฐ๋ก ์ ์ฅํ๊ณ , answer๋ฅผ +1 ํ๋ค.
- ๋ ์ง๊ฐ ๋ฌ๋ผ์ง๊ฑฐ๋, ๋ค์ ๊ฒฝ๊ธฐ์ ์์ ์๊ฐ์ด ํ์ฌ ๊ฒฝ๊ธฐ์ ์์ ์๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด,
- 5) ๊ฒฝ๊ธฐ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ธ ์ค๋ต ์ฝ๋ : Dynamic Programming ๐ธ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 1) Test Case
int n = Integer.parseInt(br.readLine());
for (int t = 1; t <= n; t++) {
// 2) Input
int m = Integer.parseInt(br.readLine());
int[] dp = new int[m];
dp[0] = 1;
Game[] games = new Game[m];
for (int i = 0; i < m; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
games[i] = new Game(Integer.parseInt(st.nextToken()), st.nextToken(), st.nextToken());
}
// 3) Sort
Arrays.sort(games);
// 4) dp
int max = 0;
for (int i = 1; i < m; i++) {
dp[i] = find_Before_Game(games, dp, i);
max = Math.max(max, dp[i]);
}
// 5) Output
sb.append(String.format("Scenario #%d:\n%d\n\n", t, max));
// print(games, dp);
}
System.out.println(sb);
}
private static int find_Before_Game(Game[] games, int[] dp, int now) {
for (int i = now - 1; i >= 0; i--) {
if (games[now].day > games[i].day ||
games[now].start.compareTo(games[i].end) >= 0) {
return dp[i] + 1;
}
}
return 1;
}
private static class Game implements Comparable<Game> {
int day;
String start;
String end;
public Game(int day, String start, String end) {
this.day = day;
this.start = start;
this.end = end;
}
@Override
public int compareTo(Game o) {
if (this.day != o.day)
return this.day - o.day;
return this.start.compareTo(o.start);
}
}
private static void print(Game[] games, int[] dp) {
System.out.println("\n=============================\n");
System.out.println("\n# n : day\tstart\tend \tdp");
for (int i = 0; i < games.length; i++) {
System.out.printf("# %d : %d \t%s\t%s\t%d\n",
i, games[i].day, games[i].start, games[i].end, dp[i]);
}
System.out.println("\n=============================\n");
}
}
- DP๋ฅผ ์ด์ฉํ ํ์ด๋ค.
- ๊ฐ ๊ฒฝ๊ธฐ์ ์ธ๋ฑ์ค์ ๋งค์นญ๋๋ dp ๋ฐฐ์ด์ ๋ง๋ ๋ค.
- ํด๋น ๊ฒฝ๊ธฐ๋ฅผ ํฌํจํด ์ต๋๋ก ๋ณผ ์ ์๋ ๊ฒฝ๊ธฐ ์๋ฅผ ์์๋ก ์ ์ฅํ๋ค.
- ํ์ฌ ๊ฒฝ๊ธฐ ์ด์ ์ ๊ฒฝ๊ธฐ ์ ๋ณด๋ฅผ ์ญ์์ผ๋ก ์ฐพ์ผ๋ฉฐ, ์ด์ด์ ๋ณผ ์ ์๋์ง ํ์ธํ๋ค.
- ์ด์ด์ ๋ณผ ์ ์์ผ๋ฉด, ์ฐพ์ ๊ฒฝ๊ธฐ์ ์ธ๋ฑ์คdp๊ฐ +1์ ์ ์ฅํ๋ค.
- ๋ณผ ์ ์๋ ๊ฒฝ๊ธฐ๊ฐ ์์ผ๋ฉด 1์ ์ ์ฅํ๋ค.
- m์ด 50000(5๋ง)์ผ๋ก ์ปค์ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค.
๐ธ end ๐ธ
- dp๋ก ์ด์ฌํ ํ๊ณ ํ
์คํธ ์ผ์ด์ค๋ 5๋ง๊ฐ ๊น์ง ๋ง๋ค์๋๋ฐ, ์ต์ข
์ ์ถ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋์ ์ข์ ํ๋ค...
- ์ฌ์ง์ด ์ ์ถ๋ ฅ ๋ฑ์ ์ต์ ํ ํด๋ด๋ ๋ง์ฐฌ๊ฐ์ง์๋ค.
- ํ์ด ํฌ์คํ ์ ์ฐพ์๋ณด๊ณ ๊ทธ๋ฆฌ๋๋ก ํ์ด๋ฅผ ๋ณ๊ฒฝํ๋๋ฐ ๋๋ฌด ๊ฐ๋จํ๋ค.
- ๋น๋ก ํ๋ ธ์ง๋ง ๋ฌธ์ ๋ถ์๊ณผ ์ฝ๋ฉ ๊ณํ์ ์ ์ด๊ฐ๋ฉฐ ํ์ดํ๋ค.
- ํ๊ทธ๊ฐ ์์ด์ ๊ธฐ์ฌํ๊ธฐ๋ก greedy์ sort๋ฅผ ๋ฃ์๋๋ ๋ฌธ์ ์ ํ์๋๋ค.
- ํ ์คํธ ์ผ์ด์ค๋ ๊ณต์ ํ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_1992 : ์ฟผ๋ํธ๋ฆฌ (0) | 2023.02.10 |
---|---|
BOJ_2312 : ์ ๋ณต์ํ๊ธฐ (0) | 2023.02.10 |
BOJ_2630 : ์์ข ์ด ๋ง๋ค๊ธฐ (0) | 2023.02.05 |
BOJ_7569 : ํ ๋งํ (0) | 2023.02.03 |
BOJ_7576 : ํ ๋งํ (0) | 2023.01.30 |