읽기 전에 알아두면 좋아요
아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.
- 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신변수에 값을 담고 조건에 따라 합·개수·최솟값을 갱신하는 기초부터 확인합니다. 무승부와 승패 조건이 겹치지 않는 분기와 반복을 확인합니다.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 준비와 기초 구현 · 문제
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.
가위바위보 문제는 두 사람의 선택을 입력받아 매 판의 어떤 결과를 구하나요?
두 사람의 가위바위보 선택을 입력받아 매 판의 승부 결과를 구하는 문제입니다. 배열·조건문·승리 규칙의 기본을 준비하고, 아래 입력·반환 계약을 확인해 직접 풀어보세요.
적용 조건·범위: 이번 대조는 원자료의 문제 조건과 예제 확인입니다. 이 글의 전체 코드를 새로 실행하거나 공식 채점에 제출한 결과를 뜻하지 않습니다. 아래 예제·자가 확인 항목은 직접 실행해 기대 출력과 비교하는 기준입니다.
공식 문서 참고: 관련 개념: MDN 논리합으로 승리 조건 묶기
문제
A와 B가 총 N번 가위바위보를 합니다. 선택은 가위 1, 바위 2, 보 3으로 주어지며, 각 회차에서 A가 이기면 A, B가 이기면 B, 비기면 D를 한 줄에 하나씩 출력해야 합니다. N은 1 이상 100 이하의 자연수이고, 두 사람의 선택은 각각 N개씩 입력됩니다.
예제에서는 A의 선택이 2 3 3 1 3, B의 선택이 1 1 2 2 3입니다. 같은 위치를 차례대로 비교하면 결과는 A, B, A, B, D가 됩니다.
| 회차 | A | B | 결과 |
|---|---|---|---|
| 1 | 2 | 1 | A |
| 2 | 3 | 1 | B |
| 3 | 3 | 2 | A |
| 4 | 1 | 2 | B |
| 5 | 3 | 3 | D |
직접 풀어보기
먼저 선택한 언어의 입력·반환 계약에 맞춰 작성해 보세요. 힌트 받기와 정답과 비교하기는 코드를 실행하지 않는 AI 분석입니다. 해답·해설은 아래에서 필요할 때 펼칠 수 있습니다.
AI 힌트
코드를 실행한 채점 결과가 아닌 AI의 코드 분석입니다.
해답·해설 보기
function solve(input) {
const t = input.trim().split(/\s+/).map(Number);
const n = t[0], a = t.slice(1, n + 1);
return a.map((x, i) => {
const y = t[n + 1 + i];
return x === y ? 'D' :((x === 1 && y === 3) ||(x === 2 && y === 1) ||(x === 3 && y === 2)) ? 'A' : 'B';
}).join('\n');
}
입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.
def solve(input):
t = list(map(int, input.split()))
n, a = t[0], t[1:1+t[0]]
out = []
for x,y in zip(a,t[n+1:n*2+1]):
out.append('D' if x == y else 'A' if (x,y) in ((1,3),(2,1),(3,2)) else 'B')
return '\n'.join(out)
입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.
import java.util.*;
class Solution {
public String solve(String input) {
Scanner sc = new Scanner(input);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) a[i] = sc.nextInt();
StringJoiner out = new StringJoiner("\n");
for (int x : a) {
int y = sc.nextInt();
out.add(x == y ? "D" :((x == 1 && y == 3) ||(x == 2 && y == 1) ||(x == 3 && y == 2)) ? "A" : "B");
}
return out.toString();
}
}
입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. new Solution().solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
std::string solve(const std::string & input) {
std::istringstream in(input);
int n;
in >> n;
std::vector < int > a(n);
for (int & x : a) in >> x;
std::ostringstream out;
for (int i = 0; i < n; i++) {
int x = a[i], y;
in >> y;
if (i) out << "\n";
out <<(x == y ? "D" :((x == 1 && y == 3) ||(x == 2 && y == 1) ||(x == 3 && y == 2)) ? "A" : "B");
}
return out.str();
}
입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.
using System;
using System.Collections.Generic;
public class Solution {
public string Solve(string input) {
string[] t = input.Split((char[]) null, StringSplitOptions.RemoveEmptyEntries);
int n = int.Parse(t[0]);
int[] a = new int[n];
for (int i = 0; i < n; i++) a[i] = int.Parse(t[i + 1]);
string[] outp = new string[n];
for (int i = 0; i < n; i++) {
int x = a[i], y = int.Parse(t[n + 1 + i]);
outp[i] = x == y ? "D" :((x == 1 && y == 3) ||(x == 2 && y == 1) ||(x == 3 && y == 2)) ? "A" : "B";
}
return string.Join("\n", outp);
}
}
입력 예시 전체를 문자열로 전달하고 출력 문자열을 반환합니다. new Solution().Solve(input)를 호출합니다. 표준 입력·출력 코드는 추가하지 않습니다. 입력 공백과 LF/CRLF 줄바꿈을 처리합니다.
원자료와 확인 범위
2026-10-12에 제공된 학습 자료 섹션 2. 1, 2차원 탐색.pdf의 3쪽 ‘가위 바위 보’와 문제 조건·예제를 대조했습니다. 같은 ZIP의 해당 문제 TXT는 풀이 코드 자료입니다. 이 자료의 최초 출제 원문·저자·공개 배포 주소까지 확인한 것은 아닙니다.
이번 대조는 원자료의 문제 조건과 예제 확인입니다. 이 글의 전체 코드를 새로 실행하거나 공식 채점에 제출한 결과를 뜻하지 않습니다. 아래 예제·자가 확인 항목은 직접 실행해 기대 출력과 비교하는 기준입니다.
풀이와 정답 보기 (클릭)
각 회차는 다른 회차의 결과에 영향을 주지 않으므로 처음부터 끝까지 한 번 순회하면 됩니다. 먼저 같은 값인지 확인해 비긴 경우를 처리하고, 그다음 A가 이기는 세 조합만 명시합니다. 나머지 서로 다른 조합은 모두 B의 승리입니다.
알고리즘 설계

