jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준 자바스크립트 입력 템플릿
  • fetch 취소하기
  • JavaScript
  • 퀵정렬 자바스크립트
  • 자바스크립트 커링
  • 자바스크립트 이벤트 위임
  • 자바스크립트 채팅방 스크롤
  • safari Date format NaN
  • 25632 소수 부르기 게임
  • 억억단을 외우자 javascript
  • 리코쳇 로봇 javascript
  • 외벽 점검 javascript
  • javascript use strict
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 프로그래머스 숫자카드나누기 javascript
  • 자바스크립트 sort는 왜 그모양일까
  • 계수정렬 자바스크립트
  • 1753 최단경로 javascript
  • 깃 이전 커밋에서 새 브랜치 만들기
  • 카카오 코딩테스트 양궁대회 nodeJS
  • 백준 17406 nodeJS
  • 리액트 프로젝트 디버깅하기
  • 덧칠하기 javascript
  • 13460 javascript nodejs
  • 병합정렬 자바스크립트
  • 자바스크립트 배열의 특수함
  • 가사 검색 자바스크립트
  • safari invalid date error
  • 대충만든자판 javascript
  • 자바스크립트 모듈 시스템

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae
DS & Algorithm/baekjoon

[백준] 25632번 소수부르기게임 - 자바스크립트

[백준] 25632번 소수부르기게임 - 자바스크립트
DS & Algorithm/baekjoon

[백준] 25632번 소수부르기게임 - 자바스크립트

2022. 9. 27. 14:15

문제

 

25632번: 소수 부르기 게임

용태가 부를 수 있는 소수는 $11, 13, 17$이고, 유진이가 부를 수 있는 소수는 $13, 17, 19$이다. 둘 다 최선을 다해서 플레이한다면 $13 → 17 → 11 → 19$로 진행될 수 있다. 용태가 더 이상 부를 소수가

www.acmicpc.net

새로 나온 따끈따끈한 문제에,, 실버4 난이도 치고는 생각할 게 조금 있어서 가져오게 되었다.


코드

function sol(input) {
  const [A, B] = input[0].split(' ').map(Number);
  const [C, D] = input[1].split(' ').map(Number);

  const yt = eratosThenes(A, B);
  const yj = eratosThenes(C, D);
  const ytPrimes = {};
  let intersection = 0;

  yt.forEach((prime) => (ytPrimes[prime] = 1));
  yj.forEach((prime) => {
    if (ytPrimes[prime]) intersection++;
  });

  const cnt = { yt: yt.length, yj: yj.length };

  while (cnt.yt > 0 && cnt.yj > 0) {
    if (intersection >= 2) {
      intersection -= 2;
      cnt.yt -= 2;
      cnt.yj -= 2;
    } else if (intersection >= 1) {
      intersection--;
      cnt.yt -= 1;
      cnt.yj -= 2;
    } else {
      cnt.yt -= 1;
      cnt.yj -= 1;
    }
  }

  return cnt.yt > cnt.yj ? 'yt' : 'yj';
}

function eratosThenes(start, end) {
  const arr = Array.from({ length: 1001 }, (_, i) => i);
  const sqrt = Math.floor(arr.length);
  arr[1] = 0;

  for (let i = 2; i <= sqrt; i++) {
    if (arr[i] === 0) continue;

    for (let j = 2 * i; j <= 1000; j += i) {
      arr[j] = 0;
    }
  }

  return arr.slice(start, end + 1).filter((elem) => elem);
}



const input = [];
require('readline')
  .createInterface(process.stdin, process.stdout)
  .on('line', (line) => {
    input.push(line);
  })
  .on('close', () => {
    console.log(sol(input));
    process.exit();
  });

 


풀이

 

조건

용태는 범위 A,B 내에 있는 소수를 부른다.

유진이는 범위 C,D 내에 있는 소수를 부른다.

용태부터 시작해 서로 번갈아가며 부를 수 있는 범위의 소수를 부른다. 그러나 중복되선 안된다.

더이상 소수를 부를 수 없다면 패배한다.

 

2 <= A <= B <= 1000

2 <= C <= D <= 1000

 

Q. "용태와 유진이가 모두 최선을 다해 게임을 플레이 했을 때 누가 이길까?"

 

풀이방향

