リストに同じ値があるかを聞く方法:Python x in fridge、JS・TS fridge.includes(x)、Java fridge.contains(x)、C# fridge.Contains(x)、C++ std::find(v.begin(), v.end(), x) != v.end()、Craykon fridge.含む(x) です。 C にはこうした関数がないので、strcmp で一つずつ比べるループを自分で書きます。 この問題ではこの問いを二回使います。 冷蔵庫に材料があるかを聞くときに一回、そろっていない項目をもう書いたかを聞くときに一回です。 二つ目を抜かすと butter/oil が二回出ます。 一つ目の落とし穴はリストと文字列の違いです。 材料の行を分けずに文字列のままにして、Python x in line、JS・TS line.includes(x)、C# line.Contains(x)、Craykon line.含む(x) で聞くと部分文字列を探すので、eggplant の中の egg もあると出ます。 必ず分けたリストに聞きましょう。 C で strncmp(a, b, strlen(b)) で比べても、先頭だけ同じ単語が同じと出ます。 Java で文字列を == で比べると内容ではなく同じオブジェクトかを見るので、split で作った文字列は内容が同じでも違うと出ます。 contains・equals を使います。 二つ目の落とし穴は '/' の意味です。 材料のどれか一つがあればよいので、Python any、JS・TS some のように「一つでも」で聞きます。 「すべて」(all・every)で聞くと、oil だけあるときに butter/oil が足りないと出ます。
Pythonmain.py · 13 行
m = int(input())fridge = input().split() # 재료 목록(문자열 그대로가 아니라 낱말의 목록)r = int(input())for _ in range(r): parts = input().split() dish, k, items = parts[0], int(parts[1]), parts[2:] missing = [] for item in items: # '/'로 이은 재료는 하나라도 목록에 있으면 갖춘 것 have = any(x in fridge for x in item.split("/")) if not have and item not in missing: # 같은 항목은 한 번만 missing.append(item) print(" ".join([dish, str(len(missing))] + missing))
JavaScriptmain.js · 15 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const fridge = lines[1].trim().split(/\s+/); // 재료 배열const r = Number(lines[2]);const out = [];for (let i = 0; i < r; i++) { const [dish, , ...items] = lines[3 + i].trim().split(/\s+/); const missing = []; for (const item of items) { // 배열의 includes는 같은 낱말을 찾는다. '/'로 이은 것은 하나라도 있으면 된다 const have = item.split("/").some((x) => fridge.includes(x)); if (!have && !missing.includes(item)) missing.push(item); } out.push([dish, missing.length, ...missing].join(" "));}console.log(out.join("\n"));
TypeScriptmain.ts · 16 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const fridge: string[] = lines[1].trim().split(/\s+/); // 재료 배열const r: number = Number(lines[2]);const out: string[] = [];for (let i = 0; i < r; i++) { const [dish, , ...items]: string[] = lines[3 + i].trim().split(/\s+/); const missing: string[] = []; for (const item of items) { // 배열의 includes는 같은 낱말을 찾는다. '/'로 이은 것은 하나라도 있으면 된다 const have: boolean = item.split("/").some((x) => fridge.includes(x)); if (!have && !missing.includes(item)) missing.push(item); } out.push([dish, String(missing.length), ...missing].join(" "));}console.log(out.join("\n"));
JavaMain.java · 35 行
import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Main { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); in.readLine(); List<String> fridge = Arrays.asList(in.readLine().trim().split(" ")); int r = Integer.parseInt(in.readLine().trim()); StringBuilder out = new StringBuilder(); for (int i = 0; i < r; i++) { String[] parts = in.readLine().trim().split(" "); List<String> missing = new ArrayList<>(); for (int j = 2; j < parts.length; j++) { String item = parts[j]; boolean have = false; // List.contains는 equals로 비교한다(==는 같은 객체인지를 본다) for (String x : item.split("/")) { if (fridge.contains(x)) { have = true; break; } } if (!have && !missing.contains(item)) missing.add(item); } out.append(parts[0]).append(' ').append(missing.size()); for (String x : missing) out.append(' ').append(x); out.append('\n'); } System.out.print(out); }}
C#Main.cs · 34 行
using System;using System.Collections.Generic;using System.Text;class Program{ static void Main() { Console.ReadLine(); var fridge = new List<string>(Console.ReadLine().Trim().Split(' ')); int r = int.Parse(Console.ReadLine()); var sb = new StringBuilder(); for (int i = 0; i < r; i++) { string[] parts = Console.ReadLine().Trim().Split(' '); var missing = new List<string>(); for (int j = 2; j < parts.Length; j++) { string item = parts[j]; // List.Contains는 낱말이 통째로 같은지 본다. string.Contains는 부분 문자열을 찾는다 bool have = false; foreach (string x in item.Split('/')) { if (fridge.Contains(x)) { have = true; break; } } if (!have && !missing.Contains(item)) missing.Add(item); } sb.Append(parts[0]).Append(' ').Append(missing.Count); foreach (string x in missing) sb.Append(' ').Append(x); sb.Append('\n'); } Console.Write(sb); }}
C++main.cpp · 36 行
#include <algorithm>#include <iostream>#include <sstream>#include <string>#include <vector>// 목록에 x와 똑같은 것이 있나(std::find는 ==로 비교하고, std::string의 ==는 내용을 본다)bool contains(const std::vector<std::string> &v, const std::string &x) { return std::find(v.begin(), v.end(), x) != v.end();}int main() { int m, r, k; std::cin >> m; std::vector<std::string> fridge(m); for (auto &x : fridge) std::cin >> x; std::cin >> r; for (int i = 0; i < r; i++) { std::string dish, item; std::cin >> dish >> k; std::vector<std::string> missing; for (int j = 0; j < k; j++) { std::cin >> item; bool have = false; std::stringstream ss(item); std::string x; while (std::getline(ss, x, '/')) { if (contains(fridge, x)) { have = true; break; } } if (!have && !contains(missing, item)) missing.push_back(item); } std::cout << dish << ' ' << missing.size(); for (const auto &x : missing) std::cout << ' ' << x; std::cout << '\n'; }}
Cmain.c · 49 行
#include <stdio.h>#include <string.h>static char fridge[300][13];static int m;/* 목록에 같은 재료가 있나: 내용 비교는 strcmp(==는 주소를 비교한다) */int in_fridge(const char *w) { for (int i = 0; i < m; i++) { if (strcmp(fridge[i], w) == 0) return 1; } return 0;}/* '/'로 이은 재료 가운데 하나라도 있나 */int have_item(const char *item) { char buf[40]; strcpy(buf, item); for (char *x = strtok(buf, "/"); x; x = strtok(NULL, "/")) { if (in_fridge(x)) return 1; } return 0;}int main(void) { int r, k; char dish[13], items[30][40]; scanf("%d", &m); for (int i = 0; i < m; i++) scanf("%12s", fridge[i]); scanf("%d", &r); for (int i = 0; i < r; i++) { scanf("%12s %d", dish, &k); int nmiss = 0; int miss[30]; for (int j = 0; j < k; j++) { scanf("%39s", items[j]); if (have_item(items[j])) continue; int dup = 0; /* 이미 적은 항목인가 */ for (int t = 0; t < nmiss; t++) { if (strcmp(items[miss[t]], items[j]) == 0) { dup = 1; break; } } if (!dup) miss[nmiss++] = j; } printf("%s %d", dish, nmiss); for (int t = 0; t < nmiss; t++) printf(" %s", items[miss[t]]); putchar('\n'); } return 0;}
Craykonmain.cray · 32 行
コンソール.行読み();fridge = コンソール.行読み().分ける(); // 재료 목록r = コンソール.行読み().数に();繰り返す (i = 0; i < r; i++){ parts = コンソール.行読み().分ける(); missing = []; 繰り返す (j = 2; j < parts.個数; j++) { item = parts[j]; // 목록의 있나는 같은 낱말을 찾는다. '/'로 이은 것은 하나라도 있으면 된다 have = 偽; それぞれ (x の中 item.分ける("/")) { もし (fridge.含む(x)) { have = 真; 抜ける; } } もし (!have && !missing.含む(item)) { missing.追加(item); } } line = parts[0] + " " + missing.個数; それぞれ (x の中 missing) { line += " " + x; } コンソール.書く(line);}