세조목

PYTHON 정리(알고리즘, 큐 예제)(24.01.08) 본문

데이터 분석 공부/Python

PYTHON 정리(알고리즘, 큐 예제)(24.01.08)

세조목 2024. 1. 8. 22:34

1. 프로그래머스 PYTHON 예제 '나누어 떨어지는 숫자 배열'

https://school.programmers.co.kr/learn/courses/30/lessons/12910

'나누어 떨어지는 수자 배열' 문제의 요구사항을 정리하면 다음과 같다.

  1. array의 각 element 중 divisor로 나누어 떨어지는 값을 구하라
  2. 오름차순으로 정렬해라
  3. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아서 반환해라

일전에 이 문제를 풀었던 적이 있었다.

그 때 아래 부분까지는 코드를 작성했다.

def solution(arr, divisor):
    answer = []
    for num in arr:
        if num % divisor == 0:
            answer.append(num)
        answer.sort()

그러나 아무리 생각해도 3번 요구사항을 해결하기위한 코드를 어떻게 작성해야할지 알 수가 없었다.

그래서 잠시 접어두었던 문제인데 금일 알고리즘 특강에서 위 문제의 풀이가 있었다.

 

3번 요구사항을 해결하기위한 코드는 굉장히 간단했다.

    if len(answer) == 0:
        answer.append(-1)

이 부분만 더해주면 됐다.

리스트 answer의 크기를 구했을때 0이라면

answer 리스트에 -1을 넣어주는 것이다.

answer 리스트에 어떠한 element도 없다는 것을 len함수를 활용해서 확인할 수 있겠다라는 생각은 조금도 해보지 못했다.

이번 문제를 통해 그렇게도 구할 수 있다는 것을 확실히 학습했다.

 

정답 코드의 완성본은 아래와 같다.

def solution(arr, divisor):
    answer = []
    for num in arr:
        if num % divisor == 0:
            answer.append(num)
        answer.sort()
    if len(answer) == 0:
        answer.append(-1)
    return answer

 

2. 프로그래머스 PYTHON 예제 '같은 숫자는 싫어'

'같은 숫자는 싫어'의 문제이며 요구사항을 정리하면 아래와 같다.

  1. 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거한다.
  2. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 한다.

어떻게하면 연속적으로 나타나는 숫자를 하나만 남길수있을까?

이 문제 역시도 전혀 생각지도 못했던 풀이 방법이었다.

 

def solution(arr):
    answer = []
    answer.append(arr[0])
    
    for i in arr[1:]:
        if answer[-1] == i:
            pass
        else:
            answer.append(i)
    return answer

전체 코드다.

세번째 절 'answer.append(arr[0])' 이 왜 필요했을까?

배열 arr의 첫번째 자리 숫자를 리스트 answer에 넣어주었다.

이는 arr 배열의 두번째 자리 숫자와 비교하기 위함이다.

 

위 문제는 '큐' 문제이다.

내일 2차 알고리즘 특강이 끝난 후 특강 내용을 정리하는 포스팅에 적어놓을 것이지만

'큐'란 First In First Out되는 것을 의미한다.

다시 말해 먼저 들어온 값이 먼저 나간다는 말이다.

 

arr의 첫번째 자리 숫자가 가장 먼저 들어왔기때문에

answer(arr[0])으로 가장 먼저 내보내준다.

그런 다음 a[1:]로 두번째 자리 숫자부터 arr[0] 숫자와 비교를 해준다.

먼저 들어온 숫자가 먼저 나가고, 그 다음에 들어올 숫자의 비교 대상이 되어주는 것이다.

 

그렇게 코드를 작성했을때 answer[-1]과 arr[1:]이 같다면 넘어가고,

같지 않다면 answer 리스트에 넣어주기만 하면 문제는 간단하게 풀린다.