์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ
์ด๋ฆ๋ง ๋ค์ด๋ ์ฐธ ๊ธธ๋ค.
ํ์ง๋ง, ๊ทธ ์ด๋ฆ ์์ฒด์ ๋ชจ๋ ์๋ฏธ๊ฐ ๋ดํฌ๋์ด์๋ค.
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ์ด๋ 2๊ฐ์ ํฌ์ธํฐ๋ก ๋ฒ์๋ฅผ ์ง์ ํ ํ์ ๊ทธ ๋ฒ์๋ฅผ ์ ์งํ ์ฑ๋ก ์ด๋ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น์ทํ๊ณ ๊ทธ ์ฌ์ฉ๋ฒ ๋ํ ์ด๋ ต์ง ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ์ฌ์ฉํ๋๊ฐ?
๊ฐ์ธ์ ์ผ๋ก๋ ํ์์ ์์ด ์ข์ ํจ์จ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ณ ์ ๋จ์ํ๋ฅผ ์ํด์๋ผ๊ณ ์๊ฐ์ด ๋ ๋ค.
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ์ ์ฝ์ง๋ง, ๋ฌด์๊ณผ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ ๋ฐ๋ผ ๊ทธ ๋์ด๋๊ฐ ๋ฌ๋ผ์ง๋ค.
์๋ ์์ ์ฝ๋๋ก ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ์ ์์๋ฅผ ์ดํด๋ณด์.