keypoint : "최선을 다해야 하므로" 용태/유진이의 소수 교집합을 먼저 불러야 한다.

 

1. 각자의 소수 구하는 방법을 이용해서 A,B범위, C,D 범위의 소수들을 구한다.

2. 각자의 방법으로 용태와 유진이의 소수 교집합을 구한다.

    나는 용태 소수들을 먼저 기록하고, 유진이도 동일한 소수를 가지고 있다면 카운팅했다.

3. 먼저 소수 교집합을 소진시키고, 각자의 소수들을 소진시킨다.

4. 용태, 유진이가 각각 소수를 한번씩 부르는 것을 1개의 사이클로 한다.

    둘 다 부를 소수가 없다면, 용태 순서이므로 용태가 패배함을 유의한다.

 


주석포함

function sol(input) {
  const [A, B] = input[0].split(' ').map(Number);
  const [C, D] = input[1].split(' ').map(Number);

  const yt = eratosThenes(A, B); // 용태의 소수
  const yj = eratosThenes(C, D); // 유진이의 소수
  const ytPrimes = {};
  let intersection = 0;

  yt.forEach((prime) => (ytPrimes[prime] = 1));
  yj.forEach((prime) => {
  	// 유진이의 소수가 용태의 소수면 소수교집합 카운트
    if (ytPrimes[prime]) intersection++;
  });

  const cnt = { yt: yt.length, yj: yj.length };

  while (cnt.yt > 0 && cnt.yj > 0) {
  	// 1개 사이클에 각자 번갈아가며 숫자를 불러줘야 함.
    if (intersection >= 2) {
    	// 교집합이 있다면 먼저 소진.
      intersection -= 2;
      cnt.yt -= 2;
      cnt.yj -= 2;
    } else if (intersection >= 1) {
        // 교집합이 1개 남았다면, 용태만 소진하고 유진이는 자신의 소수 부름.
      intersection--;
      cnt.yt -= 1;
      cnt.yj -= 2;
    } else {
	    // 	교집합이 없다면 각자의 소수 부름.
      cnt.yt -= 1;
      cnt.yj -= 1;
    }
  }
	
    // == 을 포함하면 용태가 부를차례에 남은 수가 없음에도 이기게 되어 실패
  return cnt.yt > cnt.yj ? 'yt' : 'yj';
}


function eratosThenes(start, end) {
	// 각자의 방법으로 구간 내의 소수를 구하는 공식을 써보자.
  const arr = Array.from({ length: 1001 }, (_, i) => i);
  const sqrt = Math.floor(arr.length);
  arr[1] = 0;

  for (let i = 2; i <= sqrt; i++) {
    if (arr[i] === 0) continue;

    for (let j = 2 * i; j <= 1000; j += i) {
      arr[j] = 0;
    }
  }

  return arr.slice(start, end + 1).filter((elem) => elem);
}



const input = [];
require('readline')
  .createInterface(process.stdin, process.stdout)
  .on('line', (line) => {
    input.push(line);
  })
  .on('close', () => {
    console.log(sol(input));
    process.exit();
  });

조금 더 쉽고 간단한 방법이 존재할 수 있습니다!

저작자표시 (새창열림)

'DS & Algorithm > baekjoon' 카테고리의 다른 글

[백준] 1753번 최단경로 - 자바스크립트  (0) 2022.09.22
[백준] 17406번 배열 돌리기 4 - 자바스크립트  (0) 2022.04.15
[백준] 13460번 구슬 탈출 2 - 자바스크립트  (0) 2022.03.25
[백준] 1541번 잃어버린 괄호 - JavaScript(NodeJS)  (0) 2021.07.19
[백준] 2108번 통계학 - JavaScript(NodeJS)  (0) 2021.07.18
  • 문제
  • 코드
  • 풀이
  • 주석포함
'DS & Algorithm/baekjoon' 카테고리의 다른 글
  • [백준] 1753번 최단경로 - 자바스크립트
  • [백준] 17406번 배열 돌리기 4 - 자바스크립트
  • [백준] 13460번 구슬 탈출 2 - 자바스크립트
  • [백준] 1541번 잃어버린 괄호 - JavaScript(NodeJS)
jiho_bae
jiho_bae
하루에 한 걸음씩

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.