Hayden's Archive

[알고리즘] 백준 - 1158번 : 요세푸스 문제 본문

Algorithm

[알고리즘] 백준 - 1158번 : 요세푸스 문제

_hayden 2020. 7. 8. 23:11

알고리즘 문제 출처 : https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

 

내가 작성한 코드

너무 어렵게 생각했다. 큐 하나에서 넣고 빼고를 둘 다 한다는 생각을 못해서 큐 2개를 가지고 씨름을 했다. 또 증감 연산자를 써서 m번째를 추출하고 또 해당 변수를 0으로 초기화하고 또 증감연산자를 쓰고 이렇게 하다 보니 시간 초과가 계속 나왔다. 이럴 땐 이중 for문을 돌리는 게 더 빠르다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		Queue<Integer> queue = new LinkedList<>();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		String[] number = br.readLine().split(" ");
		int n = Integer.parseInt(number[0]);
		int m = Integer.parseInt(number[1]);
		sb.append("<");
		for(int i=1; i<=n; i++) {
			queue.offer(i);
		}
		for(int i=0; i<n-1; i++) {//마지막 하나를 남기기 위해 n-1번 반복
			for(int j=0; j<m-1; j++) {//m-1번까지는 빼서 추가
				queue.offer(queue.poll());
			}
			sb.append(queue.poll()+", ");//m번째 추출
		}
		sb.append(queue.poll()+">");
		bw.write(sb.toString());
		bw.flush();
		bw.close();
	}
}