728x90
반응형
2024.06.25기준 - 실버3
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 1학년과 2학년이 점호를 전부 받았을 때의 시간을 출력하는 문제입니다.
줄을 서는 인원의 순서는 들어온 순서대로 참조하지만,
k만큼 확인하는 인원은 순서에 상관없이 학년만 조사하기 때문에 1학년과 2학년을 정렬을 해서 문제에 접근했습니다.
1. 학생을 저장할 때에 qu에다가 저장합니다.
Queue<Integer> qu = new LinkedList<>(); // 학생을 저장할 큐
2. 확인하는 인원들은 따로 Deque를 선언해 저장을 해 주었습니다.
Deque<Integer> sub = new LinkedList<>(); // 확인하는 인원들을 저장하는 큐
3. 반복문을 통해 확인하는 인원 수가 k보다 작다면 qu에 있는 인원에서 채워주도록 했습니다.
while (sub.size() < k) { // 확인하는 인원 수 채워주기
if (qu.size() == 0) { // k보다 인원이 적다면 break
break;
}
num = qu.poll();
if (num == 1) { // 1이면 앞쪽에 적재
sub.addFirst(num);
} else { // 2면 뒷쪽에 적재
sub.addLast(num);
}
}
4. 채워줄 때에는 1학년은 앞쪽으로 2학년은 뒤쪽으로 저장을 해 주었습니다.
if (num == 1) { // 1이면 앞쪽에 적재
sub.addFirst(num);
} else { // 2면 뒷쪽에 적재
sub.addLast(num);
}
5. 첫번째 값과 마지막 값이 같으면 학년이 같다는 말이므로 첫번째 값만 제거를 해주었습니다.
if (sub.peekFirst() == sub.peekLast()) { // 학년이 하나 밖에 없다면
sub.pollFirst();
}
6. 첫번째 값과 마지막 값이 다르다면 1학년과 2학년이 있다는 말이므로 첫번째와 마지막 값을 제거 해주었습니다.
else { // 1학년, 2학년 둘 다 있다면
sub.pollFirst();
sub.pollLast();
}
7. 모든 학생이 점호를 마치면 멈추고 count수를 출력해 주었습니다.
if (sub.size() == 0 && qu.size() == 0) { // 모든 인원이 전부 점호를 받았으면 break
break;
}
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()); // 학생 수
int k = Integer.parseInt(st.nextToken()); // 확인하는 인원 수
Queue<Integer> qu = new LinkedList<>(); // 학생을 저장할 큐
st = new StringTokenizer(br.readLine());
while (n-- > 0) {
qu.add(Integer.parseInt(st.nextToken()));
}
Deque<Integer> sub = new LinkedList<>(); // 확인하는 인원들을 저장하는 큐
int count = 0, num;
while (true) {
count++;
num = 0;
while (sub.size() < k) { // 확인하는 인원 수 채워주기
if (qu.size() == 0) { // k보다 인원이 적다면 break
break;
}
num = qu.poll();
if (num == 1) { // 1이면 앞쪽에 적재
sub.addFirst(num);
} else { // 2면 뒷쪽에 적재
sub.addLast(num);
}
}
if (sub.peekFirst() == sub.peekLast()) { // 학년이 하나 밖에 없다면
sub.pollFirst();
} else { // 1학년, 2학년 둘 다 있다면
sub.pollFirst();
sub.pollLast();
}
if (sub.size() == 0 && qu.size() == 0) { // 모든 인원이 전부 점호를 받았으면 break
break;
}
}
bw.write(Integer.toString(count));
bw.flush();
bw.close();
br.close();
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 29198번 이번에는 C번이 문자열 (0) | 2024.06.27 |
---|---|
BAEKJOON / 백준 - JAVA 31845번 카드 교환 (0) | 2024.06.26 |
BAEKJOON / 백준 - JAVA 1389번 케빈 베이컨의 6단계 법칙 (0) | 2024.06.24 |
BAEKJOON / 백준 - JAVA 14231번 박스 포장 (0) | 2024.06.23 |
BAEKJOON / 백준 - JAVA 31946번 죽음의 등굣길 (0) | 2024.06.22 |