{ }codelper
do-while 반복P0255

윷이나 모가 나오면 한 번 더

윷놀이에서 한 차례에는 윷가락을 적어도 한 번 던진다. 던진 결과가 윷이나 모이면 한 번 더 던지고, 도·개·걸이면 그 차례가 끝난다. 결과는 수로 적는다.
도는 1, 개는 2, 걸은 3, 윷은 4, 모는 5이고, 말은 이 수만큼 간다. 한 사람이 여러 차례에 걸쳐 던진 결과가 던진 차례대로 모두 주어진다. 첫 줄에 던진 횟수 n이, 둘째 줄에 결과 n개가 빈칸 하나씩 띄워 주어진다. 마지막 결과는 1, 2, 3 가운데 하나라서, 마지막 차례도 끝까지 주어진다. 차례마다 그 차례에 던진 결과를 모두 더한 값(그 차례에 말이 가는 칸 수)을 한 줄에 하나씩 차례대로 출력하라.

입력
1 ≤ n ≤ 1,000.
결과는 1 ~ 5의 정수이고, 마지막 결과는 1, 2, 3 가운데 하나다
출력
차례 수만큼의 줄, 줄마다 그 차례에 가는 칸 수
예시 1 · stdin
6
4 2 3 5 4 1
stdout
6
3
10
main.py
입력(stdin)

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

$ 준비됐어요

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

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

한 차례는 '먼저 던지고, 던진 뒤에 다시 던질지 묻는' 반복이라 do-while이 딱 맞아요: do { t = a[i++]; total += t; } while (t >= 4);.
do-while이 있는 언어는 C·C++·Java·C#·JS·TS예요.
C·C++·Java·C#은 while (…) 뒤에 세미콜론이 없으면 컴파일되지 않고, JS·TS는 빼도 자동으로 채워 주지만 보통 써 둬요.
Python과 크레이콘에는 do-while이 없어서 while True:(크레이콘 동안 (참))로 들어가 몸통 맨 끝에서 if t < 4: break(크레이콘 그만;)로 '적어도 한 번'을 만들어요.
이때 묻는 줄을 더하는 줄보다 앞에 두면 차례를 끝낸 도·개·걸이 빠져서 4 2가 6이 아니라 4가 돼요.
보통 while로 쓰려면 첫 번을 반복 밖에서 던져야 하는데, 그 첫 결과를 더하는 것을 잊기 쉬워요.
경계도 조심해요.
윷(4)도 다시 던지니 t >= 4(또는 t > 3)이고, t > 4나 t == 5라고 쓰면 윷에서 차례가 끝나요.

Pythonmain.py · 13 줄
n = int(input())throws = list(map(int, input().split()))i = 0while i < n:    total = 0    # 파이썬에는 do-while이 없다: while True로 들어가 끝에서 물어 "적어도 한 번" 던진다    while True:        t = throws[i]        i += 1        total += t        if t < 4:   # 도·개·걸이면 차례가 끝난다(더한 뒤에 묻는다)            break    print(total)
JavaScriptmain.js · 14 줄
const [n, ...throws] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out = [];let i = 0;while (i < n) {  let total = 0;  let t;  // 한 번은 던지고, 윷(4)·모(5)가 나왔으면 다시 던진다  do {    t = throws[i++];    total += t;  } while (t >= 4);  out.push(total);}console.log(out.join("\n"));
TypeScriptmain.ts · 14 줄
import { readFileSync } from "node:fs";const [n, ...throws]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const out: number[] = [];let i = 0;while (i < n) {  let total = 0;  let t: number;  do {    t = throws[i++];    total += t;  } while (t >= 4);  out.push(total);}console.log(out.join("\n"));
JavaMain.java · 22 줄
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int[] throwsList = new int[n];        for (int k = 0; k < n; k++) throwsList[k] = sc.nextInt();        StringBuilder out = new StringBuilder();        int i = 0;        while (i < n) {            int total = 0;            int t;            do {                t = throwsList[i++];                total += t;            } while (t >= 4);   // do-while은 세미콜론으로 끝난다            out.append(total).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 26 줄
using System;using System.Linq;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine().Trim());        int[] throws = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();        var sb = new StringBuilder();        int i = 0;        while (i < n)        {            int total = 0;            int t;            do            {                t = throws[i++];                total += t;            } while (t >= 4);            sb.Append(total).Append('\n');        }        Console.Write(sb);    }}
C++main.cpp · 18 줄
#include <iostream>#include <vector> int main() {    int n;    std::cin >> n;    std::vector<int> a(n);    for (auto &x : a) std::cin >> x;    int i = 0;    while (i < n) {        int total = 0, t;        do {            t = a[i++];            total += t;        } while (t >= 4);        std::cout << total << "\n";    }}
Cmain.c · 17 줄
#include <stdio.h> int main(void) {    int n, a[1000];    scanf("%d", &n);    for (int k = 0; k < n; k++) scanf("%d", &a[k]);    int i = 0;    while (i < n) {        int total = 0, t;        do {            t = a[i++];            total += t;        } while (t >= 4);   /* 윷(4)·모(5)면 한 번 더 */        printf("%d\n", total);    }    return 0;}
Craykonmain.cray · 19 줄
n = 콘솔.줄읽기().수로변환();던짐 = 콘솔.수들읽기();i = 0;동안 (i < n){    합 = 0;    // 크레이콘에는 do-while이 없다: 동안 (참)으로 들어가 끝에서 물어 그만    동안 (참)    {        t = 던짐[i];        i++;        합 = 합 + t;        만약 (t < 4)        {            그만;        }    }    콘솔.쓰기(합);}