개발하는 삶

[알고리즘] 그리디 알고리즘 본문

CS/알고리즘

[알고리즘] 그리디 알고리즘

삶_ 2022. 6. 24. 20:58

 

그리디 알고리즘

  • 현재 상황에서 가장 좋은 방법을 구한다
  • 위의 결과가 맞는지 정당성분석이 중요
  • 일반적인 상황은 최적의 해를 보장할수없지만 코테에서는 그런식으로 풀리도록 출제됨

  • ex. 거스름돈 문제(가장 큰 화폐단위부터 돈을 거슬러준다)
    동전의 큰 단위가 항상 작은단위의 배수가 되므로 그리디알고리즘을 사용하게됨
    우선 문제풀이를 위한 최소한의 아이디어를 떠올리고 정당한지 검토해야함

  • ex. 주어진 숫자 두개중 첫번째가 1이될때까지 연산 최대 횟수구하기
    첫번째가 2이상이기만 하면 두번째로 나누는 것이 낫다
    주어진 숫자중 두번째로 최대한 많이 나누면 됨(2이상의 수로 나누고, 그다음 1을빼는 작업을 반복)

  • ex. 곱하기 혹은 더하기
    0~9 숫자로 이루어진 문자열 s
    왼쪽에서 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자사이에 x혹은 +연산자를 넣어
    결과적으로 만들어질 수 있는 가장 큰 수를 구하는 프로그램.
import sys

S = sys.stdin.readline().rstrip()
sum = int(S[0])

for i in range(1, len(S)):
    # num이라는 새로운 변수를 만들어 sum과 분리되어 계산함
    # 0이나 1인경우 무조건 더하기로 하기(곱하기보단 더하기가 더 큰수가 나와서)
    # sum도 S의 요소중 하나기 때문에 1 아래로 설정해 더해주었다
    num = int(S[i])
    if num <=1 or sum <=1:
        sum += num
    else:    
        sum *= num

print(sum)

 

  • 모험가가 N명 있고, 공포도가 X인 모험가는 X명이상 그룹을 짜야함
  • 최대 그룹 수를 구하시오
import sys

n = int(sys.stdin.readline().rstrip())
l = list(map(int, sys.stdin.readline().split()))
l.sort()

cnt = 0 #명수
sum = 0 #총 그룹수

#i는 공포 기준값(인원체크)
for i in l:
    cnt +=1 #첫번째 참가자
    if cnt >= i: #인원넉넉. 공포수만큼 넉넉히 있음.
        sum += 1
        cnt = 0 #그룹 빠져나갔으니 초기화
       
print(sum)

'CS > 알고리즘' 카테고리의 다른 글

[알고리즘] DFS/BFS  (0) 2022.06.26
[알고리즘] 구현 알고리즘  (0) 2022.06.25
[백준] 11000  (0) 2022.06.22
[백준] 1783  (0) 2022.06.20
[알고리즘] 용어, 우선순위 큐, 트리  (0) 2022.06.20