A가 이기는 경우는 가위와 보, 바위와 가위, 보와 바위의 세 쌍입니다. 숫자로 바꾸면 (1, 3), (2, 1), (3, 2)입니다. 이 세 조건을 논리합으로 묶으면 승리 규칙을 빠뜨리지 않고 표현할 수 있습니다.
판정 순서도 중요합니다. 두 값이 같으면 바로 D를 저장합니다. 값이 다를 때만 A의 승리 조합을 확인하고, 여기에 해당하지 않으면 B를 저장합니다. 결과를 배열에 모았다가 줄바꿈 문자로 연결하면 문제의 출력 형식과 정확히 맞습니다.
두 배열의 같은 인덱스와 if/else 조건을 읽고, Node.js가 설치된 별도 연습 폴더에서 실행합니다. 전체 코드는 solution.cjs로 저장하고 input.txt에는 게임 수 5, A의 선택 2 3 3 1 3, B의 선택 1 1 2 2 3을 이 순서의 세 줄로 적습니다. PowerShell 7은 Get-Content -Raw -Encoding UTF8 ./input.txt | node ./solution.cjs, Bash·명령 프롬프트는 node solution.cjs < input.txt를 사용합니다. 기대값 A, B, A, B, D가 한 줄에 하나씩 나오는지 비교하세요. 이 안내의 실행 결과는 미확인입니다.

const fs = require("fs");
const inputText = fs.readFileSync(0, "utf8");
const input = inputText
.trim()
.replaceAll(String.fromCharCode(13), " ")
.replaceAll(String.fromCharCode(10), " ")
.split(" ")
.filter(Boolean)
.map(Number);
const count = input[0];
const playerA = input.slice(1, count + 1);
const playerB = input.slice(count + 1, count * 2 + 1);
const winners = [];
for (let index = 0; index < count; index += 1) {
const choiceA = playerA[index];
const choiceB = playerB[index];
if (choiceA === choiceB) {
winners.push("D");
} else if (
(choiceA === 1 && choiceB === 3) ||
(choiceA === 2 && choiceB === 1) ||
(choiceA === 3 && choiceB === 2)
) {
winners.push("A");
} else {
winners.push("B");
}
}
console.log(winners.join(String.fromCharCode(10)));
입력 문자열의 CR과 LF를 공백으로 바꾼 뒤 빈 값을 제거하므로 LF와 CRLF 입력을 모두 처리합니다. 첫 값은 게임 횟수이고, 이어지는 N개와 그다음 N개를 각각 A와 B의 배열로 나눕니다. 마지막에는 줄바꿈 문자 코드로 결과를 연결해 한 줄에 하나씩 출력합니다.
복잡도와 검증
N개의 회차를 한 번만 비교하므로 시간 복잡도는 O(N)입니다. 입력 배열과 결과 배열을 저장하는 공간은 O(N)이며, 각 회차를 판정하는 추가 공간은 O(1)입니다.
| 검증 항목 | 입력 특징 | 기대 결과 |
|---|---|---|
| 제공 예제 | 승·패·무가 모두 포함됨 | A, B, A, B, D |
| 최소 횟수 | N=1, 같은 선택 | D |
| A 전승 | 세 가지 승리 조합 | A를 세 줄 출력 |
| B 전승 | A 승리 조합의 반대 | B를 세 줄 출력 |
배열을 한 번 순회하며 조건으로 결과를 결정하는 다른 기초 문제는 보이는 학생 JavaScript 풀이에서도 확인할 수 있습니다.
이 문제를 푼 뒤 확인하기
비긴 라운드와 세 가지 승리 조합을 표로 적고 각 라운드의 출력 줄을 확인해 보세요.
본문의 예제와 이 반례를 직접 실행해 예상 출력과 비교하고, 결과가 다르면 입력 조건과 반복 범위를 다시 확인하세요.
글 소개·학습 준비·전체 목차
두 사람이 같은 횟수만큼 가위바위보를 했을 때, 매 회차의 선택을 짝지어 승자를 판정하는 문제입니다. 한쪽의 결과만 따로 계산하지 않고 같은 인덱스의 두 값을 함께 비교하는 것이 핵심입니다.
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 해설을 가리고 다시 풀고, 경계 입력을 하나 바꾸어 예상 결과와 실제 결과를 비교하세요. 직전 값과 지금까지의 최댓값을 구분하고, 초기값과 갱신 순서를 손으로 추적하세요.
다음 추천 · 문제: 점수계산 풀이
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 58개 · 필수 58개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.