Featured image of post [Algorithm] C++/Python 백준 24736번 : Football Scoring

[Algorithm] C++/Python 백준 24736번 : Football Scoring

이번 글에서는 백준 온라인 저지의 24736번 문제인 “Football Scoring"을 풀어보도록 하겠다. 이 문제는 미식축구의 득점 방식을 이해하고, 주어진 박스 스코어를 기반으로 각 팀의 총점을 계산하는 간단한 구현 문제이다.

문제 : https://www.acmicpc.net/problem/24736

문제 설명

미국 프로 미식축구에서는 다섯 가지 방법으로 점수를 얻을 수 있다:

  1. 터치다운(Touchdown) - 6점
  2. 필드골(Field Goal) - 3점
  3. 세이프티(Safety) - 2점
  4. 터치다운 후 추가 점수
    • 1점 (필드골 또는 세이프티) - 일반적으로 **“포인트 애프터(Point after)”**라고 부른다.
    • 2점 (터치다운) - 일반적으로 **“투 포인트 컨버전(Two-point conversion)”**이라고 부른다.

참고 링크

두 팀의 박스 스코어(Box score)가 주어졌을 때, 각 팀의 총점을 계산하는 프로그램을 작성해야 한다.

입력

  • 두 줄로 구성되며, 각 줄에는 다섯 개의 0 이상인 정수 T, F, S, P, C가 공백으로 구분되어 주어진다.
    • T: 터치다운 횟수 (0 ≤ T ≤ 10)
    • F: 필드골 횟수 (0 ≤ F ≤ 10)
    • S: 세이프티 횟수 (0 ≤ S ≤ 10)
    • P: 포인트 애프터 횟수
    • C: 투 포인트 컨버전 횟수
  • (0 ≤ (P+C) ≤ T)
  • 첫 번째 줄은 방문 팀의 박스 스코어, 두 번째 줄은 홈 팀의 박스 스코어이다.

출력

  • 한 줄에 방문 팀과 홈 팀의 총점을 공백으로 구분하여 출력한다.

예제 입력

1
2
1 3 0 0 1
3 1 1 1 1

예제 출력

1
17 26

접근 방식

이 문제는 각 팀의 득점 요소별 횟수를 입력받고, 해당 득점 요소에 따른 점수를 곱하여 총점을 계산하는 간단한 구현 문제이다.

  • 득점 요소별 점수
    • 터치다운(Touchdown): 6점
    • 필드골(Field Goal): 3점
    • 세이프티(Safety): 2점
    • 포인트 애프터(Point after): 1점
    • 투 포인트 컨버전(Two-point conversion): 2점

각 팀의 총점은 다음과 같이 계산된다:

1
총점 = (터치다운 횟수 × 6) + (필드골 횟수 × 3) + (세이프티 횟수 × 2) + (포인트 애프터 횟수 × 1) + (투 포인트 컨버전 횟수 × 2)

주어진 입력을 바탕으로 위의 공식을 적용하여 방문 팀과 홈 팀의 총점을 각각 계산하면 된다.

C++ 코드와 설명

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;

int main() {
    // 방문 팀의 박스 스코어 입력
    int T1, F1, S1, P1, C1;
    cin >> T1 >> F1 >> S1 >> P1 >> C1;

    // 홈 팀의 박스 스코어 입력
    int T2, F2, S2, P2, C2;
    cin >> T2 >> F2 >> S2 >> P2 >> C2;

    // 방문 팀의 총점 계산
    int score1 = T1 * 6      // 터치다운 점수
               + F1 * 3      // 필드골 점수
               + S1 * 2      // 세이프티 점수
               + P1 * 1      // 포인트 애프터 점수
               + C1 * 2;     // 투 포인트 컨버전 점수

    // 홈 팀의 총점 계산
    int score2 = T2 * 6      // 터치다운 점수
               + F2 * 3      // 필드골 점수
               + S2 * 2      // 세이프티 점수
               + P2 * 1      // 포인트 애프터 점수
               + C2 * 2;     // 투 포인트 컨버전 점수

    // 결과 출력
    cout << score1 << " " << score2 << endl;

    return 0;
}

