문제
골프 홀의 파(par) 수 p와 실제 타수 s가 주어질 때, 두 값의 차이에 따라 골프 용어를 출력한다. 규칙은 다음과 같다.
p - s == 2이고s == 1: Hole-in-onep - s == 3: Double eaglep - s == 2: Eaglep - s == 1: Birdiep - s == 0: Parp - s == -1: Bogey- 그 외: Double Bogey
0 0 입력 시 종료한다.
입력
각 줄에 파 수 p와 실제 타수 s가 주어진다. 마지막 줄은 0 0이다.
출력
각 홀에 대해 Hole #N (N은 홀 번호, 1부터 시작)을 출력하고, 다음 줄에 골프 용어를 출력한다. 각 홀 사이에 빈 줄을 출력한다.
예제
| 입력 | 출력 |
|---|---|
4 3 3 1 0 0 | Hole #1 Birdie. `Hole #2` `Hole-in-one.` |
풀이
각 홀에 대해 파와 타수의 차이를 계산하여 조건에 맞는 골프 용어를 반환하는 함수를 분리한다.
while(1)루프에서 p, s를 입력받고0 0이면 종료한다.- 홀 번호 카운터
cnt를 증가시키며Hole #cnt를 출력한다. getName()함수에서diff = p - s를 기준으로 조건 분기한다.- Hole-in-one 조건은
diff == 2 && s == 1로 Eagle보다 먼저 검사한다. printf와cout을 혼용하여 출력한다.
핵심 아이디어: Hole-in-one(파3에서 1타)은 diff가 2이지만 Eagle(파4에서 2타)과 구분해야 하므로 s == 1 조건을 추가로 검사한다. 조건을 나열할 때 더 구체적인 경우를 먼저 처리하는 순서가 중요하다.
코드
#include <iostream>
using namespace std;
int p, s, cnt;
string getName()
{
int diff = p - s;
if (diff == 1)
return "Birdie.\n";
if (diff == -1)
return "Bogey.\n";
if (diff == 2 && s == 1)
return "Hole-in-one.\n";
if (diff == 2)
return "Eagle.\n";
if (diff == 3)
return "Double eagle.\n";
if (diff == 0)
return "Par.\n";
return "Double Bogey.\n";
}
int main()
{
while (1)
{
cnt++;
cin >> p >> s;
if (!p && !s)
break;
printf("Hole #%d\n", cnt);
cout << getName() << '\n';
}
}복잡도
- 시간: O(N) — N은 홀 수, 각 홀마다 상수 시간 조건 검사
- 공간: O(1) — 추가 자료구조 없음