알고리즘
백준 15565번 귀여운 라이언 (JAVA)
박카스마시며코딩
2022. 4. 25. 18:51
https://www.acmicpc.net/problem/15565
15565번: 귀여운 라이언
꿀귀 라이언 인형과, 마찬가지로 꿀귀인 어피치 인형이 N개 일렬로 놓여 있다. 라이언 인형은 1, 어피치 인형은 2로 표현하자. 라이언 인형이 K개 이상 있는 가장 작은 연속된 인형들의 집합의
www.acmicpc.net
저는 해당 문제를 투포인터를 활용하여 문제를 해결하였습니다.
시작지점과 끝지점을 가리키고 이 사이에 라이언 인형이 몇개 존재하는지를 확인하고, 이것이 k랑 같을 때의 ei와si의 차이가 가장 작은 것을 리턴하였습니다.
시간복잡도 : O(n)
package BOJ;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_15565 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int k = stoi.apply(st.nextToken());
int[] arr = new int[n];
st = new StringTokenizer(br.readLine()," ");
for(int i = 0 ; i < n ; i++){
arr[i] = stoi.apply(st.nextToken());
}
System.out.println(solution(n,k,arr));
}
private static final int LION = 1;
private static final int APEACH = 0;
private static final int INF = 987654321;
public static int solution(int n,int k, int[] arr){
int si = 0;
int ei = 0;
int lineCnt = 0;
int result = INF;
while(ei <= n){
if(lineCnt < k){
if(ei == n){
break;
}
if(arr[ei++] == LION){
lineCnt++;
}
continue;
}
if(lineCnt == k){
result = Math.min(result, ei-si);
}
if(arr[si++] == LION){
lineCnt--;
}
}
if(result == INF){
return -1;
}
return result;
}
}