코드의 동작 단계별 설명

  1. 입력 받기
    • cin을 사용하여 방문 팀과 홈 팀의 박스 스코어를 각각 입력받는다.
  2. 점수 계산
    • 각 팀의 득점 요소별 횟수에 해당 점수를 곱하여 총점을 계산한다.
    • 터치다운: T * 6
    • 필드골: F * 3
    • 세이프티: S * 2
    • 포인트 애프터: P * 1
    • 투 포인트 컨버전: C * 2
  3. 출력하기
    • 계산된 방문 팀과 홈 팀의 총점을 공백으로 구분하여 출력한다.

C++ without library 코드와 설명

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>

int main() {
    // 변수 선언
    int T1, F1, S1, P1, C1; // 방문 팀
    int T2, F2, S2, P2, C2; // 홈 팀
    int score1, score2;

    // 방문 팀의 박스 스코어 입력
    scanf("%d %d %d %d %d", &T1, &F1, &S1, &P1, &C1);

    // 홈 팀의 박스 스코어 입력
    scanf("%d %d %d %d %d", &T2, &F2, &S2, &P2, &C2);

    // 방문 팀의 총점 계산
    score1 = T1 * 6      // 터치다운 점수
           + F1 * 3      // 필드골 점수
           + S1 * 2      // 세이프티 점수
           + P1 * 1      // 포인트 애프터 점수
           + C1 * 2;     // 투 포인트 컨버전 점수

    // 홈 팀의 총점 계산
    score2 = T2 * 6      // 터치다운 점수
           + F2 * 3      // 필드골 점수
           + S2 * 2      // 세이프티 점수
           + P2 * 1      // 포인트 애프터 점수
           + C2 * 2;     // 투 포인트 컨버전 점수

    // 결과 출력
    printf("%d %d\n", score1, score2);

    return 0;
}

코드의 동작 단계별 설명

  1. 입력 받기
    • scanf를 사용하여 방문 팀과 홈 팀의 박스 스코어를 각각 입력받는다.
  2. 점수 계산
    • 각 팀의 득점 요소별 횟수에 해당 점수를 곱하여 총점을 계산한다.
  3. 출력하기
    • printf를 사용하여 계산된 총점을 출력한다.

이 코드는 stdio.h만을 사용하여 표준 입력과 출력을 처리하였다.

Python 코드와 설명

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 방문 팀의 박스 스코어 입력
T1, F1, S1, P1, C1 = map(int, input().split())

# 홈 팀의 박스 스코어 입력
T2, F2, S2, P2, C2 = map(int, input().split())

# 방문 팀의 총점 계산
score1 = T1 * 6      # 터치다운 점수
score1 += F1 * 3     # 필드골 점수
score1 += S1 * 2     # 세이프티 점수
score1 += P1 * 1     # 포인트 애프터 점수
score1 += C1 * 2     # 투 포인트 컨버전 점수

# 홈 팀의 총점 계산
score2 = T2 * 6      # 터치다운 점수
score2 += F2 * 3     # 필드골 점수
score2 += S2 * 2     # 세이프티 점수
score2 += P2 * 1     # 포인트 애프터 점수
score2 += C2 * 2     # 투 포인트 컨버전 점수

# 결과 출력
print(f"{score1} {score2}")

코드의 동작 단계별 설명

  1. 입력 받기
    • input().split()을 사용하여 입력된 문자열을 공백 기준으로 분리하고, map(int, ...)을 통해 정수로 변환하여 변수에 저장한다.
  2. 점수 계산
    • 각 팀의 득점 요소별 횟수에 해당 점수를 곱하여 총점을 계산한다.
    • Python에서는 += 연산자를 사용하여 변수를 갱신한다.
  3. 출력하기
    • print를 사용하여 계산된 총점을 출력한다.

결론

이 문제는 간단한 수학적 계산과 입력 처리를 요구하는 구현 문제이다. 미식축구의 득점 방식을 정확히 이해하고, 주어진 입력에 따라 점수를 계산하면 쉽게 해결할 수 있다. 이러한 문제에서는 문제의 조건을 정확히 파악하고, 구현 과정에서 실수가 없도록 주의하는 것이 중요하다. 추가적으로, 입력 제한 조건을 확인하여 예외 상황을 방지하는 것도 필요하다.