흐름 제어 · 06
반복문
같은 일을 여러 번: for와 while.
반복문은 같은 코드를 여러 번 돌려요.
아래 예제는 1부터 n까지 수를 하나씩 찍으면서 더하고, 마지막에 합계를 찍어요.
n = int(input())total = 0for i in range(1, n + 1): print(i) total += iprint(total)const n = Number(require("fs").readFileSync(0, "utf8"));let total = 0;for (let i = 1; i <= n; i++) { console.log(i); total += i;}console.log(total);import { readFileSync } from "node:fs";const n: number = Number(readFileSync(0, "utf8"));let total: number = 0;for (let i = 1; i <= n; i++) { console.log(i); total += i;}console.log(total);import java.util.Scanner; public class Main { public static void main(String[] args) { int n = new Scanner(System.in).nextInt(); int total = 0; for (int i = 1; i <= n; i++) { System.out.println(i); total += i; } System.out.println(total); }}using System; class Program{ static void Main() { int n = int.Parse(Console.ReadLine()); int total = 0; for (int i = 1; i <= n; i++) { Console.WriteLine(i); total += i; } Console.WriteLine(total); }}#include <iostream> int main() { int n, total = 0; std::cin >> n; for (int i = 1; i <= n; i++) { std::cout << i << '\n'; total += i; } std::cout << total << '\n';}#include <stdio.h> int main(void) { int n, total = 0; scanf("%d", &n); for (int i = 1; i <= n; i++) { printf("%d\n", i); total += i; } printf("%d\n", total); return 0;}n = 콘솔.줄읽기().수로변환();total = 0;반복 (i = 1; i <= n; i++){ 콘솔.쓰기(i); total += i;}콘솔.쓰기(total);5
1 2 3 4 5 15
핵심
- 가장 흔한 꼴은 "1부터 n까지"예요.
시작 값, 계속할 조건, 한 바퀴마다 바뀌는 양을 정해요. - 반복하면서 값을 모으는 누적(
total += i)은 합계·개수·최댓값 문제의 기본이에요. - 목록이나 문자열을 하나씩 돌 때는 번호 없이 값을 바로 꺼내는 짧은 꼴이 있어요.
- while은 조건만 보고, 조건이 참인 동안 계속 돌아요.
break는 반복을 빠져나가고continue는 이번 바퀴만 건너뛰어요.
둘 다 가장 안쪽 반복 하나에만 적용돼서, 이중 반복을 한 번에 나가려면 표시 변수를 두거나 함수에서return해요.
언어별로 쓰는 법
| Python | for i in range(1, n + 1): — range의 끝 값은 포함하지 않아요.간격은 range(10, 0, -2), 하나씩은 for x in nums:, 조건은 while 조건:.do-while은 없어요 |
|---|---|
| JavaScript | for (let i = 1; i <= n; i++), 간격은 i -= 2.하나씩은 for (const x of nums).while (조건) { }, do { } while (조건);.바깥 반복까지 나가려면 이름표 break outer; |
| TypeScript | JavaScript와 같아요 |
| Java | for (int i = 1; i <= n; i++), 하나씩은 for (int x : nums).while, do { } while.이름표 break outer;도 돼요 |
| C# | for (int i = 1; i <= n; i++), 하나씩은 foreach (var x in nums).while, do { } while |
| C++ | for (int i = 1; i <= n; i++), 하나씩은 for (int x : nums).while, do { } while |
| C | for (int i = 1; i <= n; i++) — 값을 하나씩 꺼내는 꼴이 없어서 번호로 돌아요.while, do { } while |
| Craykon | 반복 (i = 1; i <= n; i++), 하나씩은 각각 (x 에서 nums), 조건은 동안 (조건) { }.빠져나가기 그만, 건너뛰기 건너뛰기.do-while은 없어요.동안은 장면(애니메이션)에서는 한 바퀴마다 한 화면씩 쉬지만, 콘솔 풀이에서는 쉬지 않고 돌아요 |
자주 하는 실수
while에서 조건을 바꾸지 않았어요
i = 1
while i <= 5:
print(i)→ 끝나지 않아요. 1만 끝없이 찍어요
조건을 바꾸는 줄(i += 1, i++)을 몸체에 꼭 넣어요.
반복이 끝난 뒤에 i를 썼어요Java · C# · C · C++ · JavaScript · TypeScript · Craykon
for (int i = 0; i < 3; i++) { }
printf("%d\n", i);→ 오류 — for에서 만든 i는 반복 안에서만 있어요
반복 뒤에도 필요하면 반복 앞에서 만들어요.
Python의 i는 반복 뒤에도 마지막 값으로 남아요.
for … in으로 값을 돌았어요JavaScript · TypeScript
const nums = [10, 20];
for (const x in nums) console.log(x);→ 0, 1 — 값이 아니라 번호예요(그것도 문자열 "0", "1")
값은 for (const x of nums)로 돌아요.
언어마다 다른 점
Python
C 계열과 크레이콘도
하나 차이로 답이 틀리는 일이 반복문에서 가장 흔해요.
Python
range(a, b)는 b를 포함하지 않아서, 1부터 n까지는 range(1, n + 1)이에요.C 계열과 크레이콘도
i <= n인지 i < n인지 한 번 더 확인해요.하나 차이로 답이 틀리는 일이 반복문에서 가장 흔해요.