[백준 2531 : JAVA] 회전 초밥 / 투 포인터
문제

풀이
투 포인터 알고리즘 기본 유형에 속하는 문제다.
해당 문제에서 유심히 봐둬야할 것은 모듈러(%) 연산을 통해 N-1을 넘어가는 인덱스부터는 0으로 계산되도록 처리한 부분이다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); private static int N, d, k, c; private static int[] arr; private static int[] eat; public static void main(String[] args) throws IOException { StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); d = Integer.parseInt(st.nextToken()); k = Integer.parseInt(st.nextToken()); c = Integer.parseInt(st.nextToken()); eat = new int[d + 1]; arr = new int[N]; for (int i = 0; i < N; i++) { arr[i] = Integer.parseInt(br.readLine()); } System.out.println( twoPointers() ); br.close(); } private static int twoPointers() { int count = 0, max; for (int i = 0; i < k; i++) { if (eat[ arr[i] ] == 0) count++; // 처음 먹어보는 종류의 초밥이라면 카운트 + 1 eat[ arr[i] ]++; } max = count; for (int i = 1; i < N; i++) { if (max <= count) { if (eat[ c ] == 0) max = count + 1; else max = count; } eat[ arr[i - 1] ]--; if (eat[ arr[i - 1] ] == 0) count--; if (eat[ arr[(i + k - 1) % N]] == 0) count++; eat[ arr[(i + k - 1) % N]]++; } return max; } }
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준 6549 : JAVA] 히스토그램에서 가장 큰 직사각형 / 세그먼트 트리 +분할정복 (0) | 2020.11.02 |
---|---|
[백준 2842 : JAVA] 집배원 한상덕 / BFS + 투 포인터 (0) | 2020.10.27 |
[백준 1854 : JAVA] K번째 최단경로 찾기 / 다익스트라 (1) | 2020.10.23 |
[백준 1238 : JAVA] 파티 / 다익스트라 (0) | 2020.10.22 |
[백준 2610 : JAVA] 회의준비 / 플로이드 와샬 + DFS (0) | 2020.10.18 |
댓글
이 글 공유하기
다른 글
-
[백준 6549 : JAVA] 히스토그램에서 가장 큰 직사각형 / 세그먼트 트리 +분할정복
[백준 6549 : JAVA] 히스토그램에서 가장 큰 직사각형 / 세그먼트 트리 +분할정복
2020.11.02 -
[백준 2842 : JAVA] 집배원 한상덕 / BFS + 투 포인터
[백준 2842 : JAVA] 집배원 한상덕 / BFS + 투 포인터
2020.10.27문제 풀이 문제를 이해하는데 시간이 좀 걸렸다. 최단 경로에서 고도 차가 아니라, 가장 낮은 고도차(피로도가 가장 적은)를 구하는 문제. 먼저, 입력받은 고도에 대해 중복없이 배열(리스트)에 저장한 후, 정렬한다. 정렬된 고도 값을 담은 1차원 배열에 대해 투 포인터를 잡고, BFS 탐색 조건을 건다. 1) 다음으로 탐색할 땅의 고도가 투 포인터로 잡은 최저 고도보다 크거나 같고, 최고 고도보다 작거나 같다. 위의 탐색 조건으로 탐색을 끝낸 후, 모든 집을 방문했는지 여부를 확인한 다음 고도 차를 저장해 나간다. 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java…. -
[백준 1854 : JAVA] K번째 최단경로 찾기 / 다익스트라
[백준 1854 : JAVA] K번째 최단경로 찾기 / 다익스트라
2020.10.23문제 풀이 다익스트라 알고리즘 응용 문제다. 일반적으로 다익스트라에서 다른 모든 노드로의 최단경로 비용을 저장하기 위해 int형 1차원 배열을 사용하는데 반해, 우선순위 큐 타입의 1차원 배열을 사용해야 하는게 포인트다. 우선순위 큐의 용량을 K개로 할당한 후, 내림차순으로 정렬을 조정해주면 우선순위 큐의 가장 앞의 원소가 K번 째 최단경로의 비용이 된다. 코드 import java.util.*; import java.io.*; public class Main { private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); private static int N, M, K; private static List… -
[백준 1238 : JAVA] 파티 / 다익스트라
[백준 1238 : JAVA] 파티 / 다익스트라
2020.10.22문제 풀이 다익스트라 알고리즘의 기본 유형에 해당하는 문제이다. 위 예제를 그래프로 나타내면 아래와 같다. 2번 노드를 기준으로 one-to-all 최단거리 비용을 구하는 알고리즘인 다익스트라 알고리즘을 사용해야 한다. 이때, 두 가지 경우가 있다. 파티에 참석하러 가는 경우 (다른 모든 노드들에 대해서 2번 노드로 가는 최단거리) 파티가 끝나고 다시 집으로 돌아오는 경우 (2번 노드에 대해서 다른 모든 노드들에 대한 최단거리) 위 두 가지 경우 중, 두 번째 경우는 별다른 고민없이 one-to-all인 다익스트라 알고리즘을 사용하면 된다. 생각해볼 경우는 첫 번째 경우인데, 2번 노드를 목적지로 생각하게 되면 1, 3, 4번 노드 각각에 모두 다익스트라를 사용해야 한다. 이런 비효율적인 방법 대신, 단…
댓글을 사용할 수 없습니다.