お店の在庫ははじめすべて 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
エラー一覧00F8 ↓ · ⇧F8 ↑
入力(stdin)
実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。
$ 準備完了
コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。
ほかの言語では?言語別の解答を見る · 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 には辞書がないので名前と個数の表を先頭から探します。 Craykon は 辞書() に stock.含む(item) で先に聞き、最後に stock.値一覧 を回って数えます。
Pythonmain.py · 20 行
import syslines = 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);