Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions src/main/java/com/doit/algorithm/kdg/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.doit.algorithm.kdg;

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

public class Main {

public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 9
int len = Integer.parseInt(st.nextToken()); // 8
String words = br.readLine(); // DNA 문자열
String s = br.readLine(); // 포함 갯수

int result = solution(n, len, words, s);

System.out.println(result);
}

public static int solution(int n, int len, String s, String max) {
int result = 0;
char[] words = new char[n];
int[] includes = new int[4];
int[] myIncludes = new int[4];

for (int i = 0; i < s.length(); i++) {
words[i] = s.charAt(i);
}

String[] split = max.split(" ");
for (int i = 0; i < split.length; i++) {
includes[i] = Integer.parseInt(split[i]);
}

char[] move = move(0, len, words);
add(move, myIncludes);
boolean checked = checked(myIncludes, includes);
if (checked) result++;

for (int i = len; i < n; i++) {
int next = n - len;
move = move(next, len, words);
init(myIncludes);
add(move, myIncludes);
checked = checked(myIncludes, includes);
if (checked) result++;
}

return result;
}

private static char[] move(int start, int end, char[] words) {
char[] result = new char[end];
int index = 0;

for (int i = start; i < start + end; i++) {
result[index++] = words[i];
}
return result;
}

private static void add(char[] move, int[] myIncludes) {
for (int i = 0; i < move.length; i++) {
switch (move[i]) {
case 'A':
myIncludes[0]++;
break;
case 'C':
myIncludes[1]++;
break;
case 'G':
myIncludes[2]++;
break;
case 'T':
myIncludes[3]++;
break;
default:
throw new IllegalArgumentException();
}
}
Comment on lines +65 to +82
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

윈도우 안에 들어있는 값을 전부 비교해서 시간초과가 나는 것 같습니다. 윈도우를 한칸씩 옮기면서 마지막에 들어온 값에 대해서만 값을 비교하면 시간안에 성공할 것 같습니다.

}

private static void init(int[] myIncludes) {
for (int i = 0; i < myIncludes.length; i++) {
myIncludes[i] = 0;
}
}

private static boolean checked(int[] myIncludes, int[] includes) {
return myIncludes[0] == includes[0] &&
myIncludes[1] == includes[1] &&
myIncludes[2] == includes[2] &&
myIncludes[3] == includes[3];
}
}
80 changes: 80 additions & 0 deletions src/main/java/com/doit/algorithm/kdg/Problem009.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.doit.algorithm.kdg;

public class Problem009 {

public static int solution(int n, int len, String s, String max) {
int result = 0;
char[] words = new char[n];
int[] includes = new int[4];
int[] myIncludes = new int[4];

for (int i = 0; i < s.length(); i++) {
words[i] = s.charAt(i);
}

String[] split = max.split(" ");
for (int i = 0; i < split.length; i++) {
includes[i] = Integer.parseInt(split[i]);
}

char[] move = move(0, len, words);
add(move, myIncludes);
boolean checked = checked(myIncludes, includes);
if (checked) result++;

for (int i = len; i < n; i++) {
int next = n - len;
move = move(next, len, words);
init(myIncludes);
add(move, myIncludes);
checked = checked(myIncludes, includes);
if (checked) result++;
}

return result;
}

private static char[] move(int start, int end, char[] words) {
char[] result = new char[end];
int index = 0;

for (int i = start; i < start + end; i++) {
result[index++] = words[i];
}
return result;
}

private static void add(char[] move, int[] myIncludes) {
for (int i = 0; i < move.length; i++) {
switch (move[i]) {
case 'A':
myIncludes[0]++;
break;
case 'C':
myIncludes[1]++;
break;
case 'G':
myIncludes[2]++;
break;
case 'T':
myIncludes[3]++;
break;
default:
throw new IllegalArgumentException();
}
}
}

private static void init(int[] myIncludes) {
for (int i = 0; i < myIncludes.length; i++) {
myIncludes[i] = 0;
}
}

private static boolean checked(int[] myIncludes, int[] includes) {
return myIncludes[0] == includes[0] &&
myIncludes[1] == includes[1] &&
myIncludes[2] == includes[2] &&
myIncludes[3] == includes[3];
}
}
32 changes: 32 additions & 0 deletions src/test/java/com/doit/algorithm/kdg/Problem009Test.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.doit.algorithm.kdg;

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class Problem009Test {

@Test
void solution_1() {
int n = 9;
int len = 8;
String s = "CCTGGATTG";
String includes = "2 0 1 1";

int result = Problem009.solution(n, len, s, includes);

assertThat(result).isEqualTo(0);
}

@Test
void solution_2() {
int n = 4;
int len = 2;
String s = "GATA";
String includes = "1 0 0 1";

int result = Problem009.solution(n, len, s, includes);

assertThat(result).isEqualTo(2);
}
}