[파이썬] 프로그래머스 Lv0. 카운트 다운, 가까운 1 찾기, 리스트 자르기
안녕하세요 머킹입니다.
연휴가 끝나고 오랜만에 하는 코딩테스트네요!
카운트 다운
문제 설명
정수 start_num와 end_num가 주어질 때,
start_num에서 end_num까지 1씩 감소하는 수들을 차례로 담은 리스트를 return 하도록 solution 함수를 완성해 주세요.
def solution(start, end_num):
answer = []
for i in range(end_num):
start - 1 == answer
return answer
천천히 생각을 해보겠습니다.
일단 start라는 숫자에서 end_num까지 1씩 감소하는 수들을 적어야 하니까
range가 맞을까요?
다시 생각해 보니 while이라는 조건문을 써야 할 것 같습니다.
start_num 이 end_num보다 크면 answer에 end_num을 넣는 형식으로요.
그리고 end_num까지 1씩 감소해야 하니까 -1을 하면 될 것 같습니다.
def solution(start, end_num):
answer = []
while start_num >= end_num:
answer.append(start_num)
start_num -= 1
return answer
다시 생각해 봐도 이게 맞는 것 같은데 오류가 발생했습니다.
UnboundLocalError: local variable 'start_num' referenced before assignment
오류 발생의 이유는 이렇다고 합니다.
오류는 함수 내에서 변수를 사용하기 전에 해당 변수를 할당하지 않은 경우에 발생합니다.
이 오류가 발생하는 이유는 start_num 변수가 함수 내에서 할당되기 전에 사용되었기 때문입니다.
def solution(start_num, end_num):
answer = []
while start_num >= end_num:
answer.append(start_num)
start_num -= 1
return answer
이 코드로 통과했습니다.
위의 변수가 문제였네요!
def solution(start, end):
return list(range(start,end-1,-1))
range를 쓰는 방법도 있었습니다.
end에서 -1을 할 수 있는 게 놀랍네요..
가까운 1 찾기
문제 설명
정수 배열 arr가 주어집니다.
이때 arr의 원소는 1 또는 0입니다.
정수 idx가 주어졌을 때, idx보다 크면서 배열의 값이 1인 가장 작은 인덱스를 찾아서
반환하는 solution 함수를 완성해 주세요.
단, 만약 그러한 인덱스가 없다면 -1을 반환합니다.
이 문제가 왜 이해가 안 될까요?
정수 arr 원소는 1 또는 0이고 정수 idx가 주어졌을 때, idx보다 크면서 배열의 값이 1인 가장 인덱스...
[입출력 예시]
arr | idx | result |
[0, 0, 0, 1] | 1 | 3 |
[1, 0, 0, 1, 0, 0] | 4 | -1 |
[1, 1, 1, 1, 0] | 3 | 3 |
예시를 봐도 왜 저는 이해가 안 될까요 흠..
결국 chat GPT의 도움을 받았습니다만
def solution(arr, idx):
min_greater_idx = float('inf')
for i in range(idx + 1, len(arr)):
if arr[i] == 1:
min_greater_idx = i
break
return min_greater_idx if min_greater_idx != float('inf') else -1
테스트 3 | |
입력값 〉 | [1, 1, 1, 1, 0], 3 |
기댓값 〉 | 3 |
실행 결과 〉 | 실행한 결괏값 -1이 기댓값 3과 다릅니다. |
테스트 3개 중에 1개에서 지속적인 오류가 발생했습니다.
근데 이 정답 코드는 생각보다 되게 간단했습니다.
def solution(arr, idx):
for i in range(idx, len(arr)):
if arr[i] == 1:
return i
return -1
정말 허무한 for문 안에 if 문이었습니다 ㅎㅋ..
def solution(arr, idx):
answer = 0
try:
answer = arr.index(1, idx)
except:
answer = -1
return answer
try랑 except를 쓰는 경우도 있는데 이것도 깔끔하네요.
리스트 자르기
문제 설명
정수 n과 정수 3개가 담긴 리스트 slicer 그리고 정수 여러 개가 담긴 리스트 num_list가 주어집니다. slicer에 담긴 정수를 차례대로 a, b, c라고 할 때, n에 따라 다음과 같이 num_list를 슬라이싱 하려고 합니다.
n = 1 : num_list의 0번 인덱스부터 b번 인덱스까지
n = 2 : num_list의 a번 인덱스부터 마지막 인덱스까지
n = 3 : num_list의 a번 인덱스부터 b번 인덱스까지
n = 4 : num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로
올바르게 슬라이싱 한 리스트를 return 하도록 solution 함수를 완성해 주세요.
def solution(n, slicer, num_list):
answer = []
while num_list[n]:
num_list - slicer
return answer
def solution(n, slicer, num_list):
a, b, c = slicer
if n == 1:
return num_list[:b + 1]
elif n == 2:
return num_list[a:]
elif n == 3:
return num_list[a:b + 1]
elif n == 4:
return num_list[a:b + 1:c]
이렇게 길게 사용했는데요
지금 봐도 이 코드는 더 간결해질 수 있을 것 같습니다.
리스트 컴프리헨션을 사용하거나 조건문을 달 수 있지 않을까 생각이 되는데 맞을까요?
def solution(n, slicer, num_list):
a, b, c = slicer
return [num_list[:b + 1], num_list[a:], num_list[a:b + 1], num_list[a:b + 1:c]][n - 1]
하나하나 다 적지 않고 return에 이렇게 적는 방법이 있네요.
이제 곧 0단계를 다 풀어가니까 되게 감회가 새롭네요..!!
저도 드디어 코드 리포트(?)를 볼 수 있으려나요ㅎㅎ
'오늘부터 코딩테스트' 카테고리의 다른 글
[오늘부터 코딩테스트]파이썬으로 프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.10.06 |
---|---|
[오늘부터 코딩테스트]파이썬으로 프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.10.06 |
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.27 |
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.26 |
[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기 (0) | 2023.09.26 |