2023. 9. 24. 01:04ㆍAlgorithm ( p & swlug )/Baekjoon
[ 문제 ]
2주차 첫번째 문제를 풀어보겠다.
➡️문제
N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.
이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.
예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다.
N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로그램을 작성하시오.
➡️입력
첫째 줄에 정수 N(1 ≤ N ≤ 500,000)이 주어진다.
➡️출력
첫째 줄에 남게 되는 카드의 번호를 출력한다.
문제를 풀려고 각종 시도를 해봤다. N=0 일때 부터 N=10일때 까지 구했는데,
N=1일때 출력값 1
N=2일때 출력값 2
N=3일때 출력값 2
N=4일때 출력값 4
N=5일때 출력값 4
N=6일때 출력값 4
N=7일때 출력값 6
N=8일때 출력값 8
N=9일때 출력값 2..?
N=10일때 출력값...
처음에는 N=6일때 출력값 6인거로 잘못 풀어서 for 문으로 N까지 반복하고 , if 문으로 N=1 일때 N%2==0 짝수일때, 그리고 else경우로 나눠서 짝수일때는 결과값이 자기자신 , 아닐 때는 N-1로 구했다.. 틀려서 왜지? 하고 보니까
잘못계산한거였다.
아무리봐도 규칙이 보이지 않는다 심지어 9가 2로 되는거 자체가 규칙이 안보이는데, 긴 고민 끝에 도움을 받기로 했다.
#include <stdio.h>
#define size 500000
int main()
{
int n, i, front=0, rear;
int que[size];
scanf("%d", &n);
for(i=0; i<n; i++) que[i]=i+1;
rear=n-1;
while(1) {
front=(front+1)%n;
if(rear==front) break; // 확인
rear=(rear+1)%n;
que[rear]=que[front];
front=(front+1)%n;
if(rear==front) break; // 확인
}
printf("%d", que[rear]); // 출력
return 0;
}
솔직히 말하면 혼자서 아무리 고민했어도 못풀었을것같다..😂
아래는 내가 구글링한 코드를 혼자서 학습하면서 이해한 과정이다.
1) 일단 맨 윗줄에 변수선언 및 초기화를 진행하고, que로 배열을 설정한다.
2) 생각했던대로 scanf로 입력값 n을 받는다.
3) for문으로 배열인덱스 값을 채운다.
4) while(1)로 무한루프를 돌리는데 front값은 front+1한 값을 n으로 나눈 값을 대입해준다.
5) 만약에 맨뒤값이랑 맨앞에값이 일치하면 멈춘다. (1장 남았으니까)
6) rear값은 rear+1한 값을 n으로 나눠준다.
7) 배열 rear인덱스 값에 front인덱스 값을 대입해준다. (카드를 맨뒤로 보내는 과정)
8) 그리고 다시 4)번과정을 반복한다.
9) 만약에 rear값과 front값이 같다면 다시 브레이크 (1장 남았으니까)
10) 그리고 rear값을 출력해서 보여준다.
막상 코드를 보고 해석하면서 풀어보니 아예 모르는 내용은 아니었지만, 스스로 짜기는 쉽지않았을 것 같다.
이런식으로 다양한 알고리즘을 공부하고 접하다보면 스스로 풀 수 있는 날도 올 것이라 생각한다.
꽤나 까다로웠던 문제.. 첫번째 문제 끄읏(*/ω\*)
[ 참고 학습 자료 ]
[백준][C언어] 2164번 - 카드2 (원형.. : 네이버블로그 (naver.com)
'Algorithm ( p & swlug ) > Baekjoon' 카테고리의 다른 글
2학기 3주차_알고리즘( 백준28278번 : 스택2 ) (0) | 2023.09.29 |
---|---|
2학기 2주차_알고리즘( 백준19532번 : 수학은 비대면강의입니다. ) (0) | 2023.09.24 |
2학기 1주차_알고리즘( 백준10773번 : 제로 ) (0) | 2023.09.17 |
2학기 1주차_알고리즘( 백준1978번 : 소수 찾기 ) (0) | 2023.09.17 |
백준 2439번(별 찍기 -2) (0) | 2023.08.05 |