지우는 n일 동안 독서 마라톤을 한다.
첫날에는 a쪽을 읽는다.
둘째 날부터는 바로 전날 읽은 쪽수에 d를 더한 만큼 읽는다.
다만 하루에 m쪽보다 많이 읽지는 않는다.
전날 읽은 쪽수에 d를 더한 값이 m보다 크면 그날은 m쪽만 읽는다.
한 줄에 a, d, m, n이 빈칸 하나씩 띄워 주어진다.
n일 동안 읽은 쪽수를 모두 더한 값을 출력하라.
입력
1 ≤ a ≤ m ≤ 10,000, 0 ≤ d ≤ 10,000, 1 ≤ n ≤ 100,000 (모두 정수)
출력
n일 동안 읽은 쪽수의 합을 한 줄에. 쉼표 없이 숫자만 쓴다
예시 1 · stdin
10 5 22 5
stdout
89
예시 2 · stdin
3 0 3 4
stdout
12
main.py
오류 목록00F8 ↓ · ⇧F8 ↑
입력(stdin)
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
쌓아 가기는 변수 둘을 반복 밖에서 만들고(오늘 읽을 쪽수 pages = a, 합 total = 0), 바퀴마다 total += pages로 쌓은 다음 pages를 내일 값으로 바꾸는 모양이에요. +=는 8개 언어 모두 같아요. 예시 1은 10 + 15 + 20 + 22 + 22 = 89예요. 둘 중 작은 값: Python min(pages + d, m), JS·TS Math.min, Java Math.min, C# Math.Min, C++ std::min(<algorithm>), 크레이콘 수학.작은수. C 표준 라이브러리에는 정수용 min이 없어서 if (pages > m) pages = m;으로 써요. 함정 넷: ① 차례를 바꿔 먼저 늘리고 나서 더하면 첫날의 a쪽이 빠져요. ② 합을 담는 변수를 반복 안에서 만들면 바퀴마다 0으로 돌아가요. ③ 상한 m을 잊으면 뒤쪽 날들이 너무 커져요. ④ 날을 1부터 세면서 day < n으로 물으면 마지막 날이 빠져요(day <= n이거나, 0부터 세어 day < n). 이 문제의 합은 가장 커도 1,000,000,000(십억)이라 Java·C#·C·C++의 int(약 21억까지)에 담겨요. 범위가 더 커지면 long(C·C++은 long long)에 쌓아야 해요.
Pythonmain.py · 7 줄
a, d, m, n = map(int, input().split())pages = a # 오늘 읽는 쪽수total = 0 # 지금까지 읽은 쪽수for _ in range(n): total += pages pages = min(pages + d, m) # 내일 읽을 쪽수(m을 넘지 않게)print(total)
JavaScriptmain.js · 8 줄
const [a, d, m, n] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);let pages = a; // 오늘 읽는 쪽수let total = 0; // 지금까지 읽은 쪽수for (let day = 1; day <= n; day++) { total += pages; pages = Math.min(pages + d, m); // 내일 읽을 쪽수(m을 넘지 않게)}console.log(total);
TypeScriptmain.ts · 9 줄
import { readFileSync } from "node:fs";const [a, d, m, n]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);let pages: number = a; // 오늘 읽는 쪽수let total = 0; // 지금까지 읽은 쪽수for (let day = 1; day <= n; day++) { total += pages; pages = Math.min(pages + d, m); // 내일 읽을 쪽수(m을 넘지 않게)}console.log(total);
JavaMain.java · 15 줄
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(), d = sc.nextInt(), m = sc.nextInt(), n = sc.nextInt(); int pages = a; // 오늘 읽는 쪽수 int total = 0; // 지금까지 읽은 쪽수(가장 커도 10억이라 int에 담긴다) for (int day = 1; day <= n; day++) { total += pages; pages = Math.min(pages + d, m); // 내일 읽을 쪽수(m을 넘지 않게) } System.out.println(total); }}
C#Main.cs · 18 줄
using System;class Program{ static void Main() { string[] parts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); int a = int.Parse(parts[0]), d = int.Parse(parts[1]), m = int.Parse(parts[2]), n = int.Parse(parts[3]); int pages = a; // 오늘 읽는 쪽수 int total = 0; // 지금까지 읽은 쪽수(가장 커도 10억이라 int에 담긴다) for (int day = 1; day <= n; day++) { total += pages; pages = Math.Min(pages + d, m); // 내일 읽을 쪽수(m을 넘지 않게) } Console.WriteLine(total); }}
C++main.cpp · 14 줄
#include <algorithm>#include <iostream>int main() { int a, d, m, n; std::cin >> a >> d >> m >> n; int pages = a; // 오늘 읽는 쪽수 int total = 0; // 지금까지 읽은 쪽수(가장 커도 10억이라 int에 담긴다) for (int day = 1; day <= n; day++) { total += pages; pages = std::min(pages + d, m); // 내일 읽을 쪽수(m을 넘지 않게) } std::cout << total << '\n';}
Cmain.c · 15 줄
#include <stdio.h>int main(void) { int a, d, m, n; if (scanf("%d %d %d %d", &a, &d, &m, &n) != 4) return 0; int pages = a; // 오늘 읽는 쪽수 int total = 0; // 지금까지 읽은 쪽수(가장 커도 10억이라 int에 담긴다) for (int day = 1; day <= n; day++) { total += pages; pages += d; // 내일 읽을 쪽수 if (pages > m) pages = m; } printf("%d\n", total); return 0;}
Craykonmain.cray · 13 줄
수들 = 콘솔.수들읽기();a = 수들[0];d = 수들[1];m = 수들[2];n = 수들[3];pages = a; // 오늘 읽는 쪽수total = 0; // 지금까지 읽은 쪽수반복 (day = 1; day <= n; day++){ total += pages; pages = 수학.작은수(pages + d, m); // 내일 읽을 쪽수(m을 넘지 않게)}콘솔.쓰기(total);