Living in my own world. Else If..? 자세히보기

백준 - 단계별로 풀어보기/C++

[백준] 2557번 Hello World 풀이.. + C언어와 컴퓨터의 역?사 (C++) - Elif's Diary

Elif_918 2026. 3. 8. 03:26

안녕하세요! 오늘은 2557번을 풀어봤습니다.
다만 이번 글을 쓰기 전에, 잠시 C++과 컴퓨터의 역사에 대해 알아보겠습니다.
( 설명이 좀 길어요! 풀이만 보고싶으신 분은 밑으로 스크롤 쭈욱!!)

우선 "프로그래밍"이란 개념에 대해서 좀 알아봅시다.

프로그래밍이란, 그리스어 pro와 gramma의 합성어인 Program에 현재진행형 ing을 붙인 단어입니다.
Pro는 미리, 앞서라는 뜻이고, Gramma는 글, 기록이라는 뜻으로, Program이란 앞으로 일어날 일, 
해야 할 일에 대한 계획이라는 뜻입니다.

 

따라서 컴퓨터에서의 Program은 컴퓨터가 해야할 일을 가르쳐주는 계획서고, 프로그래밍은 그 계획서를 쓰는 일인겁니다.

 

1946년, 현대 컴퓨터의 시조라고 볼 수 있는 ENIAC(에니악, Electronic Numerical Integrator And Computer)
이 등장했습니다.

에니악의 모습

지금의 컴퓨터와 비교하면 ENIAC은 방 하나를 전부 채울 정도로 거대하며, 전력 소모도 엄청났습니다. 무게도 약 30톤정도로 매우 무거웠죠. 속도도 당연히 매우 느렸구요.


하지만 무엇보다 가장 큰 문제점은 프로그래밍 방식이었습니다. ENIAC은 지금의 컴퓨터처럼 마우스 클릭 한번으로 끝나는게 아닌, 케이블을 연결하고 스위치를 조작하며 배선 자체를 뜯어고치는 방식으로 프로그램을 설정해야 했습니다.


만약 100 + 100을 계산하다가 200+200을 계산하려고 하면, 컴퓨터 내부의 배선을 수정하고, 스위치를 만지작거리며 몇시간, 며칠동안 배선을 통째로 갈아버려야 했던 거죠.

 

이런 문제점을 해결하게 위해서 1945년 헝가리 출신의 수학자 존 폰 노이만(John von Neumann)이
'폰 노이만 구조' 라는 방식을 제안했습니다.
이 폰 노이만 구조는 요약하자면 프로그램을 하드웨어인 배선이 아니라 메모리에 저장하자는 거였습니다.

폰 노이만 구조 덕분에 프로그램을 며칠동안 배선을 수정하지 않고, 간단하게 메모리에 저장시켜 실행시킬수 있게 되었지만,
이 프로그램은 기계어(Mauchine code)로 작성되어 사람에게는 읽기도, 쓰기도 어려웠습니다.

10111000 00000001 00000000 00000000 00000000
10111111 00000001 00000000 00000000 00000000
01001000 10111110 00110000 00000000 01000000 00000000 00000000 00000000 00000000 00000000
10111010 00001101 00000000 00000000 00000000
00001111 00000101
10111000 00111100 00000000 00000000 00000000000110001 11111111
00001111 00000101
// 64bit 리눅스의 시스템 콜을 사용한 Hello, world! 출력 코드

 

이를 해결하기 위해 어셈블리어가 탄생합니다.
어셈블리어는 조금 더 자연어에 가까운, 사람이 이해하기 쉬운 형태로 표현한 언어입니다.

adosseg
 .model small
 .stack 100h

 .data
hello_message db 'Hello, world!', 0dh, 0ah, '$'

 .code
main proc
    mov ax, @data
    mov ds, ax
    mov ah, 9
    mov dx, offset hello_message
    int 21h

    mov ax, 4C00h
    int 21h
