노래 가사 n줄이 주어진다.
가사의 줄은 문자가 하나도 없는 빈 줄일 수 있고, 빈칸 여러 개로 시작할 수도 있다.
빈 줄이 아닌 줄에만 위에서부터 1, 2, 3, … 차례로 번호를 붙인다.
빈 줄이 아닌 줄은 번호, 쌍점(:), 빈칸 하나, 그 줄의 내용을 차례로 붙여 한 줄에 출력한다.
줄의 내용은 앞의 빈칸과 가운데 빈칸까지 입력 그대로 출력한다.
빈 줄은 번호 없이 빈 줄 그대로 출력한다.
마지막 줄에는 번호를 붙인 줄의 수와 빈 줄의 수를 빈칸 하나로 띄워 출력한다.
예제의 첫 가사 줄은 빈칸 두 개로 시작하고, 셋째와 다섯째 가사 줄은 빈 줄이다.
입력
첫 줄에 n(1 ≤ n ≤ 1,000, 쉼표 없이 숫자만), 다음 n줄에 가사가 한 줄씩 주어진다. 가사 한 줄은 0~80글자이고 영어 대소문자, 숫자, 빈칸, 그리고 . , ! ? ' 로만 되어 있다. 빈칸으로 끝나는 줄은 없다(그래서 빈칸만 있는 줄도 없다). 마지막 가사 줄이 빈 줄일 수도 있다
출력
가사 줄마다 한 줄씩 n줄, 그리고 마지막 줄에 번호를 붙인 줄의 수와 빈 줄의 수
예시 1 · stdin
5
la la la
Twinkle, twinkle
How I wonder
stdout
1: la la la
2: Twinkle, twinkle
3: How I wonder
3 2
main.py
오류 목록00F8 ↓ · ⇧F8 ↑
입력(stdin)
실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).
$ 준비됐어요
코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.
다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이
한 줄을 앞 빈칸까지 통째로 받고 빈 줄도 한 줄로 세는 읽기 함수는 언어마다 달라요. Python은 input(), Java는 BufferedReader.readLine(), C#은 Console.ReadLine(), C++은 getline(cin, s)가 줄 바꿈을 뗀 한 줄을 줘요. C의 fgets는 줄 바꿈까지 담아 주므로 buf[strcspn(buf, "\n")] = '\0'으로 지워요. JS·TS는 입력을 통째로 읽어 split("\n")으로 나눠요. 크레이콘의 콘솔.줄읽기()는 빈 줄에서 ""를 주고, 빈값은 입력이 끝났을 때만 줘요. 첫 줄의 n도 같은 함수로 한 줄을 읽어 수로 바꾸면(int(input()), atoi(buf), stoi(line), 수로변환()) 수 읽기와 줄 읽기를 섞다가 줄이 밀리는 일이 없어요. 이 문제의 함정은 평소에는 탈이 없던 버릇들이에요. 함정 하나: Python에서 버릇처럼 쓰는 input().strip()은 줄 앞의 빈칸을 지워서 예시의 첫 줄이 1: la la la가 돼요. 함정 둘: Python의 sys.stdin.readline()은 input()과 달리 줄 바꿈을 떼지 않아요. 빈 줄이 "\n"이라서 빈 줄에도 번호가 붙고 예시의 마지막 줄이 5 0이 돼요. 함정 셋: C에서 scanf("%d ", &n)처럼 빈칸을 넣어 남은 줄 바꿈을 지우려 하면, 그 빈칸은 줄 바꿈 하나가 아니라 이어지는 빈칸과 줄 바꿈을 모두 먹어요. 예시의 첫 줄이 1: la la la가 되고, 가사가 빈 줄로 시작하면 그 빈 줄들도 사라져요. 함정 넷: C++의 cin >> n >> ws도 똑같이 이어지는 빈칸과 줄 바꿈을 모두 건너뛰어요. 함정 다섯: JS에서 입력에 .trim()을 하고 나누면 끝의 빈 줄이 없어져요. 예시의 다섯째 줄이 undefined가 되어 4: undefined가 출력돼요. 함정 여섯: C#에서 Split('\n', StringSplitOptions.RemoveEmptyEntries)로 나누면 빈 줄이 모두 버려져서 줄이 모자라고, 예시에서는 IndexOutOfRangeException으로 멈춰요.
Pythonmain.py · 12 줄
n = int(input())numbered = 0empty = 0for _ in range(n): line = input() # 한 줄을 통째로: 앞 빈칸은 그대로, 줄 바꿈만 뗀다 if line == "": empty += 1 print() else: numbered += 1 print(f"{numbered}: {line}")print(numbered, empty)
JavaScriptmain.js · 18 줄
// 입력을 통째로 읽어 줄 바꿈으로만 나눈다. trim()을 하면 빈 줄과 앞 빈칸이 사라진다const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);let numbered = 0;let empty = 0;const out = [];for (let i = 1; i <= n; i++) { const line = lines[i]; if (line === "") { empty++; out.push(""); } else { numbered++; out.push(`${numbered}: ${line}`); }}out.push(`${numbered} ${empty}`);console.log(out.join("\n"));
TypeScriptmain.ts · 20 줄
import { readFileSync } from "node:fs";// 입력을 통째로 읽어 줄 바꿈으로만 나눈다. trim()을 하면 빈 줄과 앞 빈칸이 사라진다const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);let numbered = 0;let empty = 0;const out: string[] = [];for (let i = 1; i <= n; i++) { const line: string = lines[i]; if (line === "") { empty++; out.push(""); } else { numbered++; out.push(`${numbered}: ${line}`); }}out.push(`${numbered} ${empty}`);console.log(out.join("\n"));
JavaMain.java · 24 줄
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int numbered = 0, empty = 0; StringBuilder sb = new StringBuilder(); for (int i = 0; i < n; i++) { String line = br.readLine(); // 빈 줄은 ""로 온다(null은 입력이 끝났을 때만) if (line.isEmpty()) { empty++; } else { numbered++; sb.append(numbered).append(": ").append(line); } sb.append('\n'); } sb.append(numbered).append(' ').append(empty); System.out.println(sb); }}
C#Main.cs · 28 줄
using System;using System.Text;class Program{ static void Main() { int n = int.Parse(Console.ReadLine()!); int numbered = 0, empty = 0; var sb = new StringBuilder(); for (int i = 0; i < n; i++) { string line = Console.ReadLine()!; // 빈 줄은 ""로 온다(null은 입력이 끝났을 때만) if (line == "") { empty++; } else { numbered++; sb.Append(numbered).Append(": ").Append(line); } sb.Append('\n'); } sb.Append(numbered).Append(' ').Append(empty); Console.WriteLine(sb); }}
C++main.cpp · 23 줄
#include <iostream>#include <string>using namespace std;int main() { string line; // 첫 줄의 수도 getline으로 읽는다: cin >> n과 섞지 않으면 줄이 밀리지 않는다 getline(cin, line); int n = stoi(line); int numbered = 0, empty = 0; for (int i = 0; i < n; i++) { getline(cin, line); // 앞 빈칸까지 한 줄을 통째로, 줄 바꿈은 빼고 if (line.empty()) { empty++; cout << '\n'; } else { numbered++; cout << numbered << ": " << line << '\n'; } } cout << numbered << ' ' << empty << '\n'; return 0;}
Cmain.c · 24 줄
#include <stdio.h>#include <stdlib.h>#include <string.h>int main(void) { char buf[128]; /* 첫 줄의 수도 fgets로 읽는다: scanf("%d")와 섞지 않으면 줄이 밀리지 않는다 */ if (!fgets(buf, sizeof buf, stdin)) return 0; int n = atoi(buf); int numbered = 0, empty = 0; for (int i = 0; i < n; i++) { if (!fgets(buf, sizeof buf, stdin)) return 0; buf[strcspn(buf, "\n")] = '\0'; /* fgets가 담아 준 줄 바꿈을 지운다 */ if (buf[0] == '\0') { empty++; printf("\n"); } else { numbered++; printf("%d: %s\n", numbered, buf); } } printf("%d %d\n", numbered, empty); return 0;}
Craykonmain.cray · 18 줄
n = 콘솔.줄읽기().수로변환();numbered = 0;empty = 0;반복 (i = 0; i < n; i++){ line = 콘솔.줄읽기(); // 빈 줄은 ""로 온다(빈값은 입력이 끝났을 때만) 만약 (line == "") { empty += 1; 콘솔.쓰기(""); } 아니면 { numbered += 1; 콘솔.쓰기(numbered + ": " + line); }}콘솔.쓰기(numbered + " " + empty);