[백준 11866] 요세푸스 문제 0 C언어
2024. 1. 25. 20:49ㆍ코딩테스트/백준
문제
https://www.acmicpc.net/problem/11866
11866번: 요세푸스 문제 0
첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000)
www.acmicpc.net
코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct ListNode { // 구조체 선언
int k;
struct ListNode* llink;
struct ListNode* rlink;
}ListNode; // 이중 연결 리스트
int main(void)
{
int n, k;
scanf("%d %d", &n, &k);
ListNode* l = (ListNode*)malloc(sizeof(ListNode)); // head 노드
ListNode* before = NULL; // 이전 (유동성)
l->k = 1;
l->llink = NULL;
l->rlink = NULL;
before = l;
for (int i = 2; i <= n; i++) {
ListNode* new = (ListNode*)malloc(sizeof(ListNode)); // 새로운 노드에 공간 할당
new->k = i;
new->rlink = NULL;
new->llink = before;
before->rlink = new;
before = new;
}
ListNode* temp = l;
printf("<");
while (l->rlink != NULL) {
for (int i = 1; i < k; i++) {
if (temp->rlink == NULL)
temp = l;
else
temp = temp->rlink;
}
printf("%d, ", temp->k);
if (temp->llink == NULL) { // 맨 앞 노드를 삭제해야 하는 경우
ListNode* remove = temp;
temp = temp->rlink;
l = temp; // 헤드노드의 값도 변경해야 함
temp->llink = NULL;
free(remove);
}
else if (temp->rlink == NULL) { // 맨 뒤 노드를 삭제해야 하는 경우
ListNode* remove = temp;
temp->llink->rlink = NULL;
temp = l;
free(remove);
}
else {
ListNode* remove = temp;
temp->llink->rlink = temp->rlink;
temp->rlink->llink = temp->llink;
temp = temp->rlink;
free(remove);
}
}
printf("%d>", l->k);
return 0;
}
주의할 점
typedef struct {...} ListNode; 에서 ListNode가 구조체의 별칭이므로 구조체 선언을 해줘야 한다.
헤드 노드의 값도 변경해줄 필요가 있다.
'코딩테스트 > 백준' 카테고리의 다른 글
[백준 1929] 소수 구하기 C언어 / 에라토스테네스의 체 (0) | 2024.01.29 |
---|---|
[백준 2775] 부녀회장이 될테야! C언어 (1) | 2024.01.29 |
[백준 11650] 좌표 정렬하기 C언어 (0) | 2024.01.24 |
[백준 10866] 덱 C언어 (1) | 2024.01.23 |
[백준] 1018. 체스판 다시 칠하기 (0) | 2023.07.24 |