본문 바로가기

~2023

[JAVA/PYTHON] 백준 1158번 문제, 요세푸스 문제

728x90
반응형

<문제 링크>

 

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

 

1158번: 요세푸스 문제

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

www.acmicpc.net


<풀이>

 

1부터 N까지의 수를 가진 리스트가 있는데 K 씩 증가하는 인덱스에 있는 사람들을 제거하여 그 순서대로 출력하면 되는 문제이다. K번째 자리 사람을 제거하면 리스트가 줄어들기 때문에 가변형 배열인 list를 사용했다.

현재 삭제할 인덱스 변수를 선언해 리스트에서 현재 인덱스에 있는 요소를 삭제해 제거된 사람이 모여 있는 변수에 저장하면 된다.

그래서 현재 삭제할 인덱스는 K번째 커지지만, 리스트 검색 범위를 넘어가면 안 되기 때문에 리스트로 나누었을 때 나머지가 현재 인덱스라는 걸 의미하도록 했다.

 


<코드>

JAVA

arr: 사람이 원을 이루면서 앉아 있는 리스트

result: 제거된 사람을 문자열로 추가하여 저장

j: K씩 변화하는 인덱스


PYTHON

people: 사람이 원을 이루면서 앉아 있는 리스트

result: 제거된 사람을 저장하는 리스트

index: K씩 변화하는 인덱스


JAVA

import java.util.ArrayList;
import java.util.Scanner;

public class B1158 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int K = sc.nextInt();
        ArrayList<Integer> arr = new ArrayList<>();
        String result = "";

        // arr init
        for(int i = 1; i <= N; i++){
            arr.add(i);
        }

        int j = -1;
        for(int i = 0; i < N; i++){
            j = (j + K) % arr.size(); // K만큼 jumping
            
            result += arr.get(j); // 제거한 순서대로 출력

            if(i != N-1){ // format print
                result += ", ";
            }

            arr.remove(j); // 값 제거
            j -= 1; // 길이도 줄었으니 인덱스도 -1
        }

        System.out.println("<" + result + ">");

        sc.close();
    }
}

PYTHON

n, k = map(int, input().split())
people = [i for i in range(1, n+1)] # init
results = []
index = 0

while len(people) > 0:
    index = (index + (k-1)) % len(people) # jumping
    results.append(str(people.pop(index))) # remove

print("<%s>" %", ".join(results)) # format

 

 

 

 

 

 

 

 

 

728x90
반응형