{ }codelper
한 줄 읽기P0311

방명록 한 줄 옮겨 적기

전시회 방명록을 컴퓨터로 옮겨 적는다. 첫 줄에 방문 번호 n이 주어진다. 둘째 줄에 방문자의 이름이, 셋째 줄에 방문자가 남긴 말이 주어진다. 이름과 남긴 말에는 빈칸이 들어 있을 수 있다. 남긴 말에는 빈칸이 둘 이상 이어진 곳도 있을 수 있다. "#n [이름] 남긴 말" 꼴로 한 줄을 출력하라. 곧 #, n, 빈칸 하나, [, 이름, ], 빈칸 하나, 남긴 말을 차례로 이어 쓴다. 이름과 남긴 말은 빈칸의 수까지 입력에 적힌 그대로 쓴다.

입력
1 ≤ n ≤ 9,999(쉼표 없이 숫자만 주어지고, 앞에 0이 붙지 않는다).
이름은 1~20글자이고 영어 글자와 빈칸으로 되어 있으며, 빈칸이 둘 이어지지 않는다.
남긴 말은 1~60글자이고 영어 글자·숫자·빈칸·문장 부호(.
, !
?)로 되어 있다.
이름과 남긴 말은 빈칸으로 시작하거나 끝나지 않는다
출력
"#n [이름] 남긴 말" 한 줄
예시 1 · stdin
27
Kim Min Su
So  quiet, I loved it!
stdout
#27 [Kim Min Su] So  quiet, I loved it!
예시 2 · stdin
3
Joy
Wow
stdout
#3 [Joy] Wow
main.py
입력(stdin)

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

$ 준비됐어요

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

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

빈칸이 든 줄을 통째로 읽는 방법이 언어마다 달라요.
Python input(), Java BufferedReader.readLine()·Scanner.nextLine(), C# Console.ReadLine(), C++ std::getline(std::cin, s), 크레이콘 콘솔.줄읽기()는 한 줄을 읽고 줄 끝의 줄 바꿈은 떼고 줘요.
JS·TS는 입력을 한꺼번에 읽어 split("\n")으로 줄을 나눠요.
C fgets만 줄 바꿈까지 담아 주므로 직접 지워야 해요(s[strcspn(s, "\n")] = '\0').
지우지 않으면 예시 1에서 ]가 다음 줄로 넘어가요.
첫째 함정은 낱말 단위 읽기예요.
C++ cin >> name과 C scanf("%s")는 빈칸에서 멈춰서, 예시 1의 이름이 Kim이 되고 남긴 말 자리에 Min이 들어가요.
둘째 함정은 수를 읽은 다음에 줄을 읽는 것이에요.
C++ cin >> n, Java Scanner.nextInt(), C scanf("%d")는 수만 읽고 첫 줄 끝의 줄 바꿈을 남겨 둬요.
그래서 바로 다음의 getline·nextLine()·fgets가 그 남은 빈 줄을 읽어, 예시 1이 #27 [] Kim Min Su가 돼요.
수도 줄로 읽어서 바꾸거나(Java Integer.parseInt(br.readLine()), C fgets 뒤 atoi), C++은 cin.ignore로 남은 줄 바꿈을 버려요.
셋째 함정은 나눴다가 다시 잇는 것이에요.
Python " ".join(input().split())은 So와 quiet 사이의 빈칸 두 개를 하나로 줄여요.

Pythonmain.py · 4 줄
n = int(input())name = input()   # input()은 한 줄을 통째로 읽고 줄 바꿈은 떼어 준다msg = input()print(f"#{n} [{name}] {msg}")
JavaScriptmain.js · 6 줄
// 입력을 한꺼번에 읽어 줄 바꿈으로 나누면 줄마다 빈칸이 그대로 남는다const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const name = lines[1];const msg = lines[2];console.log(`#${n} [${name}] ${msg}`);
TypeScriptmain.ts · 7 줄
import { readFileSync } from "node:fs";// 입력을 한꺼번에 읽어 줄 바꿈으로 나누면 줄마다 빈칸이 그대로 남는다const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);const name: string = lines[1];const msg: string = lines[2];console.log(`#${n} [${name}] ${msg}`);
JavaMain.java · 13 줄
import java.io.BufferedReader;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        // 수도 줄로 읽어서 바꾸면 줄 바꿈이 남지 않는다        int n = Integer.parseInt(br.readLine().trim());        String name = br.readLine();        String msg = br.readLine();        System.out.println("#" + n + " [" + name + "] " + msg);    }}
C#Main.cs · 12 줄
using System; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        string name = Console.ReadLine();   // 한 줄을 통째로, 줄 바꿈은 빼고        string msg = Console.ReadLine();        Console.WriteLine($"#{n} [{name}] {msg}");    }}
C++main.cpp · 14 줄
#include <iostream>#include <limits>#include <string> int main() {    int n;    std::cin >> n;    // cin >> n은 수만 읽는다. 첫 줄에 남은 줄 바꿈을 버려야 다음 getline이 이름을 읽는다    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');    std::string name, msg;    std::getline(std::cin, name);    std::getline(std::cin, msg);    std::cout << "#" << n << " [" << name << "] " << msg << "\n";}
Cmain.c · 15 줄
#include <stdio.h>#include <stdlib.h>#include <string.h> int main(void) {    char num[16], name[32], msg[80];    if (!fgets(num, sizeof num, stdin)) return 0;    if (!fgets(name, sizeof name, stdin)) return 0;    if (!fgets(msg, sizeof msg, stdin)) return 0;    /* fgets는 줄 바꿈까지 담아 주므로 직접 지운다 */    name[strcspn(name, "\n")] = '\0';    msg[strcspn(msg, "\n")] = '\0';    printf("#%d [%s] %s\n", atoi(num), name, msg);    return 0;}
Craykonmain.cray · 5 줄
n = 콘솔.줄읽기().수로변환();// 줄읽기는 한 줄을 통째로 준다(줄 바꿈은 빼고)name = 콘솔.줄읽기();msg = 콘솔.줄읽기();콘솔.쓰기("#" + n + " [" + name + "] " + msg);