{ }codelper
사전 고치기열쇠 있나P0064

가게 재고 관리

가게의 재고는 처음에 모두 0개다.
첫 줄에 명령 수 m이 주어지고, 다음 m줄에 명령이 하나씩 주어진다. - "add 물건 k": 그 물건의 재고에 k개를 더한다. - "sell 물건 k": 재고가 k개 이상이면 k개를 뺀다.
모자라면(한 번도 들어온 적 없는 물건 포함) 재고를 바꾸지 않고 "실패"을 출력한다. - "show 물건": 그 물건의 지금 재고를 출력한다(한 번도 들어온 적 없으면 0). 명령을 모두 처리한 뒤 마지막 줄에 재고가 1개 이상 남은 물건의 가짓수를 출력하라.

입력
1 ≤ m ≤ 2000, 1 ≤ k ≤ 1000.
물건 이름은 영어 소문자 1 ~ 12글자
출력
"실패"과 show의 결과를 명령 차례대로 한 줄씩, 그리고 마지막 줄에 재고가 남은 물건의 가짓수
예시 1 · stdin
7
add pen 3
add cup 2
sell pen 2
sell cup 5
show pen
show ink
sell cup 2
stdout
실패
1
0
1
main.py
입력(stdin)

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

$ 준비됐어요

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

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

함정은 처음 보는 물건이에요.
Python stock[item] += k는 KeyError, C# stock[item] += k는 KeyNotFoundException, Java int have = stock.get(item)은 null을 int로 풀다가 NullPointerException이 나요.
기본값을 주며 읽으세요: Python stock.get(item, 0), Java getOrDefault·merge(item, k, Integer::sum), C# GetValueOrDefault, JS Map의 get(item) ?? 0.
JS 빈 객체 {}에 stock[item] || 0을 쓰면 "constructor"에서 Object.prototype의 함수를 집어 엉뚱한 문자열이 돼요.
C++ stock[item] += k는 없으면 0을 넣어 주므로 그대로 돼요(대신 읽기만 할 때도 열쇠가 생겨요).
마지막 줄의 함정은 다 팔려 0개가 된 물건이 사전에 남아 있다는 것: len(stock)이 아니라 값이 1 이상인 것만 세요.
C에는 사전이 없어 이름·개수 표를 처음부터 찾아요.
크레이콘은 사전()에 stock.있나(item)으로 먼저 묻고, 끝에서 stock.값목록을 돌며 세요.

