알고리즘/백준

백준 11866번 - 요세푸스 문제0 / Go

Hwisaek 2022. 4. 16. 02:12
반응형

문제: https://www.acmicpc.net/problem/11866

 

11866번: 요세푸스 문제 0

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

www.acmicpc.net

문제 설명

더보기

문제

요세푸스 문제는 다음과 같다.

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.

입력

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

출력

예제와 같이 요세푸스 순열을 출력한다.

예제 입력 1 복사

7 3

예제 출력 1 복사

<3, 6, 2, 7, 5, 1, 4>
​

출처

알고리즘 분류


 


정답

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"testing"
)

func main() {
	rd := bufio.NewReader(os.Stdin)
	wr := bufio.NewWriter(os.Stdout)

	str, _ := rd.ReadString('\n') // 여기서 text는 마지막에 줄바꿈 문자를 포함하므로
	str = strings.TrimSpace(str)  // 줄바꿈 문자를 제거해야 함
	str_arr := strings.Split(str, " ")
	n, _ := strconv.Atoi(str_arr[0])
	k, _ := strconv.Atoi(str_arr[1])

	_, _ = wr.WriteString(solution11866(n, k))
	_ = wr.Flush()
}

func solution11866(n, k int) (result string) {
	result = "<"
	queue := []int{}
	for i := 0; i < n; i++ {
		queue = append(queue, i+1)
	}
	size := len(queue)
	for size != 0 {
		idx := (k - 1) % size
		result += fmt.Sprintf(`%d, `, queue[idx])
		queue = append(queue[idx+1:], queue[:idx]...)
		size = len(queue)
	}
	result = result[:len(result)-2] + ">"
	return
}

func Benchmark11866(b *testing.B) {
	for i := 1; i < b.N; i++ {
		solution11866(1000, 1000)
	}
}

func Test_solution11866(t *testing.T) {
	type args struct {
		n int
		k int
	}
	tests := []struct {
		name       string
		args       args
		wantResult string
	}{
		{name: "", args: args{
			n: 7,
			k: 3,
		}, wantResult: "<3, 6, 2, 7, 5, 1, 4>"},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if gotResult := solution11866(tt.args.n, tt.args.k); gotResult != tt.wantResult {
				t.Errorf("solution11866() = %v, want %v", gotResult, tt.wantResult)
			}
		})
	}
}

 


풀이

 이 문제는 큐와 나머지를 이용해 푸는 문제이다. 다음과 같은 순서로 해결하면 된다.

  1. k번째 사람을 뽑는다.
  2. 1번째 ~ (k-1)번째 사람을 뒤로 보낸다
  3. 모두 뽑을 때까지 반복

벤치마크를 돌려보고 생각보다 오래걸려서 실패할 줄 알았으나, 예상외로 바로 통과한 문제이다.

반응형

'알고리즘 > 백준' 카테고리의 다른 글

백준 1764번 - 듣보잡 / Go  (0) 2022.04.30
백준 1021번 - 회전하는 큐 / Go  (0) 2022.04.17
백준 2164번 - 카드2 / Go  (0) 2022.04.15
백준 18258번 - 큐 2 / Go  (0) 2022.04.15
백준 4949번 - 균형잡힌 세상 / Go  (0) 2022.04.12