🌞Algorithm/🔥Baekjoon

[Baekjoon] 15088_Game of Throwns

뿌야._. 2025. 8. 20. 12:12
문제(출처: https://www.acmicpc.net/problem/15088)

< Game of Throwns >

 

문제 풀이 

 

stack을 사용하여 이동하는 아이의 번호를 기록하고 undo일 때 pop을 통해 던지기를 취소한다.

 

my solution (Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class _15088_ { // Game of Throwns

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());

		int n = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());

		int idx = 0;

		Stack<Integer> stack = new Stack<>();
		stack.add(0);

		st = new StringTokenizer(bf.readLine());

		while (st.hasMoreTokens()) {
			String cmd = st.nextToken();

			if (cmd.equals("undo")) {
				int num = Integer.parseInt(st.nextToken());

				for (int i = 0; i < num; i++) {
					stack.pop();
				}
				idx = stack.peek();
				
			} else {
				int num = Integer.parseInt(cmd);

				num %= n;

				idx += num;
				if (idx >= n) {
					idx -= n;
				} else if (idx < 0) {
					idx += n;
				}
				stack.add(idx);
			}
		}
		System.out.println(idx);
	}
}
변수)
n, k : 학생 수, 명령어 수
idx : 현재 학생 번호
stack : Stack <Integer>
cmd : 명령어

 

학생 수와 명령어 수를 입력받는다. 명령어를 입력받아 다음 과정을 반복한다.

 

1) 명령어가 undo라면 m을 구해 m개만큼 stack에서 pop 한다. idx를 stack의 peek값으로 저장한다.

2) undo가 아니라면 값을 학생 수로 나눈 나머지를 구한다. 나머지만큼 현재 위치에서 더하고 총 학생 번호를 벗어난다면 값을 조정한다. 이동 과정을 저장하기 위해 stack에 idx를 저장한다.

 

최종 현재 학생 번호인 idx를 출력한다.