main endp
end main
// MS-DOS Intel IA-16 어셈블리어로 작성된 Hello, world! 출력 코드

 

어셈블리어는 기계어에 비하면 확실히 읽기 쉬웠지만, 여전히 컴퓨터 과학자나 전문가가 아닌 일반인들에게는 외계어와 다름없었습니다. 그래서 더욱 사람이 읽기 쉽고, 쓰기 쉬운 형태의 프로그래밍 언어, 즉 고급 프로그래밍 언어가 등장하게 됩니다.

고급 언어는 더더욱 사람이 읽고 쓰기 쉽게 설계된 언어로, 컴파일러를 통해 기계어로 변환되어 실행됩니다.
(다만 고급 언어는 기계어와 1:1로 대응되는 어셈블리어와 다르게 컴파일러를 거쳐야 하기 때문에 어셈블리어보다 성능은 떨어짐.)
대표적인 고급 언어중 하나가 바로 C 언어입니다.

1972년 Dennis Ritchie가 개발한 C 언어는, 어셈블리와 비슷한 수준의 성능과, 비교적 간단하고 쉬운 문법, 뛰어난 하드웨어 제어 능력 덕분에 컴퓨팅 세계에 혁명을 불어일으켰습니다.
다만 시간이 지나면서 점점 소프트웨어의 규모가 커져 C언어는 코드 관리가 어렵고, 구조가 복잡하다는 문제점이 생겼습니다.
이 문제를 해결하기 위해 등장한 언어가 바로 C++입니다.


C++은 Bjarne Stroustrup이 1983년에 개발한 언어로, C언어의 진화형이라고 할수 있습니다. 
C++는 기존의 C언어에 객체지향 프로그래밍(Object-Oriented Programming) 개념이 적용되어 클래스(Class)와 상속(Inheritance)등의 기능의 추가와 더 큰 규모의 프로그램에도 적합하여 현재도 윈도우, 리눅스 등의 여러 운영체제와 고성능이 필요한 프로그램/서버와 게임 등의 개발해 사용되고 있습니다.

설명은 이쯤하고, 원래 글 주제인 풀이로 넘어가겠습니다.
사실 2557번은 단순히 Hello World!를 출력하면 바로 끝나는 문제라 딱히 풀이랄게 없는데요..
아쉬운대로 C++의 입출력 방식을 설명하겠습니다. C++에는 기본적으로 3가지의 출력 방식이 있습니다.
1. iostream
2. stdio.h
3. cstdio

1. iostream

#include <iostream>

int main() {
    std::cout << "Hello World!";
    return 0;
}

iostream은 C++의 표준 입출력 라이브러리입니다.
C++은 객체지향 언어이기 때문에 스트림 객체를 사용하여 입출력합니다.
 + tmi : iostream은 input output stream의 약자라는 사아실.

2. stdio.h

#include <stdio.h>

int main() {
    printf("Hello World!");
    return 0;
}

stdio.h는 C 언어의 표준 입출력 라이브러리입니다.
printf();

scanf();

fopen();

fclose(); 
등의 펑션들이 있습니다.
 + tmi : stdio는 standare input output (표준 입출력) 의 약자입니다.

3. cstdio.h

#include <cstdio>

int main() {
    std::printf("Hello World!");
    return 0;
}

cstdio는 C++에서 사용하는 C 표준 입출력 라이브러리입니다.
stdio.h와 거의 동일하지만 cstdio를 사용 시 iostream처럼 std 네임스페이스 함수들을 사용합니다.


2557번은 위의 예시 코드들 중 아무거나 넣어서 사용하시면 됩니다.
대체로 iostream을 사용할텐데, 알고리즘 문제를 풀 때는 stdio가 속도와

메모리 면에서 조금 더 빠른 경우가 있어서 사용하곤 합니다.

 

여기까지 포스팅 마치겠습니다.
긴 글 읽어주셔서 정말 감사합니다!