๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/2550
โธ ๋ฌธ์
N๊ฐ์ ์ค์์น์ N๊ฐ์ ์ ๊ตฌ๋ฅผ ๊ฐ์ง ํ๋์ ์ค์์นญ ๋ฐ์ค๊ฐ ์๋ค. ์ด ๋ฐ์ค์ ์ผํธ์๋ ์ค์์น๊ฐ ์๊ณ , ์ค๋ฅธํธ์๋ ์ ๊ตฌ๊ฐ ๋ฌ๋ ค์๋ค. ๋ชจ๋ ์ค์์น์ ์ ๊ตฌ๋ค์ 1์์๋ถํฐ N๊น์ง์ ๋ฒํธ๋ฅผ ๊ฐ์ง๋ฉฐ ๊ฐ์ ๋ฒํธ์ ์ค์์น์ ์ ๊ตฌ๋ ์ ์ ์ผ๋ก ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ค.
ํ๋์ ์ค์์น๋ฅผ ๋๋ฅด๋ฉด ๊ทธ ์ค์์น์ ์ฐ๊ฒฐ๋ ์ ๊ตฌ์ ๋ถ์ด ๋ค์ด์ค๊ฒ ๋๋ค. ๋ ๊ฐ ์ด์์ ์ค์์น๋ฅผ ๊ฐ์ด ๋๋ฅด๋ ๊ฒฝ์ฐ, ์ ์ ์ด ์๋ก ๋ง๋๋ฉด ๋ง๋ ์ ์ ์ ์ฐ๊ฒฐ๋ ์ ๊ตฌ๋ค์ ๋ถ์ ์ผ์ง์ง ์๋๋ค.
์ ๊ทธ๋ฆผ์์ 1๋ฒ๊ณผ 4๋ฒ์ ์ค์์น๋ฅผ ๊ฐ์ด ๋๋ฅด๋ฉด 1๋ฒ๊ณผ 4๋ฒ์ ์ ๊ตฌ์๋ ๋ถ์ด ์ผ์ง์ง๋ง, 1๋ฒ๊ณผ 2๋ฒ์ ์ค์์น๋ฅผ ๊ฐ์ด ๋๋ฅด๋ฉด 1๋ฒ๊ณผ 2๋ฒ ์ ๊ตฌ์ ๋ถ์ ์ผ์ง์ง ์๋๋ค. 1๋ฒ๊ณผ 3๋ฒ ๊ทธ๋ฆฌ๊ณ 5๋ฒ ์ค์์น๋ฅผ ๊ฐ์ด ๋๋ฅด๋ฉด ์ ์ ์ด ๋ง๋๋ 1๋ฒ๊ณผ 5๋ฒ ์ ๊ตฌ๋ ์ผ์ง์ง ์์ง๋ง 3๋ฒ ์ ๊ตฌ๋ ์ผ์ง๊ฒ ๋๋ค.
์ฌ๋ฌ๋ถ์ด ํ ์ผ์ ๊ฐ์ฅ ๋ง์ ์ ๊ตฌ๊ฐ ์ผ์ง๋๋ก ์ค์์น๋ฅผ ๋๋ฅด๋ ๊ฒ์ด๋ค. ์ ๊ทธ๋ฆผ์์๋ 3๋ฒ๊ณผ 4๋ฒ ๊ทธ๋ฆฌ๊ณ 5๋ฒ ์ค์์น๋ฅผ ๋๋ฅด๋ ๊ฒฝ์ฐ์ 1๋ฒ๊ณผ 3๋ฒ ๊ทธ๋ฆฌ๊ณ 4๋ฒ์ ๋๋ฅด๋ ๊ฒฝ์ฐ์ ์ธ ๊ฐ์ ์ ๊ตฌ๊ฐ ์ผ์ง๊ฒ ๋๊ณ , ์ด ๋ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ๊ฐ์ฅ ๋ง์ ์ ๊ตฌ๊ฐ ์ผ์ง๋ ๊ฒฝ์ฐ์ด๋ค.
์ค์์น์ ๋ฒํธ์์์ ์ ๊ตฌ์ ๋ฒํธ์์๊ฐ ์ฃผ์ด์ง ๋, ์ด๋ค ์ค์์น๋ฅผ ๋๋ฅด๋ฉด ๊ฐ์ฅ ๋ง์ ์ ๊ตฌ๊ฐ ์ผ์ง๋์ง๋ฅผ ์์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โธ ์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ค์์น์ ์(์ ๊ตฌ์ ์)๋ฅผ ๋ํ๋ด๋ ์ ์ N (1 ≤ N ≤ 10,000)์ด ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค์๋ N๊ฐ์ ์ค์์น ๋ฒํธ๋ค์ด ์์์๋ถํฐ ์์๋๋ก ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ธ ๋ฒ์งธ ์ค์๋ N๊ฐ์ ์ ๊ตฌ ๋ฒํธ๋ค์ด ์์์๋ถํฐ ์์๋๋ก ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค.
โธ ์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ๊ฐ์ฅ ๋ง์ ์ ๊ตฌ๊ฐ ์ผ์ง๊ฒ ํ๋ ์ค์์น์ ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋ ๋ฒ์งธ ์ค์๋ ๋๋ฌ์ผ ํ๋ ์ค์์น์ ๋ฒํธ๋ฅผ ์ค๋ฆ์ฐจ์(๋ฒํธ๊ฐ ์ปค์ง๋ ์์)์ผ๋ก ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ํ๋์ ์ค์ ์ถ๋ ฅํ๋ค. ๋จ, ๋ ๋ฒ์งธ ์ค์ ์ถ๋ ฅํ ์ ์๋ ๋ต์ด ๋ ๊ฐ์ง ์ด์์ผ ๋์๋ ๊ทธ ์ค ํ ๊ฐ์ง๋ง ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 3
- ๐ ๋ฌธ์ ์ ํ : ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด: o(n log n)
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์ด ๋ฌธ์ ๋ ์ ์ ์ด ๊ฒน์น์ง ์๋๋ก ํ๋ฉด์ ์ ๊ตฌ๊ฐ ๊ฐ์ฅ ๋ง์ด ์ผ์ง๋๋ก ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
๋ ์ ์ ์ด ๊ฒน์น์ง ์๊ธฐ ์ํด์๋ ์ค์์น๊ฐ ๊ฐ๋ฆฌํค๋ ์ ๊ตฌ์ ์์๊ฐ ์ฆ๊ฐํ๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก LIS๋ฅผ ํ์ฉํ๋ค.
์ ๊ตฌ์ ์ธ๋ฑ์ค 1, 3, 2, 4, 0์์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ์ฐพ์ผ๋ฉด ๋๋ค.
์ฆ, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ 1, 3, 4 ๋๋ 1, 2, 4๊ฐ ๋ ๊ฒ์ด๊ณ , ์ด ์ธ๋ฑ์ค์ ํด๋นํ๋ ์ ๊ตฌ์ ๋ฒํธ์ธ 4, 5, 3 ๋๋ 4, 1, 3 ์ค ํ๋๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํด ์ฃผ๋ฉด ๋ต์ด ๋๋ค.
๋จผ์ , HashMap<Integer, Integer>์ ์ด์ฉํด ์ค์์น์ ๋ฒํธ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๊ตฌ๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ์ด๋ฅผ ์ค์์น์ ์ฐ๊ฒฐํด ์ค๋ค.
๋ง์ฝ, 4๋ฒ ์ ๊ตฌ๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค๋ฉด ์ด์ ํด๋นํ๋ ์ค์์น์ ์ธ๋ฑ์ค์ธ 1์ ์ ์ฅํ๋ค.
์ด์ , ์ด๋ถ ํ์์ ํ์ฉํด ์ ๊ตฌ์ ์ธ๋ฑ์ค์ ๋ํด LIS๋ฅผ ์ฐพ์์ค๋ค.
์ด๋, ์๋์ ์ค์์น ์ ๋ณด๋ฅผ ์ฐพ๊ธฐ ์ํด LIS์ ์ ์ฅ๋๋ ์ ๊ตฌ์ ์ธ๋ฑ์ค์ ์ ๋ณด๋ฅผ Node[] node์ ์ ์ฅํ๋ค.
๋ง์ง๋ง์ผ๋ก, LIS๋ฅผ ์ํํ ์ ๊ตฌ์ ์ธ๋ฑ์ค์ list์ ์ธ๋ฑ์ค๋ฅผ ๋น๊ตํ๋ฉฐ ์ ๊ตฌ์ ๋ํ ์ค์์น ์ ๋ณด๋ฅผ ์ฐพ๋๋ค.
๋ง์ฝ, ํ์ฌ ์ ๊ตฌ์ ์ธ๋ฑ์ค๊ฐ 1๋ฒ์ด๋ผ๋ฉด ์ด์ ํด๋นํ๋ ์ค์์น๋ 4๋ฒ ์ค์์น๋ฏ๋ก 4๋ก ๋ณ๊ฒฝํ๋ค.
๋ณ๊ฒฝ๋ list๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๋ค ์ถ๋ ฅํ๋ค.
์ ํ์ด๋ฅผ ์ฝ๋๋ก ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 19404KB
์๊ฐ : 204ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Main {
static int n;
static int[] switches, lights;
static ArrayList<Integer> list;
static Node[] node;
static public class Node {
int num; int idx;
public Node (int num, int idx) {
this.num = num; this.idx = idx;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
HashMap<Integer, Integer> map = new HashMap<>(); // ์ค์์น ๋ฒํธ, ์ธ๋ฑ์ค
StringTokenizer st = new StringTokenizer(br.readLine());
switches = new int[n];
for (int i = 0; i < n; i++) {
switches[i] = Integer.parseInt(st.nextToken());
map.put(switches[i], i);
}
lights = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
lights[i] = map.get(Integer.parseInt(st.nextToken()));
}
getLis();
StringBuilder sb = new StringBuilder();
sb.append(list.size()).append("\n");
Collections.sort(list);
for (int i : list) {
sb.append(i).append(" ");
}
System.out.println(sb.toString());
}
private static void getLis() {
list = new ArrayList<>();
node = new Node[n];
int idx;
for (int i = 0; i < n; i++) {
if (list.size() == 0 || list.get(list.size()-1) < lights[i]) {
list.add(lights[i]);
node[i] = new Node(lights[i], list.size()-1);
} else {
idx = binarySearch(0, list.size()-1, lights[i]);
list.set(idx, lights[i]);
node[i] = new Node(lights[i], idx);
}
}
idx = list.size()-1;
for (int i = n-1; i >= 0; i--) {
if (node[i].idx == idx) {
list.set(idx--, switches[node[i].num]);
}
}
}
private static int binarySearch(int start, int end, int target) {
int mid;
while (start <= end) {
mid = (start + end)/2;
if (list.get(mid) < target) start = mid+1;
else end = mid-1;
}
return start;
}
}
ํด๊ฒฐ ์๋ฃ ! ๐ฅ
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_1937] ์์ฌ์์ด ํ๋ค (0) | 2025.03.04 |
---|---|
[Boj_22963] 3์ด ์ ๋ ฌ (0) | 2025.02.26 |
[Boj_2696] ์ค์๊ฐ ๊ตฌํ๊ธฐ (0) | 2025.02.15 |
[Boj_12014] ์ฃผ์, LIS (0) | 2025.02.11 |
[Boj_22254] ๊ณต์ ์ปจ์คํดํธ ํธ์ (1) | 2025.02.07 |