전시회 방명록을 컴퓨터로 옮겨 적는다.
첫 줄에 방문 번호 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
오류 목록00F8 ↓ · ⇧F8 ↑
입력(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);