[Silver IV] 아~파트 아파트 - 31797
성능 요약
메모리: 1112 KB, 시간: 0 ms
분류
구현, 정렬
제출 일자
2026년 04월 25일 22:04:59
문제 설명
부산대학교 정보컴퓨터공학부는 매년 봄 MT를 떠난다. 봄 MT에 간 산지니는 아파트라는 술게임을 배웠다.
- 게임을 시작한 사람이 아파트의 층수 $N$을 정한다.
- 게임의 모든 참가자는 자신의 두 손을 다른 사람과 겹치지 않는 높이로 뻗어 모든 참가자의 두 손이 서로 쌓이도록 한다.
- 가장 아래에 있는 손을 빼 쌓여있는 손 가장 위에 쌓는다.
- 3.의 과정을 $N$번 반복한다. $j$번째로 쌓은 손이 $j$층이 된다.
- $N$층을 쌓는 참가자가 술을 마시고 게임이 종료된다.
새내기인 산지니는 누가 술을 마시게 될 지 궁금해졌다. 산지니를 위해 누가 술을 마시게 될 지 구해주자.
입력
첫 번째 줄에 아파트의 층수 $N$, 참가자의 수 $M$이 공백으로 구분되어 주어진다. $(1 \leq N, M \leq 1\,000)$
두 번째 줄부터 $M+1$번째 줄까지 $i$번 참가자의 두 손의 높이 $H_{1,i}$, $H_{2,i}$가 공백으로 구분되어 주어진다. $(1 \leq H_{1,i}, H_{2, i} \leq 10\,000)$
어떤 두 손도 같은 높이인 경우는 주어지지 않는다. 모든 입력은 정수이다.
출력
술을 마시게 될 사람의 번호를 출력한다.
💡 해결 방법
💻 코드
//https://www.acmicpc.net/problem/31797
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct hands{
int hand;
int who;
}hands;
//21:17~ 22:00
//22:10 ~
void sort(hands arr[], int len)
{
for(int cur = 0; cur < len ; cur++)
{
int min = cur;
for(int i = cur; i < len; i++)
{
min = arr[i].hand > arr[min].hand ? min : i;
}
hands temp; temp.hand = arr[min].hand; temp.who = arr[min].who;
arr[min].hand = arr[cur].hand; arr[min].who = arr[cur].who;
arr[cur].hand = temp.hand; arr[cur].who = temp.who;
}//hand 기준으로 hands를 정렬한다
for(int cur = 0; cur < len ; cur++)
{
// printf("[%d: %d]", arr[cur].hand, arr[cur].who);
}
}
void search(hands *arr,int len, int t)
{
sort(arr, len);
int target = (t-1) % len;//
//printf("%d %d", t, target);
for(int cur = 0; cur < len ; cur++)
{
//printf("[%d: %d]", arr[cur].hand, arr[cur].who);
}
printf("%d", arr[target].who);
}
int main()
{
int N = 0; int M = 0; scanf("%d %d", &N, &M);
M *= 2;
hands* arr = (hands*)malloc(sizeof(hands) * M);
for(int a = 0; a < M; a++)
{
scanf("%d", &arr[a].hand);
arr[a].who = (a)/2 + 1;
}
for(int a = 0; a < M; a++)
{
//printf("[%d %d]", arr[a].who, arr[a].hand);
}
search(arr, M, N);
free(arr);
return 0;
}