Featured image of post [Algorithm] C++/Python 백준 16394번 : 홍익대학교

[Algorithm] C++/Python 백준 16394번 : 홍익대학교

이 포스트에서는 백준 온라인 저지 16394번 홍익대학교 문제를 다룹니다. 주어진 년도에서 1946년을 빼 개교 몇 주년이 되는지 계산하는 간단한 수학 문제로, 접근 방식과 함께 C++/Python 예제 코드를 상세하게 설명합니다.

이번 포스팅에서는 백준 온라인 저지의 16394번 문제인 “홍익대학교"를 다뤄보겠다. 이 문제는 단순한 수학 계산을 요구하는 문제로, 주어진 년도가 홍익대학교 개교 몇 주년인지 계산하는 것이다. 간단한 산술 연산을 통해 해결할 수 있으며, C++과 Python으로 구현해보겠다.

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

이 글을 읽은 후 달성할 목표

이 글을 읽고 나면 “기준 연도 포함 여부"에 따라 주년 계산이 어떻게 달라지는지 설명할 수 있고, 제약 범위에서 오버플로우가 일어나지 않는 이유를 숫자로 확인할 수 있으며, C++ 스트림 입출력과 C 스타일 입출력 중 어느 쪽을 쓸지 근거를 들어 고를 수 있다.

문제 정보

항목내용
입력 범위1946 ≤ N ≤ 1,000,000
출력N − 1946 (0 이상 998,054 이하)
시간 복잡도O(1)
공간 복잡도O(1)
핵심 개념기준 연도로부터의 차이 계산

문제 설명

홍익대학교는 1946년에 개교하였다. 특정 년도 \( N \)가 주어졌을 때, 그 해가 홍익대학교 개교 몇 주년인지를 출력하는 프로그램을 작성해야 한다. 단, 홍익대학교는 없어지지 않는다고 가정한다.

입력

첫 번째 줄에 특정 년도를 나타내는 정수 \( N \)이 주어진다. 정수 \( N \)은 1946 이상 1,000,000 이하의 값을 가진다. (\( 1946 \leq N \leq 1,000,000 \))

출력

입력된 년도가 홍익대학교 개교 몇 주년인지를 나타내는 정수를 출력한다.

예제 입력 1

1
2018

예제 출력 1

1
72

접근 방식

이 문제는 매우 간단한 산술 연산을 요구한다. 홍익대학교가 1946년에 개교하였으므로, 주어진 년도 \( N \)에서 1946을 빼주면 개교 주년을 구할 수 있다.

공식은 다음과 같다:

\[ \text{개교 주년} = N - 1946 \]

이를 그대로 코드로 구현하면 된다.

flowchart LR
    A["년도 N 입력"] --> B["N - 1946 계산"] --> C["결과 출력"]

여기서 “몇 주년"의 기준이 되는 해를 세는 방식이 핵심이다. 개교한 해 자체는 0주년이므로 1946년이 입력되면 0을 출력해야 하고, 1947년이 첫 번째 주년이다. 개교 해를 1주년으로 세는 방식으로 오해하면 N − 1945가 되어 예제(2018 → 72)부터 73이 나와 어긋난다. 이처럼 시작점을 포함하느냐에 따라 결과가 1씩 달라지는 오류가 전형적인 오프바이원 실수이며, 예제를 손으로 한 번 검산하는 것만으로 걸러진다.

비교할 대안으로는 datetime 같은 날짜 라이브러리가 있지만, 입력이 월·일 없이 연도만 주어지므로 단순 뺄셈보다 얻는 것이 없다. 이 문제에서는 가장 단순한 식이 곧 가장 정확한 풀이다.

C++ 코드와 설명

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 42jerrykim.github.io에서 더 많은 정보를 확인할 수 있다
#include <iostream>  // 입출력을 위한 헤더 파일
using namespace std;

int main() {
    ios::sync_with_stdio(false); // C와 C++의 입출력을 동기화하지 않음으로써 속도 향상
    cin.tie(NULL);               // 입출력 묶음을 해제하여 입력 속도 향상

    int N;       // 년도를 저장할 변수 선언
    cin >> N;    // 년도 입력 받기
    cout << N - 1946 << endl; // 개교 주년 계산 후 출력

    return 0;
}

코드의 핵심은 ios::sync_with_stdio(false)와 cin.tie(NULL)이다. 이 두 줄은 C 입출력과의 동기화와 cin·cout의 묶음을 풀어 입출력 속도를 높이는 관용구인데, 입력이 한 줄뿐인 이 문제에서는 체감 차이가 없고 다른 문제로 옮길 때를 위한 습관에 가깝다. 나머지는 cin으로 년도를 읽어 N - 1946을 출력하는 것이 전부다. 참고로 출력의 endl은 줄바꿈과 함께 버퍼를 비우므로, 출력이 많은 문제에서는 '\n'이 더 빠르다.

C 스타일 입출력 코드와 설명

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 42jerrykim.github.io에서 더 많은 정보를 확인할 수 있다
#include <stdio.h> // 표준 입출력을 위한 헤더 파일

int main() {
    int N;            // 년도를 저장할 변수 선언
    scanf("%d", &N);  // 년도 입력 받기
    printf("%d\n", N - 1946); // 개교 주년 계산 후 출력

    return 0;
}

stdio.h의 scanf와 printf를 쓰는 C 스타일 풀이로, 스트림 객체가 없어 동기화 설정이 필요하지 않다. %d가 int와 짝을 이루며, 최댓값이 998,054라 32비트 정수로 충분하다.

Python 코드와 설명

1
2
3
# 42jerrykim.github.io에서 더 많은 정보를 확인할 수 있다
N = int(input())    # 년도를 정수로 입력 받기
print(N - 1946)     # 개교 주년 계산 후 출력

Python은 input()이 문자열을 돌려주므로 int()로 변환한 뒤 뺄셈을 한다. 정수 크기에 제한이 없어 오버플로우를 걱정할 필요가 없다.

코너 케이스 및 실수 포인트

케이스입력 → 출력확인할 점
최소 입력1946 → 0개교 해는 0주년이다. N − 1945로 쓰지 않았는지 확인
최대 입력1,000,000 → 998054int(약 21억까지)로 충분하므로 long long은 불필요
예제2018 → 72오프바이원 검산용

결론

이 문제에서 실제로 틀릴 수 있는 지점은 알고리즘이 아니라 기준 연도 해석 하나뿐이다. 입력 범위가 작아 자료형 걱정이 없고 시간·공간이 모두 상수이므로, 판단 기준은 “시작점을 포함하는가"를 예제로 검산했는가에 있다. 같은 패턴(기준점과의 차이)이 나이·경과일 문제에도 반복되므로 이 검산 습관을 가져가면 된다.