{ }codelper
건너뛰며 반복P0371

길 끝에도 세우는 가로등

길이가 L미터인 산책로에 가로등을 세운다. 길의 시작점(0미터 지점)에 첫 가로등을 세우고, 거기서부터 s미터마다 하나씩 세운다. 길의 끝(L미터 지점)에는 간격이 맞지 않아도 가로등을 꼭 하나 세운다. 같은 지점에 가로등을 두 개 세우지는 않는다. 한 줄에 L과 s가 빈칸 하나로 띄워 주어진다. 가로등을 세우는 지점이 시작점에서 몇 미터 떨어져 있는지를, 가까운 것부터 한 줄에 하나씩 출력하라. 예를 들어 L = 10, s = 3이면 0, 3, 6, 9, 10이고, L = 10, s = 5이면 0, 5, 10이다.

입력
1 ≤ L ≤ 1,000, 1 ≤ s ≤ 1,000(모두 정수).
s가 L보다 클 수도 있다
출력
가로등 지점마다 한 줄씩, 작은 수부터.
단위 없이 숫자만 쓴다
예시 1 · stdin
10 3
stdout
0
3
6
9
10
예시 2 · stdin
10 5
stdout
0
5
10
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

걸음을 정해 건너뛰는 반복문은 언어마다 모양이 달라요.
Python은 for x in range(0, L, s)이고 끝(L)은 들어가지 않아요.
C·C++·Java·C#·JS·TS는 for (x = 0; x < L; x += s), 크레이콘은 반복 (x = 0; x < L; x += s)예요.
이렇게 L 앞까지만 돌고 나서 L을 한 번 쓰면 끝 지점이 겹치지도 빠지지도 않아요.
함정 하나: x <= L까지 돌고 L을 또 쓰면, L이 s의 배수일 때 끝 지점이 두 번 나와요(예시 2가 0 5 10 10).
함정 둘: range(0, L + 1, s)처럼 끝까지 돌기만 하고 L을 따로 쓰지 않으면, L이 s의 배수가 아닐 때 끝 가로등이 빠져요(예시 1이 0 3 6 9).
함정 셋: 지점 대신 횟수를 세어 i < L / s인 동안 i * s를 쓰는 방법은 언어에 따라 결과가 갈려요.
C·C++·Java·C#은 정수끼리의 /가 몫만 남겨서 10 / 3이 3이고, i가 0, 1, 2일 때만 돌아 9가 빠져요(예시 1이 0 3 6 10).
JS·TS·크레이콘은 /가 3.333…까지 나눠서 i가 3일 때도 돌아 맞게 나와요.
Python은 range(L / s)가 소수를 받지 않아 TypeError로 멈추고, range(L // s)로 고치면 C처럼 9가 빠져요.

Pythonmain.py · 5 줄
L, s = map(int, input().split())# range(0, L, s)는 0부터 s씩 건너뛰며, 끝(L)은 넣지 않는다for x in range(0, L, s):    print(x)print(L)   # 길 끝의 가로등은 따로 한 번
JavaScriptmain.js · 8 줄
const [L, s] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out = [];// x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다for (let x = 0; x < L; x += s) {  out.push(x);}out.push(L); // 길 끝의 가로등은 따로 한 번console.log(out.join("\n"));
TypeScriptmain.ts · 9 줄
import { readFileSync } from "node:fs";const [L, s]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out: number[] = [];// x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다for (let x = 0; x < L; x += s) {  out.push(x);}out.push(L); // 길 끝의 가로등은 따로 한 번console.log(out.join("\n"));
JavaMain.java · 13 줄
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int L = sc.nextInt(), s = sc.nextInt();        // x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다        for (int x = 0; x < L; x += s) {            System.out.println(x);        }        System.out.println(L);   // 길 끝의 가로등은 따로 한 번    }}
C#Main.cs · 16 줄
using System; class Program{    static void Main()    {        string[] parts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int L = int.Parse(parts[0]), s = int.Parse(parts[1]);        // x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다        for (int x = 0; x < L; x += s)        {            Console.WriteLine(x);        }        Console.WriteLine(L);   // 길 끝의 가로등은 따로 한 번    }}
C++main.cpp · 11 줄
#include <iostream> int main() {    int L, s;    std::cin >> L >> s;    // x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다    for (int x = 0; x < L; x += s) {        std::cout << x << "\n";    }    std::cout << L << "\n";   // 길 끝의 가로등은 따로 한 번}
Cmain.c · 12 줄
#include <stdio.h> int main(void) {    int L, s;    if (scanf("%d %d", &L, &s) != 2) return 0;    /* x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다 */    for (int x = 0; x < L; x += s) {        printf("%d\n", x);    }    printf("%d\n", L);   /* 길 끝의 가로등은 따로 한 번 */    return 0;}
Craykonmain.cray · 9 줄
nums = 콘솔.수들읽기();L = nums[0];s = nums[1];// x += s로 s씩 건너뛴다. 끝(L)은 넣지 않는다반복 (x = 0; x < L; x += s){    콘솔.쓰기(x);}콘솔.쓰기(L); // 길 끝의 가로등은 따로 한 번