본문 바로가기
알고리즘

코테 공부- 그리디 알고리즘

by Rudy 2021. 7. 3.

1. 거스름돈 세기

#거스름돈 세기: 그리디 알고리즘

n=1260 #현재 남아있는 잔돈, 나누어야 하는 잔돈
count=0

# 큰 단위의 화폐부터 차례대로 확인하는 그리디 알고리즘 적용

coin=[500,100,50,10] #500원, 100원, 50원, 10원

for num in coin: #coin의 각 항목 num에 대하여
  count+=n//num # 해당하는 화폐로 거슬러 줄 수 있는 동전의 갯수를 센다.
  n%=num

print(count)

 

 

2. 큰 수의 법칙 - 일반적인 방법

#큰 수의 법칙

#N,M,K를 공백으로 구분하여 입력받기
n,m,k=map(int,input().split())
#N개의 수를 공백으로 구분하여 입력받기
#여기서 N는 배열의 크기이고, M은 숫자가 더해지는 횟수, K는 연속해서 더해질 수 있는 한계값이다.
data=list(map(int,input().split()))

data.sort() #입력받은 수를 오름차순으로 정렬한다.

first=data[n-1] #가장 큰 수
second=data[n-2] #두 번째로 큰 수

result=0 #result값 초기화

while True:
  for i in range(k): # 가장 큰 수를 K번 더한다.
    if m==0:
     break #m이 0이 되면 반복문을 빠져나간다.
    result+=first
    m-=1
  if m==0:
   break #m이 0이 되면 반복문을 빠져나간다.
  result+=second 
  m-=1

print(result)

 

3. 큰 수의 법칙- 시간복잡도가 적은 방법

 

#큰 수의 법칙
#N,M,K를 공백으로 구분하여 입력받기
#여기서 N=배열의 크기, M=숫자가 더해지는 횟수, K=연속으로 더해질 수 있는 한계값

n,m,k=map(int,input().split())
# N개의 수를 공백으로 구분하여 입력받기
data=list(map(int,input().split()))

data.sort() #입력받은 수를 정렬한다.

first=data[n-1] #가장 큰 수
second=data[n-2] #두 번째로 큰 수

#가장 큰 수가 더해지는 횟수를 계산한다.
count=int(m/(k+1))*k
count+=m%(k+1)

result=0
result+=(count)*first #가장 큰 수를 더한다.
result+=(m-count)*second #두 번째로 큰 수를 더한다.

print(result)

4. 숫자 카드 게임 

#숫자 카드 게임

#N, M을 공백으로 구분하여 입력받기
#여기서 N=행의 개수, M=열의 개수
n,m=map(int,input().split())

result=0

#한 줄씩 입력받아서 확인한다.
for i in range(n):
  data=list(map(int,input().split()))
  #현재 줄에서 가장 작은 수를 찾는다.
  min_value=min(data)
  #가장 작은 수들 중에서 가장 큰 수를 찾는다.
  result=max(result,min_value)

print(result)
#숫자 카드 게임

#N, M을 공백으로 구분하여 입력받기
#여기서 N=행의 개수, M=열의 개수
n,m=map(int,input().split())

result=0

#한 줄씩 입력받아서 확인한다.
for i in range(n):
  data=list(map(int,input().split()))
  #현재 줄에서 가장 작은 수를 찾는다.
  min_value=10001
  for a in data:
    min_value=min(min_value,a)
  #가장 작은 수 중에서 가장 큰 수를 찾는다.
  result=max(result,min_value)

print(result)

 

5. 1이 될 때까지

#1이 될 때까지
#단순하게 푸는 답안
n,k=map(int,input().split())
result=0

#N이 K이상이라면 K로 계속 나눈다.
while n>=k:
  #N이 K로 나누어 떨어지지 않으면 N에서 1씩 뺀다.
  while n%k!=0:
    n-=1
    result+=1
  #K로 나눈다.
  n//=k
  result+=1

#마지막으로 남은 수에 대하여 1씩 뺀다.
while n>1:
  n-=1
  result+=1

print(result)
#1이 될 때까지
#빠른 답안

#N,K를 공백으로 구분하여 입력받기
n,k=map(int,input().split())
result=0

while True:
  #(N==K로 나누어 떨어지는 수)가 될 때까지 1씩 뺀다.
  count=(n//k)*k
  result+=(n-count)
  n=count
  #N이 K보다 작을 때(더 이상 나눌 수 없을 때) 반복문을 빠져 나간다.
  if n<k:
    break
  #남은 수를 K로 바로 나눈다.
  result+=1
  n//=k

#마지막으로 남은 수에 대하여 1씩 뺀다.
result+=(n-1)

print(result)

 

 

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

프로그래머스-폰켓몬  (0) 2022.05.26
프로그래머스-신규 아이디 추천  (0) 2022.05.25
[프로그래머스] 로또의 최고 순위와 최저 순위  (0) 2022.05.17
DFS/BFS  (0) 2021.07.06
구현  (0) 2021.07.05

댓글