Featured image of post [Algorithm] C++/Python 백준 31654번 : Adding Trouble

[Algorithm] C++/Python 백준 31654번 : Adding Trouble

프로그래밍을 시작하는 이들에게 기본적인 산술 연산과 조건문은 가장 먼저 접하게 되는 개념이다. 이번 포스팅에서는 백준 온라인 저지의 31654번 문제인 “Adding Trouble"을 해결하면서 이러한 기초 개념을 다시 한 번 되새겨보자.

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

문제 설명

당신의 친구 Bob은 숫자 더하기에 매우 서툴다. 그는 계산이 올바른지 확인하기 위해 당신의 도움이 필요하다. 세 정수 \( A \), \( B \), \( C \)가 주어졌을 때, \( A + B = C \)인지 확인하고 Bob이 정확하게 더했는지 판단해야 한다.

입력:

  • 한 줄에 세 정수 \( A, B, C \)가 공백으로 구분되어 주어진다.
  • 각 정수는 \( -10^9 \leq A, B, C \leq 10^9 \) 범위를 가진다.

출력:

  • \( A + B = C \)이면 “correct!“를 출력한다.
  • 그렇지 않으면 “wrong!“을 출력한다.

예제 입력 1:

1
2 3 5

예제 출력 1:

1
correct!

예제 입력 2:

1
1 1 3

예제 출력 2:

1
wrong!

예제 입력 3:

1
-1 1 0

예제 출력 3:

1
correct!

이 문제는 간단해 보이지만 몇 가지 고려해야 할 사항이 있다. 입력되는 정수의 범위가 매우 크기 때문에 프로그래밍 언어별로 적절한 데이터 타입을 선택해야 한다. 또한, 부호 있는 정수의 연산에서 발생할 수 있는 오버플로우를 방지하기 위해 주의가 필요하다.

접근 방식

이 문제를 해결하기 위해 다음과 같은 단계를 따른다:

  1. 입력 처리: 세 개의 정수 \( A, B, C \)를 입력받는다. 이때 정수의 범위가 \( -10^9 \)부터 \( 10^9 \)까지이므로, C++에서는 long long 타입을 사용하고, Python에서는 기본 int 타입을 사용하면 충분하다.

  2. 산술 연산: \( A + B \)를 계산한다.

  3. 조건 비교: 계산한 결과와 \( C \)를 비교한다.

  4. 결과 출력: 비교 결과에 따라 “correct!” 또는 “wrong!“을 출력한다.

시간 복잡도는 입력 크기에 관계없이 항상 일정하므로 \( O(1) \)이다.

C++ 코드와 설명

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <iostream>  // 표준 입출력을 위한 헤더 파일
using namespace std;

int main() {
    long long A, B, C;  // 정수를 저장할 변수 선언

    cin >> A >> B >> C;  // 세 정수 입력 받기

    if (A + B == C) {    // A와 B의 합이 C와 같은지 확인
        cout << "correct!" << endl;  // 같다면 "correct!" 출력
    } else {
        cout << "wrong!" << endl;    // 다르다면 "wrong!" 출력
    }

    return 0;  // 프로그램 종료
}

코드의 동작 단계별 설명

  1. 입력 받기:

    • cin >> A >> B >> C;를 통해 사용자로부터 세 정수를 입력받는다.
    • long long 타입을 사용하여 큰 범위의 정수를 안전하게 저장한다.
  2. 계산 및 비교:

    • if (A + B == C) 조건문을 사용하여 \( A + B \)와 \( C \)를 비교한다.
  3. 결과 출력:

    • 조건이 참이라면 cout << "correct!" << endl;을 실행하여 “correct!“를 출력한다.
    • 조건이 거짓이라면 cout << "wrong!" << endl;을 실행하여 “wrong!“을 출력한다.
  4. 프로그램 종료:

    • return 0;을 통해 프로그램을 정상적으로 종료한다.

C++ without library 코드와 설명

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <stdio.h>   // 표준 입출력을 위한 헤더 파일
#include <malloc.h>  // 메모리 관리를 위한 헤더 파일 (조건 상 포함)

int main() {
    long long A, B, C;  // 정수를 저장할 변수 선언

    scanf("%lld %lld %lld", &A, &B, &C);  // 세 정수 입력 받기

    if (A + B == C) {    // A와 B의 합이 C와 같은지 확인
        printf("correct!\n");  // 같다면 "correct!" 출력
    } else {
        printf("wrong!\n");    // 다르다면 "wrong!" 출력
    }

    return 0;  // 프로그램 종료
}

코드의 동작 단계별 설명

  1. 입력 받기:

    • scanf("%lld %lld %lld", &A, &B, &C);를 사용하여 세 정수를 입력받는다.
    • long long 타입에 맞게 %lld 포맷 지정자를 사용한다.
  2. 계산 및 비교:

    • if (A + B == C) 조건문을 통해 \( A + B \)와 \( C \)를 비교한다.
  3. 결과 출력:

    • 조건이 참이라면 printf("correct!\n");을 실행한다.
    • 조건이 거짓이라면 printf("wrong!\n");을 실행한다.
  4. 프로그램 종료:

    • return 0;으로 프로그램을 종료한다.

Python 코드와 설명

1
2
3
4
5
6
A, B, C = map(int, input().split())  # 입력 받은 문자열을 정수로 변환하여 변수에 저장

if A + B == C:
    print("correct!")  # 조건이 참이면 "correct!" 출력
else:
    print("wrong!")    # 조건이 거짓이면 "wrong!" 출력

코드의 동작 단계별 설명

  1. 입력 받기 및 변환:

    • input().split()을 통해 입력 받은 문자열을 공백 기준으로 분리한다.
    • map(int, ...)을 사용하여 분리된 문자열을 정수로 변환한다.
    • 변환된 정수를 A, B, C에 각각 저장한다.
  2. 계산 및 비교:

    • if A + B == C: 조건문으로 \( A + B \)와 \( C \)를 비교한다.
  3. 결과 출력:

    • 조건이 참이면 print("correct!")를 실행한다.
    • 조건이 거짓이면 print("wrong!")를 실행한다.

결론

이 문제는 매우 간단한 구현 문제로, 기본적인 산술 연산과 조건문을 통해 쉽게 해결할 수 있었다. 하지만 입력 값의 범위가 크기 때문에 프로그래밍 언어별로 적절한 데이터 타입을 선택하는 것이 중요하다. 특히 C++에서는 int 대신 long long을 사용하여 오버플로우를 방지해야 했다.

이러한 단순한 문제라도 데이터 타입과 입력 범위에 대한 세심한 주의가 필요함을 다시 한 번 깨달았다. 프로그래밍에서 기본기를 탄탄히 다지는 것이 얼마나 중요한지 알 수 있는 좋은 기회였다.