์ผ๋ฐ์ ์ธ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ
ํด๋น ๋ฌธ์ ๋ ๋ฐฑ์ค 12891๋ฒ ๋ฌธ์ ๋ก, ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ค.
12891๋ฒ: DNA ๋น๋ฐ๋ฒํธ
ํ์์ ๋ฌธ์์ด์ ๊ฐ์ง๊ณ ๋ ธ๋ ๊ฒ์ ์ข์ํ๋ ๋ฏผํธ๋ DNA ๋ฌธ์์ด์ ์๊ฒ ๋์๋ค. DNA ๋ฌธ์์ด์ ๋ชจ๋ ๋ฌธ์์ด์ ๋ฑ์ฅํ๋ ๋ฌธ์๊ฐ {‘A’, ‘C’, ‘G’, ‘T’} ์ธ ๋ฌธ์์ด์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด “ACKA”
www.acmicpc.net
ํ์์ ์์ด ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๊ณ , ์ฌ๋ผ์ด์ฑ ๋ ๋ฐฐ์ด์ ๋ํ ์นด์ดํธ ์ฒ๋ฆฌ์ ๋ํ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ์ ์๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] checkArr;
static int[] myArr;
static int checkSecret;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int S = Integer.parseInt(st.nextToken());
int P = Integer.parseInt(st.nextToken());
int Result = 0;
char A[] = new char[S];
checkArr = new int[4];
myArr = new int[4];
checkSecret = 0;
A = bf.readLine().toCharArray();
st = new StringTokenizer(bf.readLine());
for(int i=0; i<4; i++) {
checkArr[i] = Integer.parseInt(st.nextToken());
if (checkArr[i] == 0) {
checkSecret++;
}
}
for (int i=0; i<P; i++) {
Add(A[i]);
}
if (checkSecret == 4) {
Result++;
}
for(int i=P; i<S; i++) {
int j = i-P;
Add(A[i]);
Remove(A[j]);
if (checkSecret == 4) {
Result++;
}
}
System.out.println(Result);
bf.close();
}
private static void Add(char c) {
switch (c) {
case 'A':
myArr[0]++;
if (myArr[0] == checkArr[0]) {
checkSecret++;
}
break;
case 'C':
myArr[1]++;
if (myArr[1] == checkArr[1]) {
checkSecret++;
}
break;
case 'G':
myArr[2]++;
if (myArr[2] == checkArr[2]) {
checkSecret++;
}
break;
case 'T':
myArr[3]++;
if (myArr[3] == checkArr[3]) {
checkSecret++;
}
break;
}
}
private static void Remove(char c) {
switch (c) {
case 'A':
if (myArr[0] == checkArr[0]) {
checkSecret--;
}
myArr[0]--;
break;
case 'C':
if (myArr[1] == checkArr[1]) {
checkSecret--;
}
myArr[1]--;
break;
case 'G':
if (myArr[2] == checkArr[2]) {
checkSecret--;
}
myArr[2]--;
break;
case 'T':
if (myArr[3] == checkArr[3]) {
checkSecret--;
}
myArr[3]--;
break;
}
}
}
๐ก ์ ์ฒด ๋ฌธ์์ด์์ ๋ถ๋ถ ๋ฌธ์์ด์ ํ์ํด์ผ ํ ๋, Add์ Remove ๋ฉ์๋๋ฅผ ํตํด ๋ถ๋ถ ๋ฌธ์์ด์ ๊ธธ์ด๋ ์ ์งํ๊ณ , ์กฐ๊ฑด์ ์ฒดํฌํด ์ค ์ ์๋ค.
๐กcheckArr์ myArr, ๊ทธ๋ฆฌ๊ณ checkSecret๋ผ๋ ๋ฐฐ์ด๊ณผ ์ ์ญ ๋ณ์๋ฅผ ํตํด ์กฐ๊ฑด์ ๊ฒํ ํ ์ ์๋ค
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ์ ํ์ฉ with Deque
ํ์๋ง ํ๋ค๋ฉด, ๊ต์ฅํ ์ฌ์ธ ๊ฒ์ด๋ค. ํ์ง๋ง, ์ด ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ์ ์ง์ ํ ํจ๊ณผ๋ Deque์ ํจ๊ป ์ฌ์ฉํ ๋ ๋ํ๋๋ค.
์ด ๋ Deque๋ ๋ฌด์์ธ๊ฐ?
Deque๋ ์๋ฐฉํฅ ํ๋ก ์์ชฝ์์ ์๋ฆฌ๋จผํธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ค.
๋ง์ฝ, ์ ์ฒด ๋ฐฐ์ด์์ ๊ฐ๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด์ ์ต์๊ฐ์ ์ฐพ์์ผ ํ ๋๋ฅผ ์๊ฐํด๋ณด์.
์ด ๋ ์ต์ ๊ฐ์ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ, ์ฆ ์ผ๋ฐ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋์ ํ ๋ nlog(N)์ด๋ผ๋ ์๊ฐ๋ณต์ก๋๊ฐ ์์๋๋ค.
๊ทธ๋์ ๋ฒ์๊ฐ ์ปค์ง๋ค๋ฉด, ์๊ฐ ๋ณต์ก๋ ๋ฉด์์ ํฐ ์ํด๋ฅผ ๋ณผ ์ ๋ฐ์ ์๋ค.(์ด๋ฅผ ๋ ธ๋ฆฐ ๋ฌธ์ ๋ค๋ ๋ง๋ค.)
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ๊ณผ Deque๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด, ๋ถ๋ถ ๋ฐฐ์ด์์ ์ต์ ๊ฐ์ ์ฐพ๋๋ฐ O(N)์ ์๊ฐ๋ณต์ก๋๋ฐ์ ๋ค์ง ์๋๋ค.
๊ทธ ์์ด๋์ด๋ ์๋์ ๊ฐ๋ค.
๐ก Deque์ ์ฒซ๋ฒ์งธ ์์์ ํญ์ ์ต์๊ฐ์ ๋๋ค๊ณ ์๊ฐํ์.
๐ก์๋กญ๊ฒ ๋ค์ด์ค๋ ๊ฐ๊ณผ Deque์ ๋ง์ง๋ง ์์์ ๋น๊ตํ๋ฉฐ, ๊ฐ์ฅ ์์ ๊ฐ์ด ์ฒซ ๋ฒ์งธ ์์๊ฐ ์ฌ ์ ์๋๋ก ํ๋ค.
๐ก ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ์ ํตํด ๋งจ ์๊ณผ ๋งจ ๋ค์ ์์์ ๊ฐ๊ฒฉ์ ํญ์ ์ ์งํด์ค๋ค.(Add์ Remove)
๊ด๋ จ๋ ์์ ๋ฌธ์ ๋ ๋ฐฑ์ค 11003๋ฒ ๋ฌธ์ ์ด๋ค.
11003๋ฒ: ์ต์๊ฐ ์ฐพ๊ธฐ
N๊ฐ์ ์ A1, A2, ..., AN๊ณผ L์ด ์ฃผ์ด์ง๋ค. Di = Ai-L+1 ~ Ai ์ค์ ์ต์๊ฐ์ด๋ผ๊ณ ํ ๋, D์ ์ ์ฅ๋ ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ด๋, i ≤ 0 ์ธ Ai๋ ๋ฌด์ํ๊ณ D๋ฅผ ๊ตฌํด์ผ ํ๋ค.
www.acmicpc.net
์๋๋ ํ์ด ์์์ด๋ค.
import java.io.*;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int L = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
Deque<Node> mydeque = new LinkedList<>();
for (int i=0; i<N; i++) {
int now = Integer.parseInt(st.nextToken());
while(!mydeque.isEmpty() && mydeque.getLast().value > now) {
mydeque.removeLast();
}
mydeque.addLast(new Node(i, now));
if (mydeque.getFirst().index <= i-L) {
mydeque.removeFirst();
}
bw.write(mydeque.getFirst().value+ " ");
}
bw.flush();
bw.close();
}
static class Node {
public int index;
public int value;
Node (int index, int value) {
this.index = index;
this.value = value;
}
}
}
๐ก BufferedReader์ BufferedWriter๋ฅผ ํตํด์ ๋ฒํผ๋ฅผ ์ฌ์ฉํด ์ ์ถ๋ ฅ ์์ ์๋๋ฅผ ์ต์ ํ ํ๋ค.
๐ก Deque์ ์์๋ฅผ Node๋ก ๋์ด index์ value๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค. ์ด๋ ์ถ๊ฐ์ ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ์ฝ๊ฒ ํ๋ค.
๐ก ์ฃผ์ด์ง ๋ฒ์์์ ๋ฒ์ด๋๋ค๋ฉด, ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ญ์ ํ์ฌ ์ด๋ฅผ ๋ง์ถฐ์ค๋ค.(์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ฒ)
Reference
- Do it! ์ฝ๋ฉ ํ ์คํธ - ๊ธฐ์ด ํธ
'๐ Knowledge > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(๋ณํฉ, ๊ธฐ์) ์๊ณ ๋ฆฌ์ฆ (3) (0) | 2023.08.18 |
|---|---|
| [์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(ํต ์ํธ) ์๊ณ ๋ฆฌ์ฆ (2) (0) | 2023.08.14 |
| [์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(๋ฒ๋ธ, ์ ํ, ์ฝ์ ) ์๊ณ ๋ฆฌ์ฆ (1) (0) | 2023.08.13 |
| [์๊ณ ๋ฆฌ์ฆ] ์คํ๊ณผ ํ์ ์ฌ์ฉ (0) | 2023.08.12 |
| [์๊ณ ๋ฆฌ์ฆ] ํฌ ํฌ์ธํฐ ์ฌ์ฉํ๊ธฐ (0) | 2023.08.10 |