문제
숫자 맞추기 게임은 초등학교 학생들 사이에서 유행하는 게임이다. 선생님은 학생들의 연산 실력과 논리적인 사고력을 기르기위해 학생들에게 이 게임을 권유하고 있다.
이 게임을 시작할 때는 친구가 숫자 하나를 머리속에 생각해야 한다. 이 숫자를 n0이라고 하자. 그러고 나서 다음과 같이 게임을 진행한다.
- 친구에게 n1 = 3*n0 계산을 하라고 한 뒤, n1이 짝수인지 홀수인지를 말해달라고 한다.
- n1이 짝수라면, n2 = n1/2를, 홀수라면 n2 = (n1+1)/2를 계산해달라고 한다.
- n3 = 3*n2의 계산을 부탁한다.
- 친구에게 n4 = n3/9를 계산한 뒤, 그 값을 말해달라고 한다. (n4는 나눗셈의 몫이다)
- 자 이제, n1이 짝수였다면, n0 = 2*n4로, 홀수였다면, n0 = 2*n4+1로 처음 친구가 생각한 숫자를 맞출 수 있다.
예를 들어, 친구가 생각한 수가 n0=37이었다면, n1 = 111이 되고 홀수이다. 그 다음 n2 = 56, n3 = 168, n4 = 18이 된다. 친구는 n4를 알려주게 된다.
그럼 2*n4+1 = 37이기 때문에, 친구가 제일 처음 생각한 숫자를 맞출 수 있다.
n0이 주어졌을 때, n1이 홀수인지 짝수인지와 n4를 구하는 프로그램을 작성하시오.
조건 및 입출력
1. 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, n0으로 이루어져 있다. (0 < n0 < 1,000,000) 입력의 마지막 줄에는 0이 하나 주어진다.
2. 각 테스트 케이스에 대해서, 케이스 번호를 출력하고 n1이 짝수라면 'even', 홀수라면 'odd'를 출력하고, n4를 출력한다.
코드 (C99)
#include <stdio.h>
int main(void)
{
long long num;
long long counter = 1;
while (1)
{
scanf("%lld", &num);
if (num == 0)
break;
if (num % 2 == 0)
printf("%lld. even %lld\n", counter, num / 2);
else
printf("%lld. odd %lld\n", counter, (num / 2));
counter++;
}
return 0;
}
풀이 과정
문제에서 지시한 5가지 과정을 단 한 마디로 요약하면,
n0에서 2로 나눈값을 구하라는 얘기다. (소수로 표현될 시, 소수점 이하는 버림)
왜냐하면, 1부터 4과정을 다 하면 원래의 수가 나오기 때문이다.
5과정은 1-4과정을 다 하고 *2를 했을 때 홀 짝을 말해 달라는 얘기이기 때문에,
홀수면 +1을 한 값을 불러달라고 한 것이고, 그렇지 않으면 그대로 불러달라는 얘기다.
고로, n0값에서 /2를 해 주면 n4의 값이다. (소수 버림)
그에 따른 결과로 n1과 n4는 종속이기 때문에 n4가 짝수면 n1도 짝수고, n4가 홀수면 n1도 홀수다.
-> (홀수*2=홀수) , (짝수*2=짝수)
문제를 이해 했다면, 그 다음은 쉽다.
while문을 통해 사용자가 0을 입력하기 전까지 무한루프를 돌린다.
C언어에서 int형은 소수가 나오면 소수점 이하는 절하하기 때문에 따로 뭘 건들일 필요가 없다.
다만, 홀짝인지 판별하는 if문이 필요하다. 또한 매 시행마다 번호가 매겨져야 하므로, counter라는 변수를 만들어 매 시행마다 번호를 붙일 수 있도록 코드를 작성하면 정답이다.
여담
자료 구조를 공부해 봐야겠다. 백준에서 시간이 엄격한 문제는 자료구조를 배우지 않으면 절대 통과가 안된다.
내일부터 자료구조도 조금씩 들여다 봐야겠다.
| 코드가 이상하거나, 이해되지 않는 부분이 있다면 댓글 남겨주세요! + 더 좋은 풀이 방법이 있다면 알려주세요 :) |
'Programming > C언어' 카테고리의 다른 글
| [백준] 27365번 : 소수가 아닌 수 (C언어 / C99) (0) | 2023.02.13 |
|---|---|
| [백준] 5217번 : 쌍의 합 (C언어 / C99) (0) | 2023.01.31 |
| [백준] 11653번 : 소인수분해 (C언어 / C99) (0) | 2023.01.30 |
| [백준] 2555번: 생일 출력하기 (C언어 / C99) (0) | 2023.01.30 |
| [백준] 26517번 : 연속인가? ? (C언어 / C99) (0) | 2023.01.30 |