Featured image of post [Algorithm] C++/Python 백준 15025번 : Judging Moose

[Algorithm] C++/Python 백준 15025번 : Judging Moose

이번 포스팅에서는 백준 온라인 저지의 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"라고 표현합니다.

입력으로 왼쪽과 오른쪽 뿔의 가지 수가 주어졌을 때, 위의 포인트 시스템에 따라 무스를 판단하는 프로그램을 작성해야 합니다.

접근 방식

이 문제는 간단한 조건문과 비교 연산을 통해 해결할 수 있는 구현 문제입니다. 다음과 같은 단계로 접근할 수 있습니다:

  1. 입력 받기: 왼쪽과 오른쪽 뿔의 가지 수 lr을 입력받습니다.
  2. 둘 다 0인지 확인: 만약 lr이 모두 0이라면 “Not a moose"를 출력합니다.
  3. 가지 수가 같은지 확인:
    • 같다면 “Even"을 출력하고, 포인트는 l + r입니다.
  4. 가지 수가 다르다면:
    • “Odd"를 출력하고, 포인트는 2 * max(l, r)입니다.
  5. 출력 형식 맞추기: 요구하는 출력 형식에 맞게 문자열을 출력합니다.

C++ 코드와 설명

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;

int main() {
    int l, r;
    cin >> l >> r; // 왼쪽과 오른쪽 뿔의 가지 수 입력

    if (l == 0 && r == 0) {
        cout << "Not a moose" << endl; // 둘 다 0이면 무스가 아님
    } else if (l == r) {
        cout << "Even " << l + r << endl; // 가지 수가 같으면 Even 출력
    } else {
        cout << "Odd " << 2 * max(l, r) << endl; // 가지 수가 다르면 Odd 출력
    }

    return 0;
}

코드 설명

  • 입력 부분:
    • int l, r;를 선언하여 왼쪽(l), 오른쪽(r) 뿔의 가지 수를 저장합니다.
    • cin >> l >> r;를 통해 사용자로부터 두 값을 입력받습니다.
  • 조건 검사:
    • if (l == 0 && r == 0):
      • 만약 lr이 모두 0이라면, 무스가 아니므로 “Not a moose"를 출력합니다.
    • else if (l == r):
      • lr이 같다면, “Even"과 함께 l + r을 출력합니다.
    • else:
      • 위의 조건에 모두 해당하지 않으면, “Odd"와 함께 2 * max(l, r)을 출력합니다.
  • 출력 부분:
    • 각 조건에 맞는 문자열과 포인트 값을 cout을 통해 출력합니다.

C++ without library 코드와 설명

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main() {
    int l, r;
    scanf("%d %d", &l, &r); // 왼쪽과 오른쪽 뿔의 가지 수 입력

    if (l == 0 && r == 0) {
        printf("Not a moose\n"); // 둘 다 0이면 무스가 아님
    } else if (l == r) {
        printf("Even %d\n", l + r); // 가지 수가 같으면 Even 출력
    } else {
        int max = (l > r) ? l : r; // 더 큰 값을 찾음
        printf("Odd %d\n", 2 * max); // 가지 수가 다르면 Odd 출력
    }

    return 0;
}

코드 설명

  • 입력 부분:
    • int l, r;를 선언하여 왼쪽(l), 오른쪽(r) 뿔의 가지 수를 저장합니다.
    • scanf("%d %d", &l, &r);를 통해 사용자로부터 두 값을 입력받습니다.
  • 조건 검사:
    • if (l == 0 && r == 0):
      • lr이 모두 0이면 “Not a moose"를 출력합니다.
    • else if (l == r):
      • lr이 같으면 “Even"과 l + r을 출력합니다.
    • else:
      • lr이 다르면:
        • 삼항 연산자 (l > r) ? l : r;를 사용하여 더 큰 값을 max에 저장합니다.
        • “Odd"와 2 * max를 출력합니다.
  • 출력 부분:
    • printf 함수를 사용하여 조건에 맞는 문자열과 값을 출력합니다.

Python 코드와 설명

1
2
3
4
5
6
7
8
l, r = map(int, input().split())  # 왼쪽과 오른쪽 뿔의 가지 수 입력

if l == 0 and r == 0:
    print("Not a moose")  # 둘 다 0이면 무스가 아님
elif l == r:
    print(f"Even {l + r}")  # 가지 수가 같으면 Even 출력
else:
    print(f"Odd {2 * max(l, r)}")  # 가지 수가 다르면 Odd 출력

코드 설명

  • 입력 부분:
    • l, r = map(int, input().split()):
      • 사용자로부터 입력받은 문자열을 공백으로 분리하고, 각각 int로 변환하여 lr에 저장합니다.
  • 조건 검사:
    • if l == 0 and r == 0:
      • lr이 모두 0이면 “Not a moose"를 출력합니다.
    • elif l == r:
      • lr이 같으면 “Even"과 l + r을 출력합니다.
    • else:
      • 위의 조건에 모두 해당하지 않으면, “Odd"와 2 * max(l, r)을 출력합니다.
  • 출력 부분:
    • print 함수를 사용하여 조건에 맞는 문자열과 값을 출력합니다.
    • 문자열 포매팅을 위해 f-strings를 사용하였습니다.

결론

이 문제는 간단한 조건문과 비교 연산을 통해 해결할 수 있는 구현 문제였습니다. 문제에서 제시한 조건을 정확히 파악하고, 그에 따라 프로그램을 작성하는 것이 중요했습니다. 특히 출력 형식을 정확하게 맞추는 것이 핵심이었습니다.

추가적으로, 이와 같은 문제를 풀 때는 예외 조건(예를 들어, 입력 값이 모두 0인 경우)을 놓치지 않도록 주의해야 합니다. 앞으로도 문제에서 요구하는 조건을 꼼꼼히 살펴보는 연습을 해야겠습니다.