문제 출처: www.acmicpc.net/problem/2292
1. 코드
#include <stdio.h>
int main(void)
{
int n, i = 2, j = 5, cnt = 2;
scanf("%d", &n);
if(n == 1)
{
printf("%d", 1);
return 0;
}
while(1)
{
if(i <= n && i + j >= n)
{
printf("%d", cnt);
break;
}
i = i + j + 1;
j += 6;
cnt++;
}
}
2. 문제 해결 방식
우선 그림을 2번 방 3번 방에 해당하는 것들을 체크했다.
그렇다면 이러한 결과를 도출할 수 있다.
N번 방 | 해당하는 수 | 해당하는 수의 차이 |
1번 방 | 1 | |
2번 방 | 2~7 | 5 |
3번 방 | 8~19 | 11 |
4번 방 | 20~37 | 17 |
5번 방 | 38~61 | 23 |
해당하는 수의 차이가 6씩 차이가 나는 것을 알 수 있다. (ex 2번 방과 3번 방의 차이는 6, 3번 방과 4번 방의 차이는 6이다.)
이러한 규칙을 이용하여 최대한 경우의 수를 줄여가며 해당하는 방의 첫 수와 마지막 수를 빠르게 식별하여 그 사이에 있다면 해당하는 N번 방을 출력했다. 하지만 입력한 수가 1일 경우는 따로 제외하여서 1을 입력했을 시 1이 나오도록 출력하는 방법으로 해결했다.
3. 느낀 점
최근에 독감에 결렸다가 나아도 계속해서 코가 심하게 막히거나 목이 기침에 계속해서 나와서 최근에 아무것도 하지 못했는데 이제는 많이 나아져서 다시 백준을 풀기 시작했다.
오랜만에 풀어서 그런지 재미있게 풀었던 것 같다. 이 문제 같은 경우에는 규칙을 찾는 재미가 있었다. 규칙을 찾기 전까지는 조금 어려워 보였지만 규칙을 찾은 후에는 눈 깜빡할 사이에 해결 방법을 떠올렸다.
'컴퓨터 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 4673번: 셀프 넘버 C언어 (개선) (0) | 2020.02.05 |
---|---|
백준 알고리즘 1193번: 분수찾기 C언어 (8) | 2020.01.31 |
백준 알고리즘 2839번: 설탕 배달 C언어 (0) | 2020.01.12 |
백준 알고리즘 1712번: 손익분기점 C언어 (개선) (0) | 2020.01.11 |
백준 알고리즘 1712번: 손익분기점 C언어 (실패) (0) | 2020.01.06 |