Pythonmain.py · 20 줄
import sys lines = sys.stdin.read().split("\n")m = int(lines[0])stock = {}for line in lines[1:m + 1]:    parts = line.split()    cmd, item = parts[0], parts[1]    have = stock.get(item, 0)    if cmd == "add":        stock[item] = have + int(parts[2])    elif cmd == "sell":        k = int(parts[2])        if have >= k:            stock[item] = have - k        else:            print("실패")    else:        print(have)print(sum(1 for v in stock.values() if v > 0))
JavaScriptmain.js · 15 줄
const lines = require("fs").readFileSync(0, "utf8").split("\n");const m = Number(lines[0]);const stock = new Map();const out = [];for (let i = 1; i <= m; i++) {  const [cmd, item, k] = lines[i].trim().split(" ");  const have = stock.get(item) ?? 0;  if (cmd === "add") stock.set(item, have + Number(k));  else if (cmd === "sell") {    if (have >= Number(k)) stock.set(item, have - Number(k));    else out.push("실패");  } else out.push(have);}out.push([...stock.values()].filter((v) => v > 0).length);console.log(out.join("\n"));
TypeScriptmain.ts · 16 줄
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const m: number = Number(lines[0]);const stock = new Map<string, number>();const out: (string | number)[] = [];for (let i = 1; i <= m; i++) {  const [cmd, item, k] = lines[i].trim().split(" ");  const have: number = stock.get(item) ?? 0;  if (cmd === "add") stock.set(item, have + Number(k));  else if (cmd === "sell") {    if (have >= Number(k)) stock.set(item, have - Number(k));    else out.push("실패");  } else out.push(have);}out.push([...stock.values()].filter((v) => v > 0).length);console.log(out.join("\n"));
JavaMain.java · 30 줄
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map; public class Main {    public static void main(String[] args) throws IOException {        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));        int m = Integer.parseInt(in.readLine().trim());        Map<String, Integer> stock = new HashMap<>();        StringBuilder out = new StringBuilder();        for (int i = 0; i < m; i++) {            String[] p = in.readLine().trim().split(" ");            int have = stock.getOrDefault(p[1], 0);            if (p[0].equals("add")) {                stock.merge(p[1], Integer.parseInt(p[2]), Integer::sum);            } else if (p[0].equals("sell")) {                int k = Integer.parseInt(p[2]);                if (have >= k) stock.put(p[1], have - k);                else out.append("실패").append('\n');            } else {                out.append(have).append('\n');            }        }        long inStock = stock.values().stream().filter(v -> v > 0).count();        out.append(inStock).append('\n');        System.out.print(out);    }}
C#Main.cs · 32 줄
using System;using System.Collections.Generic;using System.Linq; class Program{    static void Main()    {        int m = int.Parse(Console.ReadLine());        var stock = new Dictionary<string, int>();        for (int i = 0; i < m; i++)        {            string[] p = Console.ReadLine().Trim().Split(' ');            int have = stock.GetValueOrDefault(p[1]);            if (p[0] == "add")            {                stock[p[1]] = have + int.Parse(p[2]);            }            else if (p[0] == "sell")            {                int k = int.Parse(p[2]);                if (have >= k) stock[p[1]] = have - k;                else Console.WriteLine("실패");            }            else            {                Console.WriteLine(have);            }        }        Console.WriteLine(stock.Values.Count(v => v > 0));    }}
C++main.cpp · 31 줄
#include <iostream>#include <string>#include <unordered_map> int main() {    int m;    std::cin >> m;    std::unordered_map<std::string, int> stock;    for (int i = 0; i < m; i++) {        std::string cmd, item;        std::cin >> cmd >> item;        auto it = stock.find(item);        int have = it != stock.end() ? it->second : 0;        if (cmd == "add") {            int k;            std::cin >> k;            stock[item] = have + k;        } else if (cmd == "sell") {            int k;            std::cin >> k;            if (have >= k) stock[item] = have - k;            else std::cout << "실패\n";        } else {            std::cout << have << '\n';        }    }    int inStock = 0;    for (const auto& [item, count] : stock)        if (count > 0) inStock++;    std::cout << inStock << '\n';}
Cmain.c · 40 줄
#include <stdio.h>#include <string.h> /* C에는 사전이 없다: 물건 이름과 재고를 작은 표에 두고 처음부터 찾는다 */static char names[2000][13];static int counts[2000];static int size = 0; static int find_or_add(const char *item) {    for (int i = 0; i < size; i++)        if (strcmp(names[i], item) == 0) return i;    strcpy(names[size], item);    counts[size] = 0;    return size++;} int main(void) {    int m, k;    char cmd[5], item[13];    scanf("%d", &m);    for (int i = 0; i < m; i++) {        scanf("%4s %12s", cmd, item);        int at = find_or_add(item);        if (strcmp(cmd, "add") == 0) {            scanf("%d", &k);            counts[at] += k;        } else if (strcmp(cmd, "sell") == 0) {            scanf("%d", &k);            if (counts[at] >= k) counts[at] -= k;            else puts("실패");        } else {            printf("%d\n", counts[at]);        }    }    int in_stock = 0;    for (int i = 0; i < size; i++)        if (counts[i] > 0) in_stock++;    printf("%d\n", in_stock);    return 0;}
Craykonmain.cray · 41 줄
m = 콘솔.줄읽기().수로변환();stock = 사전();반복 (i = 0; i < m; i++){    p = 콘솔.줄읽기().공백제거().나누기();    item = p[1];    have = 0;    만약 (stock.있나(item))    {        have = stock[item];    }    만약 (p[0] == "add")    {        stock[item] = have + p[2].수로변환();    }    아니면 만약 (p[0] == "sell")    {        k = p[2].수로변환();        만약 (have >= k)        {            stock[item] = have - k;        }        아니면        {            콘솔.쓰기("실패");        }    }    아니면    {        콘솔.쓰기(have);    }}inStock = 0;각각 (v 에서 stock.값목록){    만약 (v > 0)    {        inStock++;    }}콘솔.쓰기(inStock);