본문 바로가기
  • 머킹이의 머신로그
오늘부터 코딩테스트

[오늘부터 코딩테스트]프로그래머스 코딩 기초 프로그램 풀기

by 머킹 2023. 10. 4.
728x90

[파이썬] 프로그래머스 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단계를 다 풀어가니까 되게 감회가 새롭네요..!!

저도 드디어 코드 리포트(?)를 볼 수 있으려나요ㅎㅎ