문제
N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.
이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.
예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다.
N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수 N(1 ≤ N ≤ 500,000)이 주어진다.
출력
첫째 줄에 남게 되는 카드의 번호를 출력한다.
예제 입력 1
6
예제 출력 1
4
문제를 풀때 알고리즘을 그대로 옮겨서 풀었더니 시간초과 오류가 떴다
#2164 카드2
n = int(input())
li = list(range(1,n + 1))
while len(li) > 1:
li.pop(0)
li.append(li.pop(0))
print(li[0])
솔직히 이것보다 더 짧을 수 없다고 생각했고 여기서 시간초과 오류가 발생되었다.
생각해보니 while문의 연산이 100000번 반복되면 100000번 연산이 반복되고 또한 pop함수는 반복적으로 호출되기 때문에 당연 시간초과가 뜨게 된다.
이때 규칙을 찾던 중, 리스트 연산의 슬라이싱 연산이 떠올라 규칙을 찾았고 다음과 같이 풀었다.
#2164 카드2
n = int(input())
li = list(range(1,n + 1))
while len(li) > 1:
if len(li) % 2 == 0:
li = li[1::2]
else:
li = [li[len(li) - 1]] + li[1::2]
print(li[0])
카드 리스트에서 인덱스의 번호가 홀수 (리스트는 0부터 시작하니깐)이면, 그 카드를 살리는 식으로 코드를 작성하였고,
계산 결과 리스트의 길이가 짝수인 경우와 홀수인 경우는 케이스가 서로 달랐다.
짝수인 경우는 인덱스가 홀수인 카드들만 살리면 됐지만, 홀수인 경우는 리스트의 맨 마지막 항목을 맨 앞으로 들고 와서 인덱스가 홀수인 리스트를 가져와야 했다.
'Study > CodingTest' 카테고리의 다른 글
[백준/Python] (S3)2108 - 통계학 (0) | 2023.06.22 |
---|---|
[백준/Python] (S4)1676 - 팩토리얼 0의 갯수 (0) | 2023.06.20 |
[Programmers] Lv.0 - 다음에 올 숫자 (0) | 2023.01.12 |
[Programmers] Lv.0 - 삼각형의 완성조건 (1) (0) | 2023.01.02 |
[Programmers] Lv.0 - 영어가 싫어요 (0) | 2023.01.02 |