nonneng.ee
Daeun-rithm
nonneng.ee
전체 방문자
오늘
어제
  • 분류 전체보기 (51)
    • Back-end (17)
      • Server (3)
      • Database (3)
      • Spring (9)
      • Node.js (1)
    • Book (1)
      • 이펙티브 자바 (0)
      • 대규모 시스템 설계 (1)
    • Algorithm (1)
      • Greedy, Implementation (6)
      • Dynamic Programming (5)
      • Data Structure (3)
      • Sorting (2)
      • Concept (1)
    • TIL (11)
    • Software (3)
      • Design Pattern (3)
    • Computer Science (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 가상머신
  • MySQL
  • Restful API
  • 아이템 25
  • 브루트포스
  • JPA
  • Java
  • 서버
  • Postman
  • 컴파일설치
  • APM
  • DP
  • 이펙티브 자바
  • jwt
  • 구동원리
  • 아이템9
  • 소스설치
  • 수동설치
  • Spring
  • 자바
  • 아이템8
  • 아이템 23
  • 우분투
  • node js
  • 파이썬
  • API
  • 구현
  • 아이템6
  • 백준
  • 에러

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
nonneng.ee

Daeun-rithm

Algorithm/Data Structure

[Java] 백준 #1158 요세푸스 문제

2022. 7. 11. 17:50

https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

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

www.acmicpc.net

  • 1번부터 N번까지 N명의 사람이 원을 이루며 앉아있음
  • 양의정수 K → 순서대로 K번째 사람 제거 → N명이 제거될 때까지
  • (N, K) 요세푸스 순열 구하기

💡 알고리즘

자료구조, 큐

💡 접근

처음에 중간에 원소가 나가면 인덱스도 하나씩 줄어들어야 하겠구나 라는 잘못된 생각을 해서 큐를 생각해내지 못했다.

(규칙만 추가하며 산으로 가던 코드)

 int idx = K - 1;
 LinkedList<Integer> res = new LinkedList<Integer>();
 while(list.size() > 0){
		 res.add(list.get(idx));
     list.remove(idx);
     if ((idx + K) > list.size()){
		     idx = K - (list.size() - idx) - 1;
     } else {
         idx += K - 1;
     }

Queue를 활용하여 K번째인지만 확인해서 K번째 → 꺼내고, 아니면 → 뒤로 넘기면 된다.

💡 코드

import java.io.*;
import java.util.LinkedList;
import java.util.StringTokenizer;

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

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        StringBuilder sb = new StringBuilder();
        sb.append("<");

        LinkedList<Integer> queue = new LinkedList<Integer>();
        for(int i = 1; i <= N; i++){
            queue.add(i);
        }

        while(queue.size() > 1){
            // K번째면 빼서 sb에 추가, 아니면 queue 뒤로 추가
            for (int i = 0; i < K; i++){
                if (i == K-1){
                    sb.append(queue.poll() + ", ");
                } else{
                    queue.add(queue.poll());
                }
            }
        }

        sb.append(queue.poll() + ">");
        System.out.println(sb);
    }
}

💡 정리

딱봐도 자료구조 문제일 땐, 하나씩 움직여가며 생각해보기

인덱스가 아니라 몇 번째인지가 중요하다.

'Algorithm > Data Structure' 카테고리의 다른 글

[Python] 백준 #11866 요세푸스 문제 0  (0) 2022.03.03
[Python] 백준 #1966 프린터 큐  (0) 2021.09.15
    'Algorithm/Data Structure' 카테고리의 다른 글
    • [Python] 백준 #11866 요세푸스 문제 0
    • [Python] 백준 #1966 프린터 큐
    nonneng.ee
    nonneng.ee

    티스토리툴바