https://www.acmicpc.net/problem/18513
๋ฌธ์
- ์ผ์ง์ ์์ ๊ณต๊ฐ์ N๊ฐ์ ์ํฐ๊ฐ ์กด์ฌํ๋ฉฐ, K์ฑ์ ์ง์ ์ง๊ณ ์ ํ๋ค. ๋ชจ๋ ์ํฐ ๋ฐ ์ง์ด ์กด์ฌํ๋ ์์น๋ ํญ์ ์ ์ ํํ์ด๋ค.
- ์ด๋ ์ผ์ง์ ์์ ๊ณต๊ฐ์์ N๊ฐ์ ์ํฐ ๋ฐ K์ฑ์ ์ง๋ค์ ๋ชจ๋ ์๋ก ๋ค๋ฅธ ์์น์ ์กด์ฌํ๋ค.
- K์ฑ์ ์ง์ ์ง์ ๋, ๊ฐ๋ฅํ๋ฉด ์ํฐ์ ์ฃผ๋ณ์ ์ง๋ค์ ์ง์ด์ K์ฑ์ ๋ชจ๋ ์ง์ ๋ํ ๋ถํ๋์ ํฉ์ด ์ต์๊ฐ ๋๋๋ก ์ง๊ณ ์ ํ๋ค.
- ๋ถํ๋๋, ๊ฐ์ฅ ๊ฐ๊น์ด ์ํฐ๊น์ง์ ๊ฑฐ๋ฆฌ(Distance)๋ก ์ ์๋๋ค.
- ๋ชจ๋ ์ง์ ๋ํ ๋ถํ๋์ ํฉ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
์ ํ์ฌํญ
- 1 ≤ N, K ≤ 100,000
- 100,000,000 ≤ ์ํฐ์ ์์น ≤ 100,000,000
ํ์ด
- BFS ํ์
๋ถํ๋์ ํฉ์ด ์ต์๊ฐ ๋๋ ค๋ฉด, ์ง๋ค์ ์ต๋ํ ์ํฐ์ ๊ฐ๊น๊ฒ ์ง์ด์ผ ํ๋ค. ์ํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก +1์ฉ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ด์ง๋ฏ๋ก, ๋ชจ๋ ์ํฐ์ ๋ํด +1์ฉ ์ง์ ์์น๋ฅผ ์์ง์ด๋ฉฐ ์ง์ ์ง์ด์ฃผ๋ฉด ๋๋ค.
ํ์ ๋ชจ๋ ์ง์ ์ขํ๋ฅผ ๋ด๊ณ , ํ์ ์ฌ์ด์ฆ๋งํผ ๋์ด์ ํ์์ ํ๋๋ก ํ๋ฉด, ๊ฐ์ ๊ฑฐ๋ฆฌ ๋งํผ ๋์ด์ ํ์์ ํ ์ ์๊ณ , ๊ฑฐ๋ฆฌ์ ํฉ์ธ ๋ถํ๋๋ฅผ ๊ฐ์ด ๊ณ์ฐํ ์ ์๋ค.
- ์ํฐ๊ณผ ์ง์ด ์๋์ง ์ฌ๋ถ ์ ์ฅ : Set
๋ชจ๋ ์ํฐ์ ๋ชจ๋ ์ง์ด ์๋ก ๋ค๋ฅธ ์์น์ ์กด์ฌํ๋ฏ๋ก, ํ์์ ํ ๋๋ง๋ค ํด๋น ์์น์ ์ํฐ๋ ์ง์ด ์๋์ง ํ์ธ์ ํด์ค์ผ ํ๋ค.
๋ณดํต ๊ทธ๋ํ ํ์์์ visited๋ผ๋ booleanํ์ ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ๋ง๋ค์ด์ ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐ ํ์ธ์ ํ๋ค. ํ์ง๋ง, ์ด ๋ฌธ์ ์์๋ ์ํฐ์ ์์น์ ๋ฒ์๊ฐ -100,000,000 ~ 100,000,000 ์ผ๋ก, ์ด๊ฒ์ ๋ฐฐ์ด๋ก ์ฎ๊ฒจ ํํํ๋ค๋ฉด ๋ฌด๋ ค ์ฝ 2์ต๋งํผ์ ํฌ๊ธฐ๊ฐ ํ์ํ๋ค. ๋๋ฌด๋๋ฌด ํฐ ์ซ์์ด๋ค.. ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ ๊ฒ์ด๋ค!
์ง๊ณผ ์ํฐ์ ๊ฐ์๋ ์ต๋ 10๋ง์ผ๋ก, ๋ฐฉ๋ฌธ ์ฒดํฌ์ 2์ต๋งํผ์ ๋ค ์ฐ์ง ์์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ Set์ผ๋ก ๋ฐ๊ฟ ์ ์ฅํ๊ณ , ํด๋น ์์น์ ์๋์ง๋ฅผ ํ์ธํ๋๋ก ํ๋ค.
์ฝ๋
package algorithm;
import java.io.*;
import java.util.*;
public class BOJ_์ํฐ {
static int[] dx = {-1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] arr = new int[N]; //์ํฐ ์์น ์ ์ฅ
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
System.out.println(bfs(arr, K));
}
public static long bfs(int[] arr, int k) {
Queue<Integer> queue = new LinkedList<>(); //ํ์์ ์ํ ํ
HashSet<Integer> visited = new HashSet<>(); //์ง์ด ์๋์ง ์ ์ฅ
for(int water : arr) { //์ํฐ ์์น๋ฅผ ํ์ ๋ฃ์
queue.add(water);
visited.add(water);
}
int house = 0; //์ง์ ์ง์ ๊ฐ์
long sum = 0; //๋ถํ๋ ํฉ
int dist = 1; //๊ฑฐ๋ฆฌ
while(!queue.isEmpty()) {
int size = queue.size();
for(int s = 0; s < size; s++) { //๊ฑฐ๋ฆฌ๋ณ๋ก ๋์ด์ ํ์
int x = queue.poll();
for(int d = 0; d < 2; d++) {
int nx = x + dx[d];
if(!visited.contains(nx)) { //์ง์ด ์์
queue.add(nx);
visited.add(nx);
house++;
sum += dist;
if(house == k) return sum; //k๊ฐ ๋งํผ ์ง ์ง์
}
}
}
dist++; //๊ฑฐ๋ฆฌ ์ฆ๊ฐ
}
return sum;
}
}
๊ฒฐ๊ณผ
์์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋ visited๋ฅผ 2์ต ๊ฐ์ ๋ฐฐ์ด๋ก ๋ง๋ค์์ ๊ฒฝ์ฐ๋ก ์ํ์ผ์ ๋๋ ค๋ดค์ ๋์ธ๋ฐ ์ญ์ ํฐ์ง๋ค.
๋ฐฐ์ด์
- ์ขํ ๋ฒ์๊ฐ ๋์ ๋๋ ๋ฐฐ์ด ๋ง๊ณ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฐ์
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1937๋ฒ : ์์ฌ์์ด ํ๋ค (0) | 2024.01.26 |
---|---|
๋ฐฑ์ค 15486๋ฒ : ํด์ฌ2 (0) | 2024.01.14 |
๋ฐฑ์ค 20440๋ฒ : ๐ต๋๊ฐ ์ซ์ด ์ซ์ด ๋๋ฌด ์ซ์ด ์ซ์ด ์ค์ง ๋ง ๋ด๊ฒ ์ฐ์ฉ๋์ง๋ง๐ต - 1 (0) | 2024.01.13 |
๋ฐฑ์ค 1749๋ฒ : ์ ์๋ฐ๋จน๊ธฐ (0) | 2024.01.12 |
๋ฐฑ์ค 14846๋ฒ : ์ง์ฌ๊ฐํ๊ณผ ์ฟผ๋ฆฌ (0) | 2024.01.12 |