가위바위보 JavaScript 풀이

2026.09.14·수정 2026.09.16·약 5분·작성: 해비·블로그 소개

두 사람이 같은 횟수만큼 가위바위보를 했을 때, 매 회차의 선택을 짝지어 승자를 판정하는 문제입니다. 한쪽의 결과만 따로 계산하지 않고 같은 인덱스의 두 값을 함께 비교하는 것이 핵심입니다.

문제

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

풀이와 정답

풀이와 정답 보기 (클릭)

각 회차는 다른 회차의 결과에 영향을 주지 않으므로 처음부터 끝까지 한 번 순회하면 됩니다. 먼저 같은 값인지 확인해 비긴 경우를 처리하고, 그다음 A가 이기는 세 조합만 명시합니다. 나머지 서로 다른 조합은 모두 B의 승리입니다.

알고리즘 설계

가위·바위·보가 서로 이기는 순환 규칙을 나타낸 그림

A가 이기는 경우는 가위와 보, 바위와 가위, 보와 바위의 세 쌍입니다. 숫자로 바꾸면 (1, 3), (2, 1), (3, 2)입니다. 이 세 조건을 논리합으로 묶으면 승리 규칙을 빠뜨리지 않고 표현할 수 있습니다.

판정 순서도 중요합니다. 두 값이 같으면 바로 D를 저장합니다. 값이 다를 때만 A의 승리 조합을 확인하고, 여기에 해당하지 않으면 B를 저장합니다. 결과를 배열에 모았다가 줄바꿈 문자로 연결하면 문제의 출력 형식과 정확히 맞습니다.

JavaScript 풀이

A와 B의 선택을 회차별로 비교해 승자를 출력하는 과정
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 풀이에서도 확인할 수 있습니다.

이 글이 도움이 되었나요?

조회 중

코딩테스트 JavaScript 학습 순서

필수 49개 · 전체 49개

읽음 기록 관리

전체 과정 목차 (49개)
  1. 필수 길잡이 · 코딩테스트 JS 자료구조 로드맵: 배열, 해시, 스택, 투 포인터 순서
  2. 필수 학습 · 세 수 중 최솟값 JavaScript 조건문 풀이 정리
  3. 필수 학습 · 삼각형 판별하기 JavaScript 풀이
  4. 필수 학습 · 연필 개수 JavaScript 풀이
  5. 필수 학습 · 1부터 N까지 합 출력하기 JavaScript 풀이
  6. 필수 학습 · 최솟값 구하기 JavaScript 풀이|배열 순회와 비교 갱신 원리
  7. 필수 학습 · 홀수 JavaScript 풀이: 조건 판별과 결과 처리 정리
  8. 필수 학습 · 10부제 JavaScript 풀이: 끝자리 비교로 위반 차량 수 세기
  9. 필수 학습 · A를 #으로 JavaScript 풀이: 문자열 순회와 치환
  10. 필수 학습 · 문자 찾기 JavaScript 풀이: 문자열 순회로 개수 세기
  11. 필수 학습 · 대문자 찾기 JavaScript 풀이
  12. 필수 학습 · 대문자로 통일 JavaScript 풀이
  13. 필수 학습 · 대소문자 변환 JavaScript 풀이
  14. 필수 학습 · 일곱 난쟁이 JavaScript 풀이: 두 명을 제외하는 완전탐색
  15. 필수 학습 · 코딩테스트 JS Map 풀이: 학급 회장 득표수 세기
  16. 필수 학습 · 코딩테스트 JS 스택 풀이: 올바른 괄호 검증하기
  17. 필수 학습 · 코딩테스트 JS 스택 풀이: 괄호문자 제거하기
  18. 필수 학습 · 코딩테스트 JS 스택 풀이: 크레인 인형뽑기 처리법
  19. 필수 학습 · 코딩테스트 JS 스택 풀이: 후위식 연산 계산하기
  20. 필수 학습 · 코딩테스트 JS 스택 풀이: 쇠막대기 레이저 절단 개수 세기
  21. 필수 학습 · 코딩테스트 JS 투 포인터 풀이: 두 정렬 배열 합치기
  22. 필수 학습 · 코딩테스트 JS 투 포인터 풀이: 공통 원소 추출하기
  23. 필수 학습 · 코딩테스트 JS 슬라이딩 윈도우 풀이: 최대 매출 구간 합 계산하기
  24. 필수 학습 · JavaScript 투 포인터: 합이 M인 연속 부분수열 개수
  25. 필수 학습 · 코딩테스트 JS 해시 풀이: 모든 아나그램 찾기
  26. 필수 학습 · 가장 긴 문자열 JavaScript 풀이
  27. 필수 학습 · 가운데 문자 출력 JavaScript 풀이
  28. 필수 학습 · 중복문자제거 JavaScript 풀이
  29. 필수 학습 · 코딩테스트 JS 고급: 최소 힙으로 다익스트라 최단 경로 구하기
  30. 필수 학습 · 코딩테스트 JS Union-Find: 연결 성분 수와 크기 구하기
  31. 필수 학습 · 코딩테스트 JS Trie: 접두사에 맞는 단어 수 세기
  32. 필수 학습 · 코딩테스트 JS Fenwick Tree: 값 갱신과 구간 합 처리
  33. 필수 학습 · 코딩테스트 JS 세그먼트 트리: 단일 대입과 구간 합
  34. 필수 학습 · 코딩테스트 JS LRU 캐시: 지도 타일 재사용 기록
  35. 필수 학습 · 코딩테스트 JS AVL 트리: 기준 이상 최솟값 찾기
  36. 필수 학습 · 코딩테스트 JS 큐: 상담 창구 대기열 명령 처리
  37. 필수 학습 · 코딩테스트 JS 연결 리스트: 재생 대기 목록 관리
  38. 필수 학습 · JavaScript 원형 덱 연습: 최근 기록 창과 되돌리기
  39. 필수 학습 · JavaScript 해시 테이블 연습: 정규화 문자열 빈도와 등장 순서
  40. 필수 학습 · JavaScript 트리 순회 연습: 깊이별 노드 묶기
  41. 필수 학습 · JavaScript BST 연습: 닫힌 구간의 중복 키 보고서
  42. 필수 학습 · JavaScript 최소 힙 연습: 동률 순서를 지키는 작업 스케줄러
  43. 필수 학습 · JavaScript 그래프 연습: 연결 구역 크기를 작은 순서로 출력하기
  44. 필수 학습 · 중복단어제거 JavaScript 풀이
  45. 필수 학습 · TypeScript 이진 탐색 연습: 숫자 카드 존재 여부 확인
  46. 필수 학습 · 큰 수 출력하기 JavaScript 풀이
  47. 필수 학습 · 보이는 학생 JavaScript 풀이
  48. 필수 학습 · 가위바위보 JavaScript 풀이 현재 글
  49. 필수 학습 · 점수계산 JavaScript 풀이

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기