일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 사이버보안
- 파이썬
- webhacking.kr
- node.js
- gcp
- 백준
- 웹해킹
- 네트워크
- kotest
- gcp ci/cd
- Batch
- 스프링 배치
- 프로그래머스
- Python
- 회고
- pwnable.xyz
- sequelize
- 리버싱
- spring Batch
- cloud run
- hackctf
- 포너블
- Baekjoon
- 웹보안
- nodejs
- programmers
- 보안
- gcp cloud build
- docker
- 시스템 해킹
uju's Tech
[Baekjoon : Python] 죽음의 게임 : 17204 본문
<본 포스팅은 공부목적으로 작성되었습니다. 혹시 틀린 부분이 있거나 문제가 되는 부분이 있다면 답글 달아주세요!>
죽음의 게임 : 17204
사용언어: python
문제
중앙대학교 소프트웨어대학 새내기들을 맞이하게 된 17학번 김영기는 두 학번이라는 차이를 극복하기 위해 새내기들과 친해지려고 노력하고 있다. 그 노력 중 하나는 바로 새내기들과의 술자리에 참여하는 것이다. 그러나 혼자 가기에 민망했던 영기는 동기 보성이를 꼬셔 같이 술자리에 참석했다. 새내기들과 같이 술을 마시게 된 영기와 보성이는 분위기가 가라 앉을 때쯤 The Game of Death라고 불리는 죽음의 술게임을 제안한다.
죽음의 게임의 룰은 간단하다.
게임에 참여하는 N명의 사람들은 원탁에 둘러앉게 된다. 게임을 시작하는 사람은 0번, 그 오른쪽 사람은 1번, 그 오른쪽은 2번, N-1번의 오른쪽 사람은 다시 0번이 된다.
0번이 "신난다! 아싸 재미난다! 아싸 더 게임 오브 데! 스!" 라고 외침과 동시에, 모든 사람들은 각각 테이블에 둘러 앉은 사람들 중 한 명을 지목한다. 그리고 나서 0번은 임의의 양의 정수 M을 외친다.
그 다음, 0번은 "1"이라고 말한다. 이때 "1"이라고 말한 사람이 지목한 사람은 "2"라고 말하고, "2"라고 말한 사람이 지목한 사람은 "3"이라고 말하고, 같은 방식으로 반복해 M까지 말하게 된다. 이때 마지막으로 M이라고 말한 사람이 지목한 사람은 벌주를 마시게 된다.
새내기에게 벌주를 마시게 하기에는 죄책감이 들었던 영기는 동기인 보성이를 공격하기로 결심했다. 게임 참여자들간에 지목을 완료한 상태가 주어질때, 보성이가 벌주를 마시기 위해 영기가 불러야 하는 가장 작은 양의 정수 M을 보성이 몰래 귀띔해 주도록 하자.
김영기는 게임을 제안하였기에 자연스럽게 0번이 된다.
입력
첫 번째 줄에 게임에 참여하는 사람의 수 N(3 ≤ N ≤ 150)과 보성이의 번호 K(1 ≤ K ≤ N - 1)가 공백을 두고 주어진다.
두번째 줄부터 N줄에 걸쳐 i(0 ≤ i ≤ N - 1)번 사람이 지목하는 사람의 번호 ai(0 ≤ ai ≤ N - 1)가 주어진다. 자기 자신을 지목하는 경우도 존재할 수 있다.
출력
영기가 말해야 하는 가장 작은 양의 정수 M을 출력한다. 만약 어떤 방법으로도 보성이가 걸리지 않는다면 -1을 출력한다.
Think
더 게임 오버 데!스! 게임은 정말 익숙한 게임이다.
- M에서 받은 보성이가 잡히려면 일단 가리키고 있는 것이 이어져야한다.
- 이 이어지는 부분을 mylist라는 리스트에 append 해보았다.
- 그 후 in list를 이용하여 만약에 M(보성)이가 존재한다면 해당 index에 +1을 출력해주자.
- 리스트에 존재하지 않는다면 보성이는 리스트에 존재 하지 않으므로 -1을 출력해주자.
Code
import sys
N, M = map(int, sys.stdin.readline().split())
gameList = [int(sys.stdin.readline()) for _ in range(N)]
a = gameList[0]
mylist = []
for _ in range(len(gameList)):
mylist.append(a)
b = gameList[a]
mylist.append(b)
a = gameList[b]
if M in mylist:
print(mylist.index(M) + 1)
else:
print('-1')
느낀점
이 문제를 푸는데 시행착오가 정~말 많았다.
시간 초과에 메모리 초과에.. 사실 시간초과가 나왔을 때 in mylist 때문에 (O(n) 이니까..) 발생하는지 알고 while문 안에 조건문으로 하나하나 출력해주었다..그래도 시간초과..ㅜ 알고보니 걸러주는 조건문 자체가 잘못되었다는 것을 알게되었다.
import sys N, M = map(int, sys.stdin.readline().split()) gameList = [int(sys.stdin.readline()) for _ in range(N)] a = gameList[0] mylist = [] for _ in range(len(gameList)): mylist.append(a) b = gameList[a] mylist.append(b) a = gameList[b] if mylist[0] == a: if M in mylist: print(mylist.index(M) + 1) else: print('-1') break
위 와 같이 mylist[0] == a 여기가 문제였다. 무조건 순환한다고 생각한 것이 잘못이었다.
조금더 예외에 신경쓰자.
'Baekjoon' 카테고리의 다른 글
[Baekjoon : Python] 직각삼각형 : 4153 (0) | 2020.08.05 |
---|---|
[Baekjoon : Python] 아스키 아트 : 17072 (0) | 2020.08.01 |
[Baekjoon : Python]약수들의 합 : 9506 (0) | 2020.08.01 |
[Baekjoon : Python] 균형잡힌 세상: 4949 (0) | 2020.07.31 |
[Baekjoon : Python] 제로 : 10773 (0) | 2020.07.31 |