반응형
문제: https://www.acmicpc.net/problem/11866
문제 설명
더보기
문제
요세푸스 문제는 다음과 같다.
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>
출처
- 문제를 만든 사람: baekjoon
정답
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)
}
})
}
}
풀이
이 문제는 큐와 나머지를 이용해 푸는 문제이다. 다음과 같은 순서로 해결하면 된다.
- k번째 사람을 뽑는다.
- 1번째 ~ (k-1)번째 사람을 뒤로 보낸다
- 모두 뽑을 때까지 반복
벤치마크를 돌려보고 생각보다 오래걸려서 실패할 줄 알았으나, 예상외로 바로 통과한 문제이다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준 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 |