def read_record(line): """'이름 개수 번호…' 한 줄을 (이름, 번호 목록)으로.""" parts = line.split() return parts[0], [int(x) for x in parts[2:]]key = read_record(input())n = int(input())prev = None # 첫 시도에는 앞 시도가 없다for _ in range(n): attempt = read_record(input()) # 튜플·목록의 ==는 길이와 자리마다의 값을 비교한다(`is`는 같은 객체인지를 묻는다) if attempt == key: print("解錠") elif attempt == prev: print("くり返し") else: print("不一致") prev = attempt
JavaScriptmain.js · 25 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");// "이름 개수 번호…" 한 줄을 기록으로function readRecord(line) { const parts = line.trim().split(" "); return { name: parts[0], codes: parts.slice(2).map(Number) };}// 배열의 ===는 같은 배열인지만 물으므로, 길이와 자리마다의 값을 직접 비교한다function sameRecord(a, b) { return a.name === b.name && a.codes.length === b.codes.length && a.codes.every((x, i) => x === b.codes[i]);}const key = readRecord(lines[0]);const n = Number(lines[1]);const out = [];let prev = null; // 첫 시도에는 앞 시도가 없다for (let i = 2; i < 2 + n; i++) { const attempt = readRecord(lines[i]); if (sameRecord(attempt, key)) out.push("解錠"); else if (prev !== null && sameRecord(attempt, prev)) out.push("くり返し"); else out.push("不一致"); prev = attempt;}console.log(out.join("\n"));
TypeScriptmain.ts · 31 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");interface LockRecord { name: string; codes: number[];}// "이름 개수 번호…" 한 줄을 기록으로function readRecord(line: string): LockRecord { const parts = line.trim().split(" "); return { name: parts[0], codes: parts.slice(2).map(Number) };}// 배열의 ===는 같은 배열인지만 물으므로, 길이와 자리마다의 값을 직접 비교한다function sameRecord(a: LockRecord, b: LockRecord): boolean { return a.name === b.name && a.codes.length === b.codes.length && a.codes.every((x, i) => x === b.codes[i]);}const key = readRecord(lines[0]);const n = Number(lines[1]);const out: string[] = [];let prev: LockRecord | null = null; // 첫 시도에는 앞 시도가 없다for (let i = 2; i < 2 + n; i++) { const attempt = readRecord(lines[i]); if (sameRecord(attempt, key)) out.push("解錠"); else if (prev !== null && sameRecord(attempt, prev)) out.push("くり返し"); else out.push("不一致"); prev = attempt;}console.log(out.join("\n"));
JavaMain.java · 43 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Arrays;public class Main { static String name(String[] parts) { return parts[0]; } static int[] codes(String[] parts) { int[] codes = new int[parts.length - 2]; for (int i = 0; i < codes.length; i++) codes[i] = Integer.parseInt(parts[i + 2]); return codes; } // 문자열은 equals, 배열은 Arrays.equals로 내용을 비교한다(==는 같은 객체인지만 묻는다) static boolean same(String nameA, int[] codesA, String nameB, int[] codesB) { return nameA.equals(nameB) && Arrays.equals(codesA, codesB); } public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String[] first = in.readLine().trim().split(" "); String keyName = name(first); int[] keyCodes = codes(first); int n = Integer.parseInt(in.readLine().trim()); String prevName = null; // 첫 시도에는 앞 시도가 없다 int[] prevCodes = null; StringBuilder out = new StringBuilder(); for (int i = 0; i < n; i++) { String[] parts = in.readLine().trim().split(" "); String curName = name(parts); int[] curCodes = codes(parts); if (same(curName, curCodes, keyName, keyCodes)) out.append("解錠\n"); else if (prevName != null && same(curName, curCodes, prevName, prevCodes)) out.append("くり返し\n"); else out.append("不一致\n"); prevName = curName; prevCodes = curCodes; } System.out.print(out); }}
C#Main.cs · 35 行
using System;using System.Linq;using System.Text;class Program{ static int[] Codes(string[] parts) => parts.Skip(2).Select(int.Parse).ToArray(); // string의 ==는 내용을 비교하지만, 배열의 ==는 같은 배열인지만 물어서 SequenceEqual을 쓴다 static bool Same(string nameA, int[] codesA, string nameB, int[] codesB) => nameA == nameB && codesA.SequenceEqual(codesB); static void Main() { string[] first = Console.ReadLine().Trim().Split(' '); string keyName = first[0]; int[] keyCodes = Codes(first); int n = int.Parse(Console.ReadLine()); string prevName = null; // 첫 시도에는 앞 시도가 없다 int[] prevCodes = null; var sb = new StringBuilder(); for (int i = 0; i < n; i++) { string[] parts = Console.ReadLine().Trim().Split(' '); string curName = parts[0]; int[] curCodes = Codes(parts); if (Same(curName, curCodes, keyName, keyCodes)) sb.Append("解錠\n"); else if (prevName != null && Same(curName, curCodes, prevName, prevCodes)) sb.Append("くり返し\n"); else sb.Append("不一致\n"); prevName = curName; prevCodes = curCodes; } Console.Write(sb); }}
C++main.cpp · 35 行
#include <iostream>#include <string>#include <vector>struct Record { std::string name; std::vector<int> codes; // std::string과 std::vector의 ==는 내용을 비교하므로, 멤버끼리 비교하게만 하면 된다 bool operator==(const Record&) const = default;};Record read_record() { Record r; int count; std::cin >> r.name >> count; r.codes.resize(count); for (int& c : r.codes) std::cin >> c; return r;}int main() { Record key = read_record(); int n; std::cin >> n; Record prev; bool has_prev = false; // 첫 시도에는 앞 시도가 없다 for (int i = 0; i < n; i++) { Record cur = read_record(); if (cur == key) std::cout << "解錠\n"; else if (has_prev && cur == prev) std::cout << "くり返し\n"; else std::cout << "不一致\n"; prev = cur; has_prev = true; }}
Cmain.c · 41 行
#include <stdbool.h>#include <stdio.h>#include <string.h>typedef struct { char name[11]; int count; int codes[10];} Record;/* 번호는 %d로 읽어 수로 둔다: 앞에 0이 붙은 007도 7이 된다 */static void read_record(Record *r) { scanf("%10s %d", r->name, &r->count); for (int i = 0; i < r->count; i++) scanf("%d", &r->codes[i]);}/* 배열 이름끼리의 ==는 주소를 비교한다. 문자열은 strcmp로, 번호는 자리마다 비교한다 */static bool same_record(const Record *a, const Record *b) { if (strcmp(a->name, b->name) != 0) return false; if (a->count != b->count) return false; for (int i = 0; i < a->count; i++) if (a->codes[i] != b->codes[i]) return false; return true;}int main(void) { Record key, prev, cur; read_record(&key); int n; scanf("%d", &n); bool has_prev = false; /* 첫 시도에는 앞 시도가 없다 */ for (int i = 0; i < n; i++) { read_record(&cur); if (same_record(&cur, &key)) puts("解錠"); else if (has_prev && same_record(&cur, &prev)) puts("くり返し"); else puts("不一致"); prev = cur; /* 구조체 대입은 내용을 통째로 복사한다 */ has_prev = true; } return 0;}
Craykonmain.cray · 50 行
// "이름 개수 번호…" 한 줄을 [이름, 번호, 번호, …] 목록으로 바꾼다.// 번호는 수로 바꿔 둔다: 문자열 그대로면 "007"과 "7"이 다르다기록읽기(줄){ 낱말 = 줄.空白除去().分ける(" "); 기록 = [낱말[0]]; 繰り返す (i = 2; i < 낱말.個数; i++) { 기록.追加(낱말[i].数に()); } 返す 기록;}// 목록끼리의 ==는 같은 목록인지만 물으므로, 길이와 자리마다의 값을 직접 비교한다같은기록인가(a, b){ もし (a.個数 != b.個数) { 返す 偽; } 繰り返す (i = 0; i < a.個数; i++) { もし (a[i] != b[i]) { 返す 偽; } } 返す 真;}등록 = 기록읽기(コンソール.行読み());n = コンソール.行読み().数に();앞시도 = なし; // 첫 시도에는 앞 시도가 없다繰り返す (k = 0; k < n; k++){ 시도 = 기록읽기(コンソール.行読み()); もし (같은기록인가(시도, 등록)) { コンソール.書く("解錠"); } でなければ もし (앞시도 != なし && 같은기록인가(시도, 앞시도)) { コンソール.書く("くり返し"); } でなければ { コンソール.書く("不一致"); } 앞시도 = 시도;}