[Python] 그리디 알고리즘을 파헤쳐 보자! (1이 될 때까지)

2022. 1. 24. 23:02·Python 알고리즘
반응형

그리디 알고리즘이란?

그리디 알고리즘 또는 탐욕벅이라고 불린다. 현재 상황에서 가장 좋은 정답을 찾는 알고리즘이지만, 항상 최적의 해를 보장할 수 없다. 코딩 테스트에서는 대부분 그리디 알고리즘을 통해 얻은 해가 최적의 해가 되는 상황을 부여하기 때문에 가장 최적의 해를 찾아 문제를 풀 수 있어야 한다.

 

여러가지 예시를 보고 이해를 해보자.

문제

어떠한 수 N이 1이 될 때까지 다음의 두 과정 중 하나를 반복적으로 선택하여 수행하려고 합니다. 단, 두 번째 연산은 N이 K로 나누어 떨어질 때만 선택할 수 있습니다.

 

1-1. N에서 1을 뺍니다.

1-2. N을 K로 나눕니다.

입력

25 4

출력

5

정답

import sys

n, k = list(map(int, sys.stdin.readline().strip().split()))
result = 0

while True:
     # target은 n에서부터 k로 나눌 수 있는 가장 가까운 수
     target = (n // k) * k
     result += n - target
     n = target

     if n < k:
          break

     # k로 나누기
     result += 1
     n //= k

# n을 1로 만들기 위한 식
result += n - 1
print(result)

Tip

N을 1로 만들기 위해서는 1씩 빼기를 하는 것보다 K로 나누는 것이 기하급수적으로 N이 작아지기 때문에 우린 K로 나눌 수 있다면 나누어야 한다.

 

# n = 25, k = 4
target = (n // k) * k
# target = 24

 

여기서 k로 나눌 수 있는지에 대한 조건문 대신 약간의 테크닉을 사용하여 n을 k로 나누어 떨어질 수 있는 가장 가까운 수가 나오게 된다. 만약, n이 k로 나누어질 수 있는 상태라면 똑같은 숫자가 반환되게 된다.

# n = 25, target = 24
result += n - target
# result = 1

N에서 K로 나눌 수 있는 수인 target을 빼주면 -1를 몇 번 했는지 알 수 있게 되고, 그것을 result에 카운트를 해준다.

# N을 K로 나누기
result += 1
n //= k

N은 K로 나눌 수 있는 수로 변경 되었으니 result에 1 카운트 후 K로 나누어 준다.

if n < k:
	break

N이 K보다 작다면 나누기를 더 이상 할 수 없는 의미이기 때문에 반복문을 탈출하게 된다.

# result = 4, n = 2
result += n - 1
# result = 4 + 1

N과 1 사이에 차이를 구해 마지막으로 -1를 몇 번 해야하는지 카운트하여 result에 더해준다.

 

Reference

본 그리디 알고리즘 문제 예제 및 개념은 나동빈 (이코테 2021 강의 몰아보기) 2. 구현 & 그리디 구현을 참고합니다.

 

반응형

'Python 알고리즘' 카테고리의 다른 글

[Python] 그리디 알고리즘을 파헤쳐 보자! (모험가 길드)  (0) 2022.01.25
[Python] 그리디 알고리즘을 파헤쳐 보자! (곱하기 혹은 더하기)  (0) 2022.01.24
[Python] 코드업 Python 100제 6098번 성실한 개미  (0) 2022.01.24
[Python] 코드업 Python 100제 6097번 설탕과자 뽑기  (0) 2022.01.24
[Python] 코드업 Python 100제 6096번 바둑알 십자 뒤집기  (0) 2022.01.24
'Python 알고리즘' 카테고리의 다른 글
  • [Python] 그리디 알고리즘을 파헤쳐 보자! (모험가 길드)
  • [Python] 그리디 알고리즘을 파헤쳐 보자! (곱하기 혹은 더하기)
  • [Python] 코드업 Python 100제 6098번 성실한 개미
  • [Python] 코드업 Python 100제 6097번 설탕과자 뽑기
seungyong20
seungyong20
  • seungyong20
    코딩 기록소
    seungyong20
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • Python 알고리즘 (38)
      • 자료구조 (1)
      • Project 하면서 알아가는 것들 (12)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 기록하는 습관을 기르자
  • 인기 글

  • 태그

    jpa multiplebagexception
    그리디 알고리즘
    python 그리디 알고리즘
    백준
    jpa eager
    python 백준
    python 알고리즘
    Python
    JPA
    python 2차원 배열
    jpa n + 1 문제
    python 그리디 알고리즘 문제 추천
    jpa 쿼리 최적화
    python slicing
    join fetch 주의점
    python 브루트 포스
    spring boot
    fetch join 주의점
    multiplebagexception set list
    kafka
    multiplebagexception
    jpa 에러
    python 그리디 문제 추천
    python 방향벡터
    python 이코테
    python 정렬
    Typescript
    python heap
    jpa fetch
    jpa lazy vs eager
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
seungyong20
[Python] 그리디 알고리즘을 파헤쳐 보자! (1이 될 때까지)
상단으로

티스토리툴바