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

사칙연산

덧셈·뺄셈·곱셈·나눗셈과 연산자 우선순위, 정수 나눗셈.

수학 Bronze V 브론즈 V
1강 사칙연산과 나머지: 정수 나눗셈의 함정 공식

사칙연산 한눈에

연산 기호 예 (73)
덧셈 + 10
뺄셈 - 4
곱셈 * 21
나눗셈 / C++: 2, 파이썬: 2.333...
나머지 % 1

1. 정수 나눗셈 vs 실수 나눗셈

이게 초심자가 가장 많이 틀리는 부분입니다.

cout << 7 / 3 << '\n'; // 2 (정수끼리면 소수점 버림)
cout << 7.0 / 3 << '\n'; // 2.3333...
cout << (double)7 / 3 << '\n'; // 2.3333...
print(7 / 3) # 2.3333... (/는 항상 실수)
print(7 // 3) # 2 (//가 정수 나눗셈)

C++의 /는 양쪽이 정수면 소수점을 버립니다. 실수 결과가 필요하면 한쪽을
double로 만드세요. 파이썬은 반대로 /가 실수, //가 정수 나눗셈입니다.


2. 나머지 연산 %

a % bab로 나눈 나머지입니다. 활용도가 아주 높습니다.

if (n % 2 == 0) cout << "짝수\n";
else cout << "홀수\n";
  • 마지막 자리 숫자: n % 10
  • 어떤 수로 나누어떨어지는지: n % k == 0
  • 시계처럼 한 바퀴 돌리기: (i + 1) % n

3. 음수의 나눗셈 / 나머지

언어마다 음수 처리가 다릅니다.

cout << (-7) / 2 << '\n'; // -3 (0 방향으로 버림)
cout << (-7) % 2 << '\n'; // -1
print(-7 // 2) # -4 (음의 무한대 방향으로 내림)
print(-7 % 2) # 1 (결과 부호가 나누는 수를 따라감)

음수가 섞인 나머지를 쓸 땐 부호 규칙을 꼭 확인하세요. 항상 0 이상인 나머지가
필요하면 ((a % b) + b) % b 패턴을 씁니다.


4. 오버플로 주의

int a = 100000, b = 100000;
cout << a * b << '\n'; // 잘못! int 범위(약 21억) 초과
cout << (long long)a * b << '\n'; // 10^10 — 올바름

곱셈은 순식간에 int를 넘깁니다. 결과가 클 것 같으면 long long을 쓰거나
곱하기 전에 한쪽을 (long long)으로 형변환하세요. ([변수와 자료형] 참고)


5. 자주 하는 실수

  • 정수 나눗셈으로 평균이 잘림(a + b) / 2가 소수점을 버립니다.
  • 0으로 나누기b가 0일 수 있는 입력에서 a / b, a % b는 런타임 에러(예외)입니다.
  • 연산 우선순위a + b * c는 곱셈 먼저. 의도한 순서면 괄호로 (a + b) * c처럼 명확히 하세요.

연습 팁

나눗셈을 쓸 때마다 "정수로 잘려야 하나, 실수로 남아야 하나?"를 한 번
멈춰서 확인하는 습관을 들이면 사칙연산에서 나오는 실수의 절반은 사라집니다.

2강 정수 나눗셈과 나머지의 함정 공식

더하기보다 어려운 나눗셈

사칙연산 중 덧셈·뺄셈·곱셈은 직관적이지만, 나눗셈과 나머지는 함정이
숨어 있습니다. 특히 C++의 정수 나눗셈과 음수 처리에서 실수가 잦습니다.


1. C++의 정수 나눗셈은 버림

int / int는 소수를 버립니다.

cout << 7 / 2 << '\n';   // 3 (3.5가 아님)
cout << 7 % 2 << '\n';   // 1 (나머지)

실수 결과가 필요하면 한쪽을 double로 바꿉니다.

cout << (double)7 / 2 << '\n';   // 3.5

파이썬은 둘을 나눠서 씁니다.

print(7 / 2)    # 3.5  (실수 나눗셈)
print(7 // 2)   # 3    (몫)
print(7 % 2)    # 1    (나머지)

2. 0으로 나누기 금지

int x = 5 / 0;   // 런타임 에러!

나누는 수가 0이 될 수 있는지 늘 확인하세요. 입력에 0이 섞여 있을 수 있습니다.


3. 음수의 나눗셈·나머지

언어마다 음수 처리가 다릅니다. 이게 큰 함정입니다.

cout << -7 / 2 << '\n';   // -3  (0 방향으로 버림)
cout << -7 % 2 << '\n';   // -1  (나머지가 음수!)
print(-7 // 2)   # -4  (음의 무한대 방향으로 버림)
print(-7 % 2)    # 1   (나머지가 항상 0 이상)

C++의 %음수가 나올 수 있고, 파이썬의 %항상 0 이상입니다.
"나머지를 항상 양수로" 만들려면 C++에서 이렇게 보정합니다.

int r = ((x % m) + m) % m;   // 항상 0 이상 m 미만

4. 연산자 우선순위

곱셈·나눗셈이 덧셈·뺄셈보다 먼저입니다. 헷갈리면 괄호를 쓰세요.

int x = 2 + 3 * 4;     // 14  (3*4 먼저)
int y = (2 + 3) * 4;   // 20

평균 같은 식은 괄호가 거의 필수입니다: (a + b) / 2.


정리

  • C++ int / int는 버림, 실수가 필요하면 형변환.
  • 0으로 나누기 금지.
  • 음수 나머지는 언어마다 다르다 — C++은 음수가 될 수 있다.
  • 헷갈리는 식은 괄호로 우선순위를 명시.
3강 사칙연산 응용 문제 풀이 공식

사칙연산만으로 푸는 문제들

거창한 알고리즘 없이 식 하나로 풀리는 문제가 Bronze에 많습니다. 핵심은
"문제의 말을 수식으로 옮기기"입니다. 대표 패턴을 익혀 봅시다.


1. 자릿수 분리

세 자리 수의 각 자리 숫자를 뽑으려면 나눗셈과 나머지를 씁니다.

int n;  cin >> n;            // 예: 472
int hundreds = n / 100;       // 4
int tens     = (n / 10) % 10; // 7
int ones     = n % 10;        // 2
n = int(input())
hundreds = n // 100
tens = (n // 10) % 10
ones = n % 10

% 10은 "맨 끝 자리", // 10은 "맨 끝 자리 버리기"라고 기억하세요.


2. 시간/단위 변환

총 초를 시·분·초로 바꾸기:

int total;  cin >> total;        // 총 초
int h = total / 3600;
int m = (total % 3600) / 60;
int s = total % 60;
cout << h << ' ' << m << ' ' << s << '\n';
total = int(input())
h, rem = divmod(total, 3600)   # 몫과 나머지를 한 번에
m, s = divmod(rem, 60)
print(h, m, s)

파이썬 divmod(a, b)(a // b, a % b)를 한 번에 줍니다.


3. 올림 나눗셈

"N명을 한 팀에 K명씩, 몇 팀 필요?"처럼 올림이 필요할 때:

int teams = (n + k - 1) / k;   // 올림 나눗셈 관용구
import math
teams = math.ceil(n / k)        # 또는 (n + k - 1) // k

(n + k - 1) / k는 나머지가 있으면 한 팀을 더 만드는 표준 기법입니다.


4. 자주 하는 실수

  • 오버플로 — 곱셈 결과가 21억을 넘는데 int로 계산. (long long)으로 형변환.
  • 정수 나눗셈 착각 — 평균을 a / b로 했더니 소수가 잘림. 실수가 필요하면 형변환.
  • 올림을 그냥 나눗셈으로n / k는 버림이라 마지막 팀을 빠뜨림.

정리

문제의 문장을 한 줄씩 수식으로 번역하는 연습이 핵심입니다. 자릿수 분리(%10,
/10), 단위 변환(divmod), 올림 나눗셈 — 이 세 가지 도구면 사칙연산 문제의
대부분을 처리할 수 있습니다.