백준 11866번 - 요세푸스 문제 0

백준 11886번 바로가기 내 풀이 n, k = map(int, input().split()) arr = [i+1 for i in range(n)] ans = [] while len(arr) > 1: for _ in range(k-1): arr = arr[1:] + [arr[0]] ans.append(arr.pop(0)) ans.append(arr.pop()) print('<', end='') print(*ans, sep=', ', end='') print('>') 색다른 시도 원형을 그대로 사용해볼까? 좋은 생각이야! ^_^ n, k = map(int, input().split()) arr = [i+1 for i in range(n)] ans = [] i = 0 while len(arr) > 0: i = (i+k-1) % len(arr) ans.append(arr.pop(i)) print('<', end='') print(*ans, sep=', ', end='') print('>') CODE REVIEW 원형으로 되어있는 문제가 복잡하길래, 선형으로 변환하여 풀어내었다. 무식한 방법이지만 시간제한이 2초라 넉넉해서 그렇게 시도했다. 1008ms시간 걸렸다. 색다른 시도에서는 원형을 그대로 사용하기 위해서 index에 신경을 썼다. 기본적으로 (i+k)번째를 불러오면 되지만, 전체 길이를 넘치게 되면 전체 길이로 나눈 나머지번째를 불러오면 된다. ...

2023-5-15 · 1 min · 157 words · Junha

백준 2164번 - 카드2

백준 2164번 바로가기 첫 번째 시도 cards = [i+1 for i in range(int(input()))] while len(cards) != 1: cards.pop(0) cards.append(cards.pop(0)) print(*cards) 시간초과 error… 두 번째 시도 cards = [i+1 for i in range(int(input()))] while len(cards) != 1: if len(cards)%2==0: cards = cards[1::2] else: cards = [cards[-1]] + cards[1::2] print(*cards) 홀짝성에 따른 규칙 아이디어를 적용해서 시간초과 에러를 해결하고자 했다. 홀수순서는 제거되고, 짝수순서는 맨 뒤에 옮겨지기에 순서가 그대로이다. 다만, 전체 카드 갯수가 홀수인 경우에는 마지막 카드를 고려해주어야 한다. 고수의 풀이 n,m=int(input()),1 while m<n:m*=2 print(n*2-m) 출처 다른 풀이 deque을 활용해보자! 첫 번째 풀이와 형태가 거의 유사하다. collections라이브러리에서 deque을 불러오면 된다. from collections import deque cards = deque([i+1 for i in range(int(input()))]) while len(cards) != 1: cards.popleft() cards.append(cards.popleft()) print(*cards) CODE REVIEW 나의 경우 제거해나가는 과정을 구현해서 컴퓨터가 답을 구해나가도록 했지만, 고수의 경우 (n, ans) 순서쌍 사이의 관계식을 찾아서 해결했다. 메모리나 시간 면에서는 규칙을 찾아서 해결하는 것이 좋겠지만, 난이도가 급상승하고 직관적이지 못하다. deque을 이용해서 시간 초과 문제를 어느 정도는 해결 가능하다! 메모리 사용량과 시간은 아래를 참고. 위가 ‘deque’을 이용한 방법, 아래가 ‘홀짝성’을 이용한 방법. ...

2023-5-15 · 2 min · 216 words · Junha