STUDY/algorithm with BOJ

[그리디 알고리즘]

officialhoyoon 2024. 7. 18. 19:50
contents dated
그리디 알고리즘 소개 (바크킹)
backjoon  1931, 2217, 1026 

2024.07.18 

 

 

Greedy =  지금 가장 최적인 답을 근시안 적으로 택하는 알고리즘 

             = 관찰을 통해서  탐색 범위를 줄이는 알고리즘 

 

 

이상적인 알고리즘 풀이

          1. 관찰을 통해 탐색 범위를 줄이는 방법을 고안한다. 

          2. 탐색 범위를 줄여도 올바른 결과를 낸다는 사실을 수학적으로 증명한다. 

          3. 구현해서 문제를 통과한다. 

 

현실적인 알고리즘 풀이 

          1. 관찰을 통해 탐색 범위를 줄이는 방법을 고안한다. 

          2. 탐색 범위를 줄여도 올바른 결과를 낸다는 강한 믿음을 가진다. 

          3. 믿음을 가지고 구현해서 문제를 통과한다. 

 

코딩 테스트에서 추천 전력 

 

        1. 거의 똑같은 문제를 풀어봤거나 간단한 문제여서 나의 그리디 풀이를 100% 확신한다. 

             --> 짜서 제출해보고 틀리면 빠르게 손절 

 

        2. 100% 확신은 없지만 맞는 것 같은 그리디 풀이를 찾았다. 

             --> 일단은 넘어가고 다른 문제를 풀게 없거나 종료가 20~40분 남은 시점에 코딩 시작 

 

 

BOJ1931

import sys 

N = int(sys.stdin.readline())
timeline= []
for i in range(N):
    start, end = map(int, sys.stdin.readline().split())
    timeline.append((start,end))

timeline.sort(key=lambda x : (x[1], x[0]))
count = 1 
end = timeline[0][1]
for i in range(1,N):
    if timeline[i][0]>=end:
        end = timeline[i][1]
        count += 1

print(count)

#lambda의 개념 
#그리디 알고리즘 
#key의 개념

 

 

BOJ 2217

import sys

N = int(input())
list =[]
for i in range(N):
    list.append(int(input()))

list.sort(reverse=True)
result = []

for j in range(N):
    result.append(list[j]*(j+1))

print(max(result))

 

BOJ 1026

import sys  


N= int(input())
first= list(map(int, sys.stdin.readline().split()))
second= list(map(int, sys.stdin.readline().split()))

first.sort()
second.sort(reverse=True)

answer=0
for i in range(N):
    answer+= int(first[i])*int(second[i])

print(answer)