https://www.acmicpc.net/problem/12891

 

12891๋ฒˆ: DNA ๋น„๋ฐ€๋ฒˆํ˜ธ

ํ‰์†Œ์— ๋ฌธ์ž์—ด์„ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ๋ฏผํ˜ธ๋Š” DNA ๋ฌธ์ž์—ด์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. DNA ๋ฌธ์ž์—ด์€ ๋ชจ๋“  ๋ฌธ์ž์—ด์— ๋“ฑ์žฅํ•˜๋Š” ๋ฌธ์ž๊ฐ€ {โ€˜Aโ€™, โ€˜Cโ€™, โ€˜Gโ€™, โ€˜Tโ€™} ์ธ ๋ฌธ์ž์—ด์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด โ€œACKAโ€

www.acmicpc.net

 

 

 

 

 

๋ถ€๋ถ„๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋กœ ์ฒ˜์Œ์—๋Š” for๋ฌธ์„ ์ค‘์ฒฉํ•ด์„œ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค. ์ž…๋ ฅ๋˜๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€ 1,000,000(๋ฐฑ๋งŒ)์ด๋‹ค. for๋ฌธ์„ ์ค‘์ฒฉํ•ด์„œ ๋Œ๋ฆฐ๋‹ค๋ฉด O(n^2) ์•ฝ 1,000,000(๋ฐฑ๋งŒ) * 1,000,000(๋ฐฑ๋งŒ) = ์–ต ๋‹จ์œ„๊ฐ€ ๋„˜์–ด๊ฐ€์„œ 1์ดˆ ์•ˆ์— ํ’€์ง€ ๋ชปํ•œ๋‹ค...

 

 

 

 

 

์‹คํŒจ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int s = Integer.parseInt(st.nextToken());
		int p = Integer.parseInt(st.nextToken());
	
		char[] S = br.readLine().toCharArray();
		
		st = new StringTokenizer(br.readLine(), " ");
		int a = Integer.parseInt(st.nextToken());
		int c = Integer.parseInt(st.nextToken());
		int g = Integer.parseInt(st.nextToken());
		int t = Integer.parseInt(st.nextToken());
	
		//๊ตฌํ˜„
		int answer = 0;
		for(int i = 0; i <= s - p; i++) {
			int a_count = 0, c_count = 0, g_count = 0, t_count = 0;
			for(int j = 0; j < p; j++) {
				switch(S[i + j]) {
				case 'A':
					a_count++;
					break;
				case 'C':
					c_count++;
					break;
				case 'G':
					g_count++;
					break;
				case 'T':
					t_count++;
					break;
				}
			}
			
			if(a_count >= a && c_count >= c && g_count >= g && t_count >= t) {
				answer++;
			}
		}
	
		//์ถœ๋ ฅ
		System.out.println(answer);
	}

}

 

 

 

 

 

 

์ด์ค‘ for๋ฌธ์„ ์“ฐ๋Š” O(n^2)์˜ ์‹œ๊ฐ„์„ O(n)์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์ด๋‹ค.

2 ~ i+1๊นŒ์ง€์˜ ํ•ฉ = 1~i๊นŒ์ง€์˜ ํ•ฉ + (i + 1)๋ฒˆ์งธ ์›์†Œ - 1๋ฒˆ์งธ ์›์†Œ .. ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐฑ์‹ ํ•ด๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.

 

๋กœ์ง์€ ์ด๊ฑธ ์ฐธ๊ณ ๋ฅผ ํ–ˆ๋‹ค.

https://hanyeop.tistory.com/356

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํˆฌ ํฌ์ธํ„ฐ, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž๋ฐ” ๊ตฌํ˜„ (๋ฐฑ์ค€ 2003, 2559)

ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€? โ–ถ 1์ฐจ์› ๋ฐฐ์—ด์— ์กด์žฌํ•˜๋Š” ์ˆœ์ฐจ์  ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ ๋‘๊ฐœ์˜ ์ ์„ ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต ์—ฐ์‚ฐ์„ ์ค„์ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ˆ์‹œ ๋ฌธ์ œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•Œ์•„๋ณด์ž. ๋ฌธ์ œ : https://www.acmi

hanyeop.tistory.com

 

 

 

 

 

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int s = Integer.parseInt(st.nextToken());
		int p = Integer.parseInt(st.nextToken());
	
		char[] S = br.readLine().toCharArray();
		
		st = new StringTokenizer(br.readLine(), " ");
		int a = Integer.parseInt(st.nextToken());
		int c = Integer.parseInt(st.nextToken());
		int g = Integer.parseInt(st.nextToken());
		int t = Integer.parseInt(st.nextToken());
	
		//๊ตฌํ˜„
		//๊ฐ ๊ตฌ๊ฐ„ ๋ณ„๋กœ ์ฒดํฌ
		int answer = 0;
		int a_count = 0, c_count = 0, g_count = 0, t_count = 0;
		
		for(int i = 0; i < s; i++) {
			switch(S[i]) { //์ƒˆ๋กœ์šด ๋ฌธ์ž ์กฐ๊ฑด ๊ฐฑ์‹ 
			case 'A':
				a_count++;
				break;
			case 'C':
				c_count++;
				break;
			case 'G':
				g_count++;
				break;
			case 'T':
				t_count++;
				break;
			}
			
			if(i == p - 1) { //๊ฐ€์žฅ ์ฒ˜์Œ ์•”ํ˜ธ๋ฌธ ํŒ๋‹จ
				if(a_count >= a && c_count >= c && g_count >= g && t_count >= t) {
					answer++;
				}
			}
			
			if(i >= p) { //์ด์ „ ๋ฌธ์ž ์กฐ๊ฑด ๊ฐฑ์‹ 
				switch(S[i - p]) {
				case 'A':
					a_count--;
					break;
				case 'C':
					c_count--;
					break;
				case 'G':
					g_count--;
					break;
				case 'T':
					t_count--;
					break;
				}
				
				if(a_count >= a && c_count >= c && g_count >= g && t_count >= t) {
					answer++;
				}
			}
		}
	
		//์ถœ๋ ฅ
		System.out.println(answer);
	}

}

 

 

 

 

 

 

๊ฒฐ๊ณผ

 

giraffe_