RiseOJ는 solved.ac와 제휴 관계가 없습니다. 티어 아이콘 © solved.ac. solved.ac
← 브론즈 V

변수

값을 저장하는 이름표 — 자료형, 선언, 대입의 기초.

기초 & 구현 Bronze V 브론즈 V
1강 변수와 자료형: 값을 담는 그릇 공식

변수란?

변수(variable) 는 값을 담아 두는 이름표가 붙은 상자입니다. 프로그램은
입력으로 받은 수, 중간 계산 결과 따위를 변수에 저장해 두고 꺼내 씁니다.

int age = 17; // 정수
double pi = 3.14; // 실수
char grade = 'A'; // 문자 하나
age = 17 # 정수
pi = 3.14 # 실수
grade = 'A' # 문자열(파이썬엔 char 타입이 없다)

C++은 변수를 만들 때 자료형을 반드시 적어야 하고, 파이썬은 대입하는 값에
따라 자료형이 자동으로 정해집니다.


1. 자주 쓰는 정수 자료형 (C++)

자료형 크기 대략적인 범위
int 4바이트 약 -21억 ~ 21억
long long 8바이트 약 -9.2 × 10^18 ~ 9.2 × 10^18

규칙은 간단합니다. 계산 결과가 약 21억(2,147,483,647)을 넘을 수 있으면
long long을 쓰세요.
예를 들어 두 수의 곱이나 1부터 N까지의 합은 금방
int 범위를 넘깁니다.

long long a = 1000000, b = 1000000;
cout << a * b << '\n'; // 10^12 — long long이라 안전

파이썬의 정수(int)는 크기 제한이 없으므로 오버플로를 걱정할 필요가 없습니다.


2. 실수 자료형

소수를 담을 땐 C++에서 double을 씁니다 (float보다 정밀해서 거의 항상
double을 권장).

double x = 1.0 / 3.0; // 0.333333...

실수는 정확히 저장되지 않을 수 있다는 점만 기억하세요. 0.1 + 0.2
정확히 0.3이 아닌 것이 대표적입니다. 그래서 실수는 ==로 비교하지 않고,
"차이가 아주 작으면 같다"로 판단합니다.


3. 자료형 변환 (형변환)

