티스토리 뷰
https://www.acmicpc.net/problem/17178
17178번: 줄서기
아이즈원의 팬인 시온이는 드디어 티켓팅에 성공하여 콘서트를 갔다. 콘서트장에 일찍 도착한 시온이는 기대하며 입장을 위해 줄을 섰다. 하지만 아이즈원의 인기대로 시온이를 포함한 많은
www.acmicpc.net

문제
아이즈원의 팬인 시온이는 드디어 티켓팅에 성공하여 콘서트를 갔다. 콘서트장에 일찍 도착한 시온이는 기대하며 입장을 위해 줄을 섰다. 하지만 아이즈원의 인기대로 시온이를 포함한 많은 팬이 줄을 서고 있다. 콘서트의 입장이 시작되었고 입장은 티켓 번호 순서대로 이루어졌다. 하지만 입구에 너무 많은 팬이 몰려 아무도 이동할 수 없는 상황이 되었고, 결국 주최 측에서 인원을 정렬시켜 다음과 같이 간신히 사람 한 줄이 설 수 있는 대기 공간을 만들었다.
주최 측은 번호표 순서대로만 통과할 수 있는 입구를 만들어 두었지만, 줄에서는 마구잡이로 사람들이 기다리고 있다. 대기 공간을 이용하여 입장이 원활히 이루어지도록 하려고 한다. 콘서트장에 사람들이 제대로 들어갈 수 있는지 확인해보자.
사람들은 현재 5명씩 N 줄을 서 있고, 첫 번째 줄 맨 앞사람만 이동이 가능하다. 이 사람은 콘서트장으로 입장할 수도 있고 대기 공간에서 다시 기다릴 수도 있다. 한 줄의 사람이 다 이동했다면 그다음 줄의 사람들이 이동한다. 대기 공간에는 한 줄로만 설 수 있는 공간이 있으며, 마지막에 들어온 사람부터 나갈 수 있다. 나갈 경우 바로 입장해야 하고, 다시 줄로 돌아갈 수는 없다. 티켓은 A-123과 같이 한 개의 대문자 알파벳과 '-', 1000 미만의 자연수의 조합으로 이뤄어져 있다. 만약 수가 7이라면 A-7과 같이 주어진다. 티켓의 순서는 알파벳이 빠른 티켓이 빠르며, 동일하다면 더 적은 수가 더 빠르다. 티켓 번호는 중복되게 주어지지 않는다.
위의 예시를 예로 들면 다음과 같이 모든 사람들이 입장할 수 있다. 그림과는 달리 대기 공간에는 무한히 많은 사람들이 들어올 수 있다는 것에 주의하여야 한다.
유형 : 자료구조 + 구현
접근 방식
- 사용해야 하는 자료구조 판단
- 사람들이 입장을 위해 선줄은 무엇일까 ? : Queue (FIFO)
- 사람들이 대기하는 공간 ? : Stack (LIFO)
- 주어지는 입력을 정렬해야 한다. 결국 순서대로 입장을 해야 하기 때문에
- 정렬 기준 : 알파벳 오름 차순 + 숫자 오름차순
- 동작과정
- 현재 idx 번째 사람을 찾을때까지 반복한다.
- 먼저 스택을 확인한다. : 스택은 peek을 통해 가장 위에만 확인하도록 한다. 앞사람이 나가야지만 다른 사람이 나갈 수 있기 때문
- 스택에서 찾지 못했다면 큐를 확인한다.
- 큐가 빌때까지 반복문을 돌려서
- 찾을 경우 탐색 종료
- 못찾은 대상은 대기 공간(스택) 에 추가
- 큐가 빌때까지 반복문을 돌려서
- 모두 입장하지 못하는 조건
- 반복문이 종료되었을 때
- 큐나 스택이 비어있지 않는다면..... 모두 입장할 수 없다는 것이다.
- 반복문이 종료되었을 때
- 현재 idx 번째 사람을 찾을때까지 반복한다.
전체 코드
import java.io.*;
import java.util.*;
public class Main {
static int n = 0;
static Stack<Node> stack = new Stack<>();
static Queue<Node> q = new LinkedList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(st.nextToken());
Node[] board = new Node[n*5];
int idx = 0;
for(int i=1;i<=n;i++){
st = new StringTokenizer(br.readLine(), " ");
for(int j=0;j<5;j++){
StringTokenizer tmp = new StringTokenizer(st.nextToken(),"-");
char a = tmp.nextToken().charAt(0);
int num = Integer.parseInt(tmp.nextToken());
board[idx] = new Node(a,num);
q.add(new Node(a,num));
idx += 1;
}
}
Arrays.sort(board,(x,y) ->{
if(x.a == y.a){
return x.num - y.num;
}
return x.a - y.a;
});
int cur = 0;
while(cur < 5*n){
boolean find = false;
if(!stack.isEmpty()){
if(stack.peek().a == board[cur].a && stack.peek().num == board[cur].num){
stack.pop();
find = true;
}
}
if(!find) {
while (!q.isEmpty()) {
Node tmp = q.poll();
if (tmp.a != board[cur].a || tmp.num != board[cur].num) {
stack.push(tmp);
} else {
break;
}
}
}
cur += 1;
}
if(stack.isEmpty() && q.isEmpty()){
System.out.println("GOOD");
} else{
System.out.println("BAD");
}
br.close();
}
}
class Node{
char a;
int num;
Node(char a, int num){
this.a = a;
this.num = num;
}
}'알고리즘 > 백준' 카테고리의 다른 글
| 백준 2170 (선 긋기) - java (0) | 2023.11.16 |
|---|---|
| 백준 5214 (환승) - java (0) | 2023.11.16 |
| 백준 2026 (소풍) - java (5) | 2023.11.15 |
| 백준 13913 (숨바꼭질 4) - java (0) | 2023.11.13 |
| 백준 10216 (Count Circle Groups) - java (0) | 2023.11.10 |
- Total
- Today
- Yesterday
- 백준 #5721 #사탕 줍기 대회 #java #자바
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 17218
- 백준 #17940 #주식 #자바 #java
- 백준 #2580 #스도쿠
- 백준 #다리 만들기 #2146
- 백준 #14863 #서울에서 경산까지 #java #자바
- Java
- 백준 #
- 백준 #치즈 #2638
- 백준 #4963 #섬의 개수
- 백준 #13549 #숨바꼭질3
- 올해보다
- 17394
- 백준 #3980 #선발 명단
- 백준 #1325 #효율적인 해킹
- 백준 #1584 #게임 #java #자바
- 백준 #16973 #직사각형 탈출
- 백준 #2636 #치즈
- 백준 #18405 #경쟁적 전염
- 행복합시다.
- 백준 #12014 #주식 #자바 #java
- 백준 #1987 #알파벳 #자바 #java
- 백준 #15686 #치킨 배달
- 자바
- 백준 #25603 #짱해커 이동식 #java #자바
- 자바 #JAVA
- 백준 #인구 이동 #16234
- 백준
- 백준 #1759 #암호 만들기
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |