Hi, There!
안녕하세요, 바오밥입니다.
목차
- 문제
- 풀이
문제
문제 설명
1부터 n까지 숫자가 적힌 카드 뭉치를 다음 규칙에 따라 카드 뭉치를 섞었을 때, 아래에서부터 k번째에 있는 카드에 적힌 숫자를 알아내려합니다. 카드 뭉치 가장 아래에는 1이 쓰여있으며, 위로 갈수록 숫자가 커집니다.
카드 뭉치를 섞는 규칙은 다음과 같습니다.
1. 카드 뭉치를 정확히 반으로 나눕니다.
2. 두 개로 나뉜 카드 뭉치를 교차로 섞어서 카드 뭉치 하나를 만듭니다.
이때, 항상 1이 적힌 카드가 있는 뭉치를 아래로 놓고 섞습니다.
3. 위 과정을 반복합니다.
예를 들어, 1부터 6까지 숫자가 적힌 카드 뭉치를 3번 섞는다면 과정별로 아래에서부터 적힌 숫자는 다음과 같습니다.
이때, 아래에서 3번째에 있는 카드에 적힌 숫자는 5입니다.
처음에 가장 위에 있는 카드에 적힌 숫자 n, 섞는 횟수 mix, 알고 싶은 카드의 위치 k가 매개변수로 주어질 때, 아래에서부터 k번째에 있는 카드에 적힌 숫자를 return 하도록 solution 함수를 작성했습니다.
그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다.
주어진 코드에서 한 줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.
매개변수 설명
처음에 가장 위에 있는 카드에 적힌 숫자 n, 섞는 횟수 mix, 알고 싶은 카드의 위치 k가 solution 함수의 매개변수로 주어집니다.
- n은 10 이상 50 이하인 짝수입니다.
- 카드는 0회 이상 10회 이하로 섞습니다.
- k는 1 이상 n 이하인 자연수입니다.
return 값 설명
아래에서 k번째에 있는 카드에 적힌 숫자를 return 해주세요.
예제
예제 설명
문제에 나온 예와 같습니다.
풀이
풀이 코드 및 해설
def solution(n, mix, k):
answer = 0
card = [_ for _ in range(1, n+1)]
# 1부터 n까지 차례대로 배열을 채움 (카드 더미 생성)
while mix != 0:
# 셔플 횟수가 0번이 될때까지 반복
mix = mix - 1
# 셔플 시도 시 셔플 횟수 1회 감소
card_a, card_b = [0 for _ in range(n//2)], [0 for _ in range(n//2)]
# 카드 더미를 두 더미로 나눔
# 단, 모든 값이 0임
for i in range(0, n):
# 카드 개수만큼 반복
if i < n//2:
# 전체 개수를 2로 나눈 수 보다 i가 작으면
card_a[i] = card[i]
# a 카드 더미에 카드 값 저장
else:
# 전체 개수를 2로 나눈 수보다 i가 크면
# 단, i가 n//2보다 큰 상태에서 값이 누적됨
# 따라서, i-n//2으로 변경해 줘야함.
card_b[i-n//2] = card[i]
# b 카드 더미에 카드 값 저장
for i in range(0, n):
if i % 2 == 0:
# i가 짝수일 경우
card[i] = card_a[i//2]
# card_a 더미의 값을 누적
else:
# i가 홀수일 경우
card[i] = card_b[i//2]
# card_b 더미의 값을 누적
answer = card[k-1]
# 인덱스는 0부터 시작함 => 즉 인덱스 k-1번이 k번째 값
return answer
'Certificate > Cert - Cos Pro 1급' 카테고리의 다른 글
[프로그래머스] Cos Pro 1급 모의고사, 큰 수와 작은 수의 차이 (0) | 2021.07.02 |
---|---|
[프로그래머스] Cos Pro 1급 모의고사, 꽃 피는 봄이 언제 오나요 (0) | 2021.07.01 |
[프로그래머스] Cos Pro 1급 모의고사, 코인을 많이 획득하세요 (2) | 2021.07.01 |
[프로그래머스] Cos Pro 1급 모의고사, 만났을 때 최대인 경우 (0) | 2021.06.30 |
[프로그래머스] Cos Pro 1급 모의고사, 급여 총합 구하기 (0) | 2021.06.30 |