{ }codelper
빈 값(null)참·거짓n줄 읽기P0047

빈 칸은 앞의 값으로

온도계가 n번 잰 값을 차례로 기록했는데, 재지 못한 때는 빈 줄로 남았다.
첫 줄에 n이 주어지고, 다음 n줄은 각각 정수 하나이거나 빈 줄(빈칸도 없는 줄)이다.
줄마다 결과를 한 줄씩 출력하라: 정수가 있으면 그 수를, 빈 줄이면 그 앞에서 가장 최근에 기록된 수를 쓴다.
앞에 기록된 수가 하나도 없으면 "없음"을 쓴다.
0과 음수도 기록된 수다.

입력
1 ≤ n ≤ 1,000, -1,000 ≤ 기록된 수 ≤ 1,000
출력
n줄, 수 또는 "없음"
예시 1 · stdin
5

3

0

stdout
없음
3
3
0
0
예시 2 · stdin
3
-1


stdout
-1
-1
-1
main.py
입력(stdin)

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

$ 준비됐어요

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

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

'아직 값이 없음'을 담는 방법이 언어마다 달라요.
Python None(last is None으로 확인), JS null, TS number | null(엄격 모드에서는 확인하기 전에 수로 못 써요), Java는 int에 null을 못 담아서 Integer(null인 채로 계산하면 NullPointerException), C#은 int?(HasValue, ??), C++17은 std::optional<int>, 크레이콘은 빈값.
C의 int에는 '없음'이 아예 없어서 bool has = false(<stdbool.h>) 같은 참·거짓 하나를 따로 둬요.
함정 셋: ① '없음'을 0이나 -1 같은 특별한 수로 대신하면 진짜 0·-1과 구별이 안 돼요(예시 2).
② if (last)·if last:처럼 참·거짓으로 물으면 JS와 Python은 0도 거짓으로 봐서 0을 읽은 뒤에 "none"이 나와요 — last === null, last is None처럼 null인지 따로 물어요.
③ 빈 줄은 null이 아니라 빈 문자열 ""이에요(크레이콘 콘솔.줄읽기()도 빈 줄이면 "", 입력이 끝나야 빈값).
이것을 바로 수로 바꾸면 Python int("")는 ValueError, Java Integer.parseInt("")는 NumberFormatException으로 멈추고, JS Number("")와 C atoi("")는 조용히 0이 돼요.
그래서 수로 바꾸기 전에 빈 줄인지 먼저 글자로 확인해요.

Pythonmain.py · 7 줄
n = int(input())last = None                      # 아직 읽은 수가 없음for _ in range(n):    line = input()    if line != "":        last = int(line)    print("없음" if last is None else last)
JavaScriptmain.js · 10 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);let last = null; // 아직 읽은 수가 없음const out = [];for (let i = 1; i <= n; i++) {  // Number("")는 0이라서 빈 줄인지 먼저 글자로 확인한다  if (lines[i] !== "") last = Number(lines[i]);  out.push(last === null ? "없음" : last);}console.log(out.join("\n"));
TypeScriptmain.ts · 11 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);let last: number | null = null; // 아직 읽은 수가 없음const out: string[] = [];for (let i = 1; i <= n; i++) {  // Number("")는 0이라서 빈 줄인지 먼저 글자로 확인한다  if (lines[i] !== "") last = Number(lines[i]);  out.push(last === null ? "없음" : String(last));}console.log(out.join("\n"));
JavaMain.java · 18 줄
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public class Main {    public static void main(String[] args) throws IOException {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(in.readLine().trim());        Integer last = null; // int는 null을 담을 수 없어 Integer를 쓴다        StringBuilder out = new StringBuilder();        for (int i = 0; i < n; i++) {            String line = in.readLine();            if (!line.isEmpty()) last = Integer.parseInt(line);            out.append(last == null ? "없음" : last.toString()).append('\n');        }        System.out.print(out);    }}
C#Main.cs · 19 줄
using System;using System.Text; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        int? last = null; // int? 는 null도 담는 int        var out_ = new StringBuilder();        for (int i = 0; i < n; i++)        {            string line = Console.ReadLine();            if (line != "") last = int.Parse(line);            out_.Append(last.HasValue ? last.Value.ToString() : "없음").Append('\n');        }        Console.Write(out_);    }}
C++main.cpp · 16 줄
#include <iostream>#include <optional>#include <string> int main() {    std::string line;    std::getline(std::cin, line);    int n = std::stoi(line);    std::optional<int> last;  // 처음에는 값이 없음    for (int i = 0; i < n; i++) {        std::getline(std::cin, line);        if (!line.empty()) last = std::stoi(line);        if (last) std::cout << *last << '\n';        else std::cout << "없음\n";    }}
Cmain.c · 22 줄
#include <stdbool.h>#include <stdio.h>#include <stdlib.h> int main(void) {    char line[32];    fgets(line, sizeof line, stdin);    int n = atoi(line);    /* C의 int에는 '값 없음'이 없어서 따로 참·거짓 하나를 둔다 */    bool has = false;    int last = 0;    for (int i = 0; i < n; i++) {        fgets(line, sizeof line, stdin);        if (line[0] != '\n' && line[0] != '\0') {            last = atoi(line);            has = true;        }        if (has) printf("%d\n", last);        else puts("없음");    }    return 0;}
Craykonmain.cray · 18 줄
n = 콘솔.줄읽기().수로변환();마지막 = 빈값;반복 (i = 0; i < n; i++){    줄 = 콘솔.줄읽기();    만약 (줄 != "")    {        마지막 = 줄.수로변환();    }    만약 (마지막 == 빈값)    {        콘솔.쓰기("없음");    }    아니면    {        콘솔.쓰기(마지막);    }}