https://www.acmicpc.net/problem/29813
❓문제
🔅해석
처음에 문제 해석이 어려웠는데 내가 이해한 바로는
1. 2번째 열부터 주어진 알파벳은 팀원을 찾는 학생들이며, 숫자는 n번째 팀원을 찾았다는 것이다.
2. 팀원이 아닐 경우 앞사람이 맨 뒤로 넘어가므로 팀원을 찾는 학생의 순서는 계속 바뀐다.
예제 입력 1에서,
A가 3번째 팀원을 찾기 위해 B,C,D,E 가 줄을 선다.
A가 3번째 팀원을 찾기 위해 B,C를 뒤로 보냈고 3번째 학생인 D와 팀을 맺는다.
그럼 팀원을 찾는 다음 학생은 E이다.
E도 4번째 팀원을 찾기 위해 B,C를 번가아가면서 뒤로 보냈고 4번째 학생은 C로써 C와 팀을 맺어 떠난다.
그럼, 남은 학생은 B로써 김한양과 팀원이 된다.
⭕정답 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//학생 수
int N = Integer.parseInt(br.readLine());
//학생과 n번째 팀원
HashMap<String, Integer> map = new HashMap<String, Integer>();
//학생의 순서를 담는 큐(HashMap에는 순서 개념이 없어 큐로 학생을 순서대로 담는다.)
Queue<String> que = new LinkedList<String>();
StringTokenizer st;
for (int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
String str = st.nextToken();
int num = Integer.parseInt(st.nextToken());
map.put(str, num);
que.add(str);
}
while(que.size()>1) {
//팀원을 뽑을 학생
String student = que.poll();
//그 학생의 n번째 팀원
int n = map.get(student);
//n번째 팀원을 찾기 위해 앞사람을 맨 뒤로 보낸다.
for (int i=0; i<n-1; i++) {
que.add(que.poll());
}
//학생의 n번째 팀원을 찾아 꺼낸다.
que.poll();
}
//나머지 인원은 김한양의 팀원
System.out.println(que.poll());
}
}
❗결과
'코딩테스트 > 백준' 카테고리의 다른 글
[코테] 백준 10250번 : ACM 호텔 (java) (0) | 2023.10.29 |
---|---|
[코테] 백준 2587번 : 대표값2 (java) (0) | 2023.10.28 |
[코테] 백준 25206번 : 너의 평점은 (java) (0) | 2023.10.28 |
[코테] 백준 29812번 : 아니 이게 왜 안 돼 (java) (0) | 2023.09.24 |
[코테] 백준 29807 학번을 찾아줘 (java) (0) | 2023.09.22 |