728x90
반응형
2024.07.22기준 - 실버2
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 입력된 배열에서 연속된 인덱스로 2가지의 과일만 꽂혀있을 때, 가장 긴 탕후루를 만드는 문제입니다.
1. 입력된 과일을 우선 Queue에다가 저장을 했습니다.
static Queue<Integer> fruit;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine()); // 과일의 개수
StringTokenizer st = new StringTokenizer(br.readLine()); // 과일들
// 과일을 저장하는 배열
fruit = new LinkedList<>();
for (int i = 0; i < n; i++) {
fruit.add(Integer.parseInt(st.nextToken()));
}
}
2. 큐에다가 저장된 과일을 이용해 함수를 생성해서 진행했습니다.
// 탕후루에 꽂혀있는 과일 수의 최대값을 계산하는 함수.
private static void function() {
Deque<Integer> qu = new LinkedList<>();
int[] count = new int[10];
boolean[] check = new boolean[10];
while (!fruit.isEmpty()) {
qu.add(fruit.poll());
count[qu.peekLast()]++; // 과일이 꽂여있는 개수
check[qu.peekLast()] = true; // 과일이 꽂여 있다면 true
if (check(check)) { // 과일이 2개만 있다면
max = Math.max(max, qu.size());
} else { // 과일이 2개 초과한다면
int num = 0;
// 하나의 과일이 없어질 때 까지 반복
while (true) {
num = qu.pollFirst();
count[num]--;
if (count[num] == 0) {
check[num] = false;
break;
}
}
}
}
}
2-1. 계산을 할 과일들만 담을 빈 Deque를 생성했습니다.
2-2. 빈 꼬치에 저장된 과일을 앞에서 부터 차례로 꽂습니다.
2-2. 꼬치에 과일이 꽂일 때 마다, 과일의 수를 저장하는 int[]을 ++해주면서, 과일이 1개라도 있으면 check[]에 true로 저장했습니다.
2-3. 여기서 추가로 과일의 개수를 확인하는 함수를 생성했습니다.
// 현재 꽂여있는 과일이 몇 개인지 확인하는 함수.
private static boolean check(boolean[] c) {
int count = 0;
for (int i = 1; i < 10; i++) {
if (c[i]) {
count++;
}
if (count > 2) {
break;
}
}
// 과일이 2개 초과면 false 2개 이하면 true
return count > 2 ? false : true;
}
true로 반환된다면 과일의 개수가 2개 이하이기 때문에, 최대값과 비교해 max값을 정해줍니다.
2-4. 만약 false를 반환한다면, 꼬지에 있는 과일 중 앞에서 부터 차례로 빼면서, 과일의 개수가 2개가 될 때까지 반복해줍니다.
3. 이렇게 계산된 최대값을 출력하여 마무리 합니다.
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
static int max, n;
static Queue<Integer> fruit;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(br.readLine()); // 과일의 개수
StringTokenizer st = new StringTokenizer(br.readLine()); // 과일들
max = 0;
// 과일을 저장하는 배열
fruit = new LinkedList<>();
for (int i = 0; i < n; i++) {
fruit.add(Integer.parseInt(st.nextToken()));
}
function();
bw.write(Integer.toString(max));
bw.flush();
bw.close();
br.close();
}
// 탕후루에 꽂혀있는 과일 수의 최대값을 계산하는 함수.
private static void function() {
Deque<Integer> qu = new LinkedList<>();
int[] count = new int[10];
boolean[] check = new boolean[10];
while (!fruit.isEmpty()) {
qu.add(fruit.poll());
count[qu.peekLast()]++; // 과일이 꽂여있는 개수
check[qu.peekLast()] = true; // 과일이 꽂여 있다면 true
if (check(check)) { // 과일이 2개만 있다면
max = Math.max(max, qu.size());
} else { // 과일이 2개 초과한다면
int num = 0;
// 하나의 과일이 없어질 때 까지 반복
while (true) {
num = qu.pollFirst();
count[num]--;
if (count[num] == 0) {
check[num] = false;
break;
}
}
}
}
}
// 현재 꽂여있는 과일이 몇 개인지 확인하는 함수.
private static boolean check(boolean[] c) {
int count = 0;
for (int i = 1; i < 10; i++) {
if (c[i]) {
count++;
}
if (count > 2) {
break;
}
}
// 과일이 2개 초과면 false 2개 이하면 true
return count > 2 ? false : true;
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 1058번 친구 (3) | 2024.07.23 |
---|---|
정보처리산업기사 - 테스트 및 배포 - 결함 관리 (0) | 2024.07.23 |
BAEKJOON / 백준 - JAVA 31868번 수박 게임 (0) | 2024.07.21 |
BAEKJOON / 백준 - JAVA 31844번 창고지기 (0) | 2024.07.20 |
BAEKJOON / 백준 - JAVA 31867번 홀짝홀짝 (0) | 2024.07.19 |