이번 포스팅에서는 백준 온라인 저지의 15025번 문제인 “Judging Moose"를 다뤄보려고 합니다. 이 문제는 간단한 조건문과 비교 연산을 활용하여 해결할 수 있는 구현 문제입니다.
문제 : https://www.acmicpc.net/problem/15025
문제 설명
북미 지역의 큰 사슴인 무스(moose)는 나이에 따라 뿔의 가지 수가 달라집니다. 일반적으로 나이가 많은 수컷 무스일수록 뿔의 가지(tine)가 많습니다. 하지만 뿔의 가지 수만으로 정확한 나이를 판단하기는 어렵습니다. 왜냐하면 무스가 싸움을 하거나 다른 이유로 인해 뿔의 일부가 부러질 수 있기 때문입니다.
그래서 무스의 뿔을 평가할 때는 양쪽 뿔의 가지 수를 사용하여 포인트(point) 시스템을 적용합니다. 포인트 시스템은 다음과 같이 동작합니다:
- 양쪽 뿔의 가지 수가 같을 때: “Even x"라고 표현하며, 여기서 x는 양쪽 뿔 가지 수의 합입니다. 예를 들어, 왼쪽과 오른쪽 뿔의 가지 수가 각각 3이라면 “Even 6-point moose"가 됩니다.
- 양쪽 뿔의 가지 수가 다를 때: “Odd x"라고 표현하며, 여기서 x는 가지 수가 더 많은 쪽의 가지 수를 두 배한 값입니다. 예를 들어, 왼쪽 뿔의 가지 수가 5이고 오른쪽이 3이라면 “Odd 10-point moose"가 됩니다.
- 양쪽 뿔에 가지가 하나도 없을 때: “Not a moose"라고 표현합니다.
입력으로 왼쪽과 오른쪽 뿔의 가지 수가 주어졌을 때, 위의 포인트 시스템에 따라 무스를 판단하는 프로그램을 작성해야 합니다.
접근 방식
이 문제는 간단한 조건문과 비교 연산을 통해 해결할 수 있는 구현 문제입니다. 다음과 같은 단계로 접근할 수 있습니다:
- 입력 받기: 왼쪽과 오른쪽 뿔의 가지 수
l
과r
을 입력받습니다. - 둘 다 0인지 확인: 만약
l
과r
이 모두 0이라면 “Not a moose"를 출력합니다. - 가지 수가 같은지 확인:
- 같다면 “Even"을 출력하고, 포인트는
l + r
입니다.
- 같다면 “Even"을 출력하고, 포인트는
- 가지 수가 다르다면:
- “Odd"를 출력하고, 포인트는
2 * max(l, r)
입니다.
- “Odd"를 출력하고, 포인트는
- 출력 형식 맞추기: 요구하는 출력 형식에 맞게 문자열을 출력합니다.
C++ 코드와 설명
|
|
코드 설명
- 입력 부분:
int l, r;
를 선언하여 왼쪽(l
), 오른쪽(r
) 뿔의 가지 수를 저장합니다.cin >> l >> r;
를 통해 사용자로부터 두 값을 입력받습니다.
- 조건 검사:
if (l == 0 && r == 0)
:- 만약
l
과r
이 모두 0이라면, 무스가 아니므로 “Not a moose"를 출력합니다.
- 만약
else if (l == r)
:l
과r
이 같다면, “Even"과 함께l + r
을 출력합니다.
else
:- 위의 조건에 모두 해당하지 않으면, “Odd"와 함께
2 * max(l, r)
을 출력합니다.
- 위의 조건에 모두 해당하지 않으면, “Odd"와 함께
- 출력 부분:
- 각 조건에 맞는 문자열과 포인트 값을
cout
을 통해 출력합니다.
- 각 조건에 맞는 문자열과 포인트 값을
C++ without library 코드와 설명
|
|
코드 설명
- 입력 부분:
int l, r;
를 선언하여 왼쪽(l
), 오른쪽(r
) 뿔의 가지 수를 저장합니다.scanf("%d %d", &l, &r);
를 통해 사용자로부터 두 값을 입력받습니다.
- 조건 검사:
if (l == 0 && r == 0)
:l
과r
이 모두 0이면 “Not a moose"를 출력합니다.
else if (l == r)
:l
과r
이 같으면 “Even"과l + r
을 출력합니다.
else
:l
과r
이 다르면:- 삼항 연산자
(l > r) ? l : r;
를 사용하여 더 큰 값을max
에 저장합니다. - “Odd"와
2 * max
를 출력합니다.
- 삼항 연산자
- 출력 부분:
printf
함수를 사용하여 조건에 맞는 문자열과 값을 출력합니다.
Python 코드와 설명
|
|
코드 설명
- 입력 부분:
l, r = map(int, input().split())
:- 사용자로부터 입력받은 문자열을 공백으로 분리하고, 각각
int
로 변환하여l
과r
에 저장합니다.
- 사용자로부터 입력받은 문자열을 공백으로 분리하고, 각각
- 조건 검사:
if l == 0 and r == 0
:l
과r
이 모두 0이면 “Not a moose"를 출력합니다.
elif l == r
:l
과r
이 같으면 “Even"과l + r
을 출력합니다.
else
:- 위의 조건에 모두 해당하지 않으면, “Odd"와
2 * max(l, r)
을 출력합니다.
- 위의 조건에 모두 해당하지 않으면, “Odd"와
- 출력 부분:
print
함수를 사용하여 조건에 맞는 문자열과 값을 출력합니다.- 문자열 포매팅을 위해 f-strings를 사용하였습니다.
결론
이 문제는 간단한 조건문과 비교 연산을 통해 해결할 수 있는 구현 문제였습니다. 문제에서 제시한 조건을 정확히 파악하고, 그에 따라 프로그램을 작성하는 것이 중요했습니다. 특히 출력 형식을 정확하게 맞추는 것이 핵심이었습니다.
추가적으로, 이와 같은 문제를 풀 때는 예외 조건(예를 들어, 입력 값이 모두 0인 경우)을 놓치지 않도록 주의해야 합니다. 앞으로도 문제에서 요구하는 조건을 꼼꼼히 살펴보는 연습을 해야겠습니다.