백준 1158 - 자료구조

·2025년 8월 3일

1. 백준 1158

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));
 		String[] nums = br.readLine().split(" ");
 		int N = Integer.parseInt(nums[0]);
 		int K = Integer.parseInt(nums[1]);
 		Deque<Integer> deq = new ArrayDeque<>();
 		for(int i = 1; i <= N; i++) {
 			deq.addLast(i);
 		}
 		//데이터가 5000개 이므로 StringBuilder 사용
 		StringBuilder sb = new StringBuilder();
 		sb.append("<");
 		//덱이 빌 때까지 반복
 		while(!deq.isEmpty()) {
 			
 			for(int i = 0; i < K-1; i++) {
 				// 덱의 맨 앞 카드를 제거해 제일 뒤에 삽입(K-1번 반복)
 				int target = deq.removeFirst();
 				deq.addLast(target);
 			}
 			//K번째에서는 제거만 하고 다시 넣어주지 않음
 			sb.append(deq.removeFirst() + ", ");
 		}
 		sb.replace(sb.length()-2,sb.length(),"");
 		sb.append(">");
 		System.out.println(sb.toString());
 	}
}

풀이과정 및 리뷰

  1. 제일 앞 사람을 K-1번 만큼 제일 뒤로 보내는 로직을 반복
  • 덱(구현체는 ArrayDeque)을 사용(앞에선 빼고, 뒤로 집어넣기 위해)
  1. K번째 사람은 제일 뒤로 가는 것이 아니라 제거되므로, 로직을 따로 빼줌
  • for문이 반복 횟수를 0~K-2번째까지 K-1번으로 제한한 후, K번째에 도달 시 removeFirst만 해주는 것을 덱이 빌 때까지 반복
  1. 자료 갯수가 5000개까지이므로, 시간을 고려해 StringBuilder로 선언해 문자열로 합친 후 한번에 print

  2. <a, b, c, d, e>로 출력이 되어야 하는데 중간에 sb.append(문자열 + “, “); 코드 때문에

    <a, b, c, d, e, >로 출력됨

    → sb.replace() 메서드로 sb문자열의 끝-2번째부터 제일 끝 인덱스까지의 문자열을 공백으로 대체

아쉬운 점. sb.replace코드가 너무 지저분함.. trim으로 제일 마지막부분을 깔끔하게 자를 수 있는방법이 있는지, 아니면 sb.append의 선언순서를 바꾸는 등 로직을 수정할 필요가 있을 것 같다.

0개의 댓글