int a = 7, b = 2;
double r = (double)a / b; // 3.5 — 한쪽을 double로 바꿔야 함
a, b = 7, 2
print(a / b) # 3.5 (파이썬 /는 항상 실수 나눗셈)
print(a // b) # 3 (정수 나눗셈)

C++에서 int / int정수 나눗셈이라 7 / 2 == 3이 됩니다. 실수 결과가
필요하면 한쪽을 double로 형변환하세요.


4. 자주 하는 실수

  • 오버플로int끼리 곱했는데 결과가 21억을 넘는 경우. long long으로 바꾸거나, 곱하기 전에 (long long)으로 형변환하세요.
  • 초기화 안 한 변수 — C++에서 값을 넣지 않은 지역 변수는 쓰레기 값을 가집니다. 합을 구할 땐 꼭 int sum = 0;처럼 0으로 시작하세요.
  • 정수 나눗셈 착각 — 평균을 구할 때 (a+b)/2가 정수로 잘리는 실수가 흔합니다.

연습 팁

새 변수를 만들 때마다 "이 값이 가질 수 있는 최댓값은 얼마인가?"를 먼저
떠올려 보세요. 그 답이 21억을 넘으면 망설이지 말고 long long입니다.

2강 정수 오버플로와 자료형 함정 공식

변수가 담을 수 있는 한계

변수는 값을 담는 그릇이지만, 그릇마다 담을 수 있는 최대 크기가 정해져 있습니다.
이 한계를 넘는 순간 값이 망가지는 것을 오버플로(overflow) 라고 합니다. Bronze
문제에서 "분명 식은 맞는데 답이 이상하다"의 90%는 이 함정입니다.


1. int의 진짜 한계

C++의 int는 32비트라서 약 21억(2,147,483,647) 까지만 담깁니다.

int a = 2000000000;   // 20억
int b = a + a;        // 40억 -> int 한계 초과!
cout << b << '\n';    // -294967296  (음수가 튀어나온다)

40억은 21억을 넘으므로 그릇이 넘쳐서 음수로 돌아 버립니다. 이런 현상을
"값이 한 바퀴 돌았다"고 표현합니다.


2. 언제 long long이 필요한가

다음 신호가 보이면 망설이지 말고 long long을 쓰세요.

상황 예시
두 수의 곱 \(10^5 \times 10^5 = 10^{10}\) (int 초과)
1부터 N까지의 합 \(N = 10^5\) 면 약 \(5 \times 10^9\)
거듭제곱 \(2^{40}\) 은 약 \(10^{12}\)
long long a = 100000, b = 100000;
cout << a * b << '\n';   // 10^10 — long long이라 안전

곱셈은 특히 위험합니다. int끼리 곱하면 결과가 큰데도 곱하는 순간 int로 계산
되므로, 곱하기 전에 한쪽을 키워 줘야 합니다.

int x = 100000, y = 100000;
long long bad  = x * y;            // 먼저 int로 계산돼서 이미 망가짐
long long good = (long long)x * y; // 한쪽을 long long으로 — 안전

3. 파이썬은 왜 안전한가

파이썬의 정수에는 크기 제한이 없습니다. 메모리가 허락하는 한 얼마든지 커집니다.

x = 10 ** 100   # 1 뒤에 0이 100개 — 그냥 됩니다
print(x * x)

그래서 파이썬으로 풀 땐 오버플로 걱정이 없지만, 대신 큰 수 연산이 C++보다 느립니다.


4. 실수의 함정

double은 소수를 담지만 정확하지 않습니다.

double d = 0.1 + 0.2;
cout << (d == 0.3) << '\n';   // 0 (false!)

그래서 실수는 절대 ==로 비교하지 않습니다. "차이가 아주 작으면 같다"로 봅니다.

if (abs(d - 0.3) < 1e-9) { /* 같다고 본다 */ }

정리

  • 계산 중 값이 21억을 넘을 수 있으면 long long.
  • 곱셈은 곱하기 전에 (long long)으로 형변환.
  • 실수는 == 금지, 오차 허용 비교.
  • 새 변수를 만들 때마다 "이 값의 최댓값은?"을 먼저 떠올리는 습관을 들이세요.
3강 변수로 푸는 실전 문제 공식

변수 사용을 연습하는 문제 패턴

변수의 핵심은 "값을 받아 두고, 필요할 때 꺼내 쓰고, 갱신한다"입니다. 여기서는
실제 문제에서 변수를 어떻게 굴리는지 손에 익혀 봅니다.


1. 값 교환하기 (swap)

두 변수의 값을 맞바꾸려면 임시 변수가 필요합니다.

int a = 3, b = 5;
int tmp = a;   // a를 잠깐 보관
a = b;         // a에 b를 넣고
b = tmp;       // b에 보관해 둔 옛 a를 넣는다
// 이제 a = 5, b = 3
a, b = 3, 5
a, b = b, a    # 파이썬은 한 줄로 교환된다

a = b; b = a;처럼 바로 하면 a값이 먼저 덮여서 둘 다 같아지니 주의하세요.


2. 최댓값 / 최솟값 추적

여러 값 중 가장 큰 값을 찾을 땐, "지금까지의 최댓값"을 담는 변수를 둡니다.

int best = -2147483647;     // 충분히 작은 값으로 시작
for (int i = 0; i < n; i++) {
    int x; cin >> x;
    if (x > best) best = x; // 더 크면 갱신
}
cout << best << '\n';
best = -10**9
for _ in range(n):
    x = int(input())
    best = max(best, x)
print(best)

시작값을 잘 정하는 게 포인트입니다. 최댓값을 찾을 땐 아주 작은 값, 최솟값을
찾을 땐 아주 큰 값으로 시작하세요.


3. 누적(합·개수) 세기

합계나 개수는 0에서 시작하는 변수에 차곡차곡 더합니다.

long long sum = 0;   // 합은 커질 수 있으니 long long
int count = 0;
for (int i = 0; i < n; i++) {
    int x; cin >> x;
    sum += x;
    if (x % 2 == 0) count++;   // 짝수 개수도 함께 센다
}
cout << sum << ' ' << count << '\n';
total = 0
count = 0
for x in map(int, input().split()):
    total += x
    if x % 2 == 0:
        count += 1
print(total, count)

여기서 sumint로 두면 N이 클 때 오버플로가 납니다. 합은 long long
기본이라고 외워 두세요.


4. 자주 하는 실수

  • 초기화 누락 — C++에서 int sum;만 쓰면 쓰레기 값으로 시작합니다. 꼭 = 0.
  • 잘못된 시작값 — 최댓값 변수를 0으로 시작하면, 모든 값이 음수일 때 틀립니다.
  • 합 오버플로 — 누적 합 변수는 거의 항상 long long.

정리

문제를 보면 "어떤 값을 기억해야 하는가?"를 먼저 찾으세요. 그 값마다 변수를
하나씩 만들고, 적절한 시작값으로 초기화한 뒤, 반복하며 갱신하면 됩니다.