일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- Express
- PINTOS
- 리액트
- sw 정글
- 정글sw
- html input
- 자바스크립트
- malloc-lab
- 백준
- 회원가입 폼
- 프로그래머스
- Spring
- dfsbfs
- React
- 템플릿 문자열
- python
- 회원가입
- onChange
- node.js
- 자바스크립트 문자열 변수
- conding test
- SW정글
- HTML
- 목록 창 만들기
- 코딩테스트
- JavaScrpit
- javascript
- sw정글사관학교
- Coding Test
- 사용자 정의 객체
Archives
- Today
- Total
코드치고 무게치고
[백준 python] 9658번 돌 게임 4 - 동적프로그래밍(DP) 본문
[백준 python] 9658번 돌 게임 4 - 동적프로그래밍
레벨: 실버2
언어: python
📑풀이 과정
DP를 이용해서 풀이할 수 있는 문제이다.
나는 이 문제를 풀기 위해 돌이 N개 있을 때
후공자의 승패 여부를 dp 배열에 저장하고 사용하였다.
dp[N]이 True 면 선공자의 승이면서 후공자의 패이다.
아래의 표와 같이 후공이 지고 이기는 상황을 알 수 있다.
이때 돌이 N개 일때 누가 이기는 알기 위해서
N - 1 일때
N - 3 일때
N - 4 일때
후공자가 승인지 패인지를 보면 현재 게임에서 누가 이기는지 알 수 있다.
상근이가 돌을 가져가는 갔을 때 후공자 창영이가 승하면 상근이는 패하고
후공자 창영이가 패하면 상근이가 승한다.
돌 수 | 1 | 2 | 3 | 4 | 5 | 6 |
후공자 승 패 | 승 | 패 | 승 | 패 | 패 | 패 |
📋풀이 코드
N = int(input())
dp = [False]* 1001
dp[2] = True
for i in range(4, N+1):
if not dp[i-1]:
dp[i] = True
if not dp[i-3]:
dp[i] = True
if not dp[i-4]:
dp[i] = True
print('SK' if dp[N] else 'CY')
if not dp[i-1]
돌 N개에서 한개를 가져온 값이 False면 후공자가 패 한 것이고 현재 게임에서는 선공자가 이기게 된다.
나머지 밑에 if문도 같은 맥락이다.
다른 풀이
다른 풀이를 찾아보니깐 7개 마다 패승 규칙이 반복된다고 한다.
반복되는 규칙을 찾아서 코드를 작성해도 풀 수 있다.
'개발공부 > 코딩테스트 준비' 카테고리의 다른 글
[백준 python] 15904번 UCPC는 무엇의 약자일까? - 그리디 (0) | 2022.03.03 |
---|---|
[백준 python] 1037번 약수 (0) | 2022.03.02 |
[백준 python] 2225번 합분해 - 동적프로그래밍(DP) (0) | 2022.02.27 |
[백준 python] 2579번 계단 오르기 - 동적프로그래밍(DP) (0) | 2022.02.27 |
[백준 python] 2644번 촌수계산 DFS - 파이썬 (2) | 2022.02.25 |
Comments