BOJ/πŸ₯ˆ

β˜…Greedy Upper-Intermediate I - 8 Solved()β˜…

metamong 2023. 1. 27.

πŸ¦’ 문제 자체의 졜적의 μ†”λ£¨μ…˜


β˜… 11497 ν†΅λ‚˜λ¬΄ κ±΄λ„ˆλ›°κΈ° β˜…

 

πŸ¦’ 문제λ₯Ό μ΄ν•΄ν•˜κ³  ideaλ₯Ό μƒκ°ν•˜λŠ” 게 μ€‘μš”!

 

πŸ¦’ μΈμ ‘ν•œ 두 ν†΅λ‚˜λ¬΄ 높이 차의 μ΅œλŒ“κ°’μ„ μ΅œμ†Œν™”ν•˜λŠ” 문제

β‘  즉, μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄μ„œλŠ” μΈμ ‘ν•œ 두 ν†΅λ‚˜λ¬΄κ°„μ˜ 높이 μ°¨κ°€ μ΅œμ†Œν™”λ˜μ–΄μ•Ό ν•œλ‹€

β‘‘ μ„œλ‘œκ°„μ˜ 높이 μ°¨λ₯Ό μ΅œμ†Œν™”ν•˜λ €λ©΄, κ°€μž₯ 큰 ν†΅λ‚˜λ¬΄λΆ€ν„° μˆœμ„œλŒ€λ‘œ $h_1, h_2, h_3, h_4, .... h_n$으둜 μ •λ ¬ν•œ λ’€, $h_1$을 정쀑앙에, κ·Έ λ‹€μŒ $h_2, h_3$λ₯Ό μ–‘μ˜†μ—, $h_4, h_5$λ₯Ό κ·Έ λ‹€μŒ μ–‘ μ˜†μ— μ°¨λ‘€λŒ€λ‘œ λ°°μΉ˜ν•˜λ©΄, μ„œλ‘œ κ°„μ˜ 높이 μ°¨λ₯Ό μ΅œμ†Œν™”ν•  수 μžˆλ‹€.

 

πŸ¦’ greedy의 생λͺ…은 μ‹œκ°„ 단좕! 맀우 λ§Žμ€ 풀이λ₯Ό 보며 μ‹œκ°„ 단좕을 문제의 νŠΉμ„±μ— 맞게 code둜 고쳐가며 μ§„ν–‰ν•΄λ³΄μž

 

- 352ms -

 

β‘  μœ„ 그림에 맞게 제일 높은 ν†΅λ‚˜λ¬΄λ₯Ό κ°€μš΄λ° 쀑심, κ·Έ μ–‘ μ˜†μ— κ·Έ λ‹€μŒ 높은 ν†΅λ‚˜λ¬΄ 2개, 이런 μˆœμ„œλ‘œ μ–‘ μ˜†μœΌλ‘œ λ»—μ–΄κ°€λ©° λ§Œλ“€μ–΄λ³΄κΈ°

slicing기법 μ‚¬μš©

λ¨Όμ € μ •λ ¬ ν›„ step 2μ”© 밟으며 제일 높은 ν†΅λ‚˜λ¬΄κΉŒμ§€ μ •λ ¬ν•œ λ’€, λ‹€μ‹œ 처음 μœ„μΉ˜λ₯Ό ν–₯ν•΄ step 2μ”© 밟으며 λ‚˜λ¨Έμ§€ ν†΅λ‚˜λ¬΄ μ •λ ¬

(κ°œμˆ˜κ°€ 홀/짝 여뢀에 따라 λ‚˜λˆ„μ–΄ μ •λ ¬)

 

β‘‘ 이제 λ‹€ μ •λ ¬ν–ˆλ‹€λ©΄, 각 μΈμ ‘ν•œ ν†΅λ‚˜λ¬΄ κ°„μ˜ 높이 μ°¨ abs() μ‚¬μš©ν•΄ 빈 list에 λͺ¨λ“  element 넣은 λ’€, μ΅œλŒ“κ°’ 좜λ ₯

import sys
input=sys.stdin.readline

for _ in range(int(input())):
    N = int(input())
    Lis = list(map(int, input().split()))
    Lis.sort()
    height_diff = []

    if N%2 == 0:
        heights = Lis[::2]+Lis[::-2]
    else:
        heights = Lis[::2]+Lis[-2::-2]
    
    for i in range(len(heights)):
        if i == len(heights) - 1:
            i = -1    
        height_diff.append(max(abs(heights[i]-heights[i+1]), abs(heights[i] - heights[i-1])))
    
    print(max(height_diff)) #μ΅œμ’… 372ms - 효율적 code 더 찾아보기

 

- 236ms -

 

β€» λ³„λ„μ˜ listλ§Œλ“€μ–΄ ν•΄λ‹Ή list의 μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” 것 λ³΄λ‹€λŠ”, μ§€μ†μ μœΌλ‘œ μ΅œλŒ“κ°’μ„ updateν•΄μ„œ λ³€μˆ˜κ°’μ„ 좜λ ₯ν•˜λŠ”κ²Œ 더 빠름

import sys
input=sys.stdin.readline

for _ in range(int(input())):
    N = int(input())
    Lis = list(map(int, input().split()))
    Lis.sort()

    if N%2 == 0:
        heights = Lis[::2]+Lis[::-2]
    else:
        heights = Lis[::2]+Lis[-2::-2]

    ans = abs(heights[0]-heights[-1])

    for i in range(N):
        ans = max(ans, abs(heights[i]-heights[i-1]))
    print(ans)

 

- 148ms -

 

β€» μœ„ 그림의 μΈμ ‘ν•œ 두 ν†΅λ‚˜λ¬΄μ˜ μ°¨μ΄λŠ” 결과적으둜 slicing 진행 없이, ν˜„μž¬ ν†΅λ‚˜λ¬΄μ™€ 두 step 떨어진 ν†΅λ‚˜λ¬΄μ™€μ˜ 높이 μ°¨μ΄μ΄λ―€λ‘œ  μ •λ ¬ ν›„ λ‹¨μˆœνžˆ index둜 2 떨어진 만큼의 차이λ₯Ό κ΅¬ν•˜λ©΄ λœλ‹€. μ—¬κΈ°μ„œ 정렬이 이미 μ§„ν–‰λ˜μ—ˆμœΌλ―€λ‘œ abs() ν•¨μˆ˜ μ‚¬μš© 없이 λ‹¨μˆœνžˆ 큰 λ†’μ΄μ—μ„œ μž‘μ€ 높이λ₯Ό λΉΌλ©΄ λœλ‹€.

β€» μœ„ μ˜ˆμ‹œ) 맨 λ§ˆμ§€λ§‰ 두 ν†΅λ‚˜λ¬΄λŠ” μΈμ ‘ν•œ ν†΅λ‚˜λ¬΄ μ°¨λ₯Ό λΉ„κ΅ν•΄λ΄€μž 이미 μ•žμ—μ„œ λΉ„κ΅λŒ€μƒμ— ν¬ν•¨λ˜κ±°λ‚˜, (예) 5와 6은 μ•žμ„œ 비ꡐ λŒ€μƒμΈ 4와 6보닀 클 μˆ˜κ°€ μ—†μœΌλ―€λ‘œ 배제. 즉 1λΆ€ν„° 4κΉŒμ§€λ§Œ, 1λΆ€ν„° n-2κΉŒμ§€λ§Œ step 2 간격 diff μ΅œλŒ“κ°’ update

import sys
input=sys.stdin.readline

for _ in range(int(input())):
    N = int(input())
    Lis = sorted(list(map(int, input().split())))
    print(max([Lis[i+2]-Lis[i] for i in range(N-2)]))


β˜… 9440 숫자 λ”ν•˜κΈ° β˜…

 

import sys
input=sys.stdin.readline
import math

while 1:
    l=list(map(int,input().split()))
    
    N=l[0]
    
    if N==0:break

    numbers=l[1:]
    numbers.sort()

    without_zeros=[i for i in numbers if i!=0]

    ans = 0

    for i in range(N):
        digits=10**(math.ceil((N-i)/2)-1)

        if i==0 or i==1:
            n=without_zeros[0]
            ans+=digits*n
            without_zeros=without_zeros[1:]
            numbers.remove(n)

        else:
            ans+=digits*numbers[0]
            numbers=numbers[1:]

    print(ans)

 

πŸ¦’ greedyν•˜κ²Œ, κ°€μž₯ μž‘μ€ μˆ˜λΆ€ν„° κ°€μž₯ 큰 μžλ¦¬μˆ˜λΆ€ν„° μ°¨λ‘€λŒ€λ‘œ λ°°μ—΄ν•œ λ‹€μŒ, λ”ν•˜λ©΄ 끝

 

πŸ¦’ 단, 두 수 각각 맨 μ•žμžλ¦¬μ— 0이 올 수 μ—†μŒ

→ 전체 N개의 μˆ«μžκ°€ μžˆμœΌλ―€λ‘œ, 이λ₯Ό range() 문으둜 돌렀, 첫 숫자 & 두 번째 숫자의 경우 0을 μ œμ™Έν•œ μ΅œμ†Œλ₯Ό κ΅¬ν•˜κ³ , μ΄ν›„λŠ” κ·Έμ € μ΅œμ†Ÿκ°’μ„ μžλ¦¬μˆ˜μ™€ κ³±ν•œ 값을 total λ³€μˆ˜μ— 계속 add up

→ 이 λ•Œ, 두 수의 μžλ¦¬μˆ˜κ°€ λ˜‘κ°™μ€ μˆ«μžλ“€μ˜ 경우, μ„œλ‘œ 숫자 μžλ¦¬κ°€ λ°”λ€Œμ–΄λ„ 상관 μ—†λ‹€. κ·Έμ € μ„œλ‘œ λ”ν•œ λ‹€μŒ, ν•΄λ‹Ή 10의 자리수λ₯Ό κ³±ν•œ 값을 add up

 

β€» 정리)

β‘  without_zerosμ—μ„œ 맨 μ•žμ˜ 두 개 숫자 선택 - digits에 κ³±

β‘‘ κ·Έ λ‹€μŒλΆ€ν„°λŠ” numbersμ—μ„œ 맨 μ•žμ˜ 숫자 계속 선택 - digits에 κ³±

 

(math.ceil(N-i/2)-1이 10의 자릿수)

 

β€» μΆ”κ°€) str()에 숫자 μΆ”κ°€ → ν•œ 번의 int()둜 자릿수 계산 없이 숫자 ν˜•μ„± β€»

while True:
    n = input()
    if n == '0': break
    li = sorted(n.split()[1:])
    num1, num2 = str(), str()
    for i in range(len(li)):
        if li[i] != '0':
            num1, num2 = li[i], li[i + 1]
            li = li[:i] + li[i + 2:]
            break
    for i in range(0, len(li), 2):
        num1 += li[i]
        if i < len(li) - 1:
            num2 += li[i + 1]

    print(int(num1) + int(num2))

β˜… 1541 μžƒμ–΄λ²„λ¦° κ΄„ν˜Έ β˜…

 

import sys
input=sys.stdin.readline


def split_and_calculate(exp,sign):
    l = list(exp.split(sign))
    ans = int(l[0])

    for number in l[1:]:
        if sign == '+':
            ans += int(number)
        else:
            ans -= int(number)
    return ans

exp=input().rstrip()

if '+' not in exp: #only consists of '-'
    print(split_and_calculate(exp,'-'))
elif '-' not in exp: #only consists of '+'
    print(split_and_calculate(exp,'+'))
else: #'+' and '-'
    l = list(exp.split('-'))
    if '+' in l[0]:
        ans = split_and_calculate(l[0],'+')
    else:
        ans = int(l[0])

    for small_exp in l[1:]:
        if '+' in small_exp:
            ans -= split_and_calculate(small_exp,'+')
        else:
            ans -= int(small_exp)
    print(ans)

 

πŸ¦’ 문제 상황은 크게 μ„Έ κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

β‘  +둜만 κ΅¬μ„±λœ 식

β‘‘ -둜만 κ΅¬μ„±λœ 식

β‘’ +와 -κ°€ 같이 μ‘΄μž¬ν•˜λŠ” 식

 

πŸ¦’ β‘ β‘‘ + λ˜λŠ” -둜만 이루어진 식은 κ²°κ³Όκ°€ μ΅œμ†Œκ°€ 되게 ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ·Έμ € κ΄„ν˜Έμ˜ μ‚¬μš© 없이 κ·ΈλŒ€λ‘œ μ—°μ‚°ν•΄μ£Όλ©΄ λœλ‹€.

→ + 둜만 이루어진 식은 κ΄„ν˜Έλ₯Ό 쳐도 μ–΄μ°¨ν”Ό μˆ˜κ°€ 계속 λ”ν•΄μ§€λ―€λ‘œ κ²°κ³Ό 변동 x

→ -둜만 이루어진 식은 κ΄„ν˜Έλ₯Ό μΉ  경우 -κ°€ -와 λ§Œλ‚˜ +κ°€ λ˜μ–΄ 였히렀 더 μ»€μ§€λ―€λ‘œ κ΄„ν˜Έ μ‚¬μš© 없이 κ·ΈλŒ€λ‘œ μ—°μ‚°ν•΄μ•Ό μ΅œμ†Ÿκ°’μ΄ λ‚˜μ˜¨λ‹€.

 

πŸ¦’ β‘’ +와 -κ°€ 같이 μ‘΄μž¬ν•˜λŠ” 경우, μ΅œλŒ€ν•œ +μžˆλŠ” 식듀을 λ‹€ 더해 μ•žμ— -κ°€ μžˆμ„ λ•Œ + κΈ°ν˜Έλ“€μ˜ κ²°κ³Όλ₯Ό ν•œ λ²ˆμ— λΉΌμ€˜μ•Ό μ΅œμ†Ÿκ°’μ΄ λ‚˜μ˜¨λ‹€.

→ λ¨Όμ € -λ₯Ό κΈ°μ€€μœΌλ‘œ split() ν•œ λ‹€μŒ, + 결과듀이 λͺ¨μΈ element의 κ²°κ³Όκ°€ λͺ¨μ΄λ©΄ 첫 λ²ˆμ§ΈλΆ€ν„° μ‹œμž‘ν•΄μ„œ μ­‰ λΉΌμ£Όλ©΄ λœλ‹€.


β˜… 1931 νšŒμ˜μ‹€ λ°°μ • β˜…

 

import sys
input=sys.stdin.readline

N=int(input())
meetings=[]

for _ in range(N):
    flag=True
    s,e=map(int,input().split())
    meetings.append((s,e))
meetings.sort(key=lambda a: (a[1],a[0]))

ans = 1
cur = meetings[0][1]
for meeting in meetings[1:]:

    if cur <= meeting[0]:
        ans += 1
        cur = meeting[1]

print(ans)

 

πŸ¦’ μ–΄λ €μšΈμˆ˜λ‘ μ΅œλŒ€ν•œ κ°„λ‹¨ν•˜κ²Œ μƒκ°ν•˜μž. λ‚΄κ°€ 회의λ₯Ό ν˜„μž¬ ν•˜κ³  μžˆκ±°λ‚˜ / ν•˜μ§€ μ•Šκ±°λ‚˜ λ‘˜ 쀑 ν•˜λ‚˜μΈλ°, κ·Έ μ–΄λ–€ μƒν™©μ—μ„œλΌλ„ 일단 회의λ₯Ό μž‘μ•„μ•Ό ν•˜λŠ” greedyν•œ μƒν™©μ—μ„œ, 회의의 개수λ₯Ό μ΅œλŒ€ν™”ν• λ €λ©΄ λ‚΄κ°€ μž‘μ„ νšŒμ˜κ°€ 빨리 λλ‚˜μ•Ό ν•œλ‹€.

 

πŸ¦’ κ·Έλ ‡λ‹€λ©΄, λ‹Ήμž₯ 빨리 λλ‚˜λŠ” 회의λ₯Ό μž‘λŠ” 것이 곧 졜적의 ν•΄κ°€ λ˜λŠ” 지 greedy의 정당성을 따져봐야 ν•˜λŠ”λ°,

 

λ‚΄κ°€ 회의λ₯Ό μž‘μ„ λ•Œ μ–΄λ–€ ν•œ 회의λ₯Ό κΈ°μ€€μœΌλ‘œ 무쑰건 μ•„λž˜μ™€ 같이 9κ°€μ§€μ˜ μƒν™©μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

πŸ¦’ λ‚΄κ°€ κ·Έ λ‹€μŒ 회의λ₯Ό κ³ λ₯Ό λ•Œ, ν•œ 개의 회의λ₯Ό κΈ°μ€€μœΌλ‘œ μ‹œμž‘κ³Ό 끝이 각각 크고 μž‘κ³  같은 지 3 x 3 κ²°κ³Ό 9개의 경우의 μˆ˜κ°€ μžˆλ‹€.

β˜… greedyλ₯Ό 증λͺ…ν•˜λ €λ©΄ 무쑰건 λͺ¨λ“  경우의 수λ₯Ό 따지고 greedyν•˜κ²Œ 골라야 ν•œλ‹€ β˜… 이 λ•Œ μ‹œμž‘κ³Ό 끝이 λͺ¨λ‘ 같은 건 μ€‘λ³΅λ˜λ―€λ‘œ μ œμ™Έ. λͺ¨λ“  μƒν™©μ—μ„œ 총 8개의 후보 회의λ₯Ό λ§ˆμ£Όν•˜κ²Œ λœλ‹€.

 

β‘  λ¨Όμ €, κΈ°μ€€νšŒμ˜λ³΄λ‹€ 늦게 λλ‚˜λŠ” (2) / (4) / (8)은 μ œμ™Έ. κΈ°μ€€ 회의 뒀에 μΆ”κ°€ νšŒμ˜κ°€ μžˆμ„ 수 μžˆμ–΄μ„œ μΉ΄μš΄νŠΈκ°€ 더 될 κ°€λŠ₯성이 있기 λ•Œλ¬Έ.

β‘‘ κΈ°μ€€νšŒμ˜μ™€ (5) / (6)도 μ œμ™Έ. (1) (3) (7) 회의 뒀에 μΆ”κ°€ νšŒμ˜κ°€ μžˆμ„ 수 μžˆμœΌλ―€λ‘œ μ—­μ‹œ μΉ΄μš΄νŠΈκ°€ 더 될 수 μžˆμ–΄μ„œ μ œμ™Έ

 

πŸ¦’ λ”°λΌμ„œ, μš°λ¦¬λŠ” 회의의 λλ‚˜λŠ” μ‹œκ°„μ„ μ •λ ¬ν•΄ κ°€μž₯ λ¨Όμ € λλ‚˜λŠ” (1) (3) (7) 회의λ₯Ό 무쑰건 선택해야 함을 μ•Œ 수 μžˆλ‹€. 이 λ•Œ, (1) (3) (7) μ„Έ 개 회의의 μ‹œμž‘ μ‹œκ°„μ΄ λͺ¨λ‘ λ‹€λ₯Έλ°, μ• μ΄ˆμ— μ•žμ— 회의λ₯Ό λͺ¨λ‘ μ„ νƒν–ˆκ³  κ·Έ λ‹€μŒ 회의λ₯Ό κ³ λ₯΄λŠ” 상황이라 μ‹œμž‘ μ‹œκ°„ μˆœμ„œλŠ” λ¬΄λ°©ν•˜λ‹€. λλ‚˜λŠ” μ‹œκ°„μ΄ 무쑰건 λΉ λ₯΄κΈ°λ§Œ ν•˜λ©΄ λ˜λŠ” 것이닀. (greedy)

 

πŸ¦’ (+μ˜ˆμ™Έ) λ§Œμ•½ (9, 9) (1, 9)κ°€ μ„ νƒλ˜μ—ˆλ‹€λ©΄ (1,9)κ°€ μ„ νƒλ˜μ§€ μ•ŠμœΌλ―€λ‘œ μ‹œμž‘μ‹œκ°„ = λλ‚˜λŠ” μ‹œκ°„μΈ 회의λ₯Ό μΆ”κ°€λ‘œ κ³ λ €ν•΄ λλ‚˜λŠ” μ‹œκ°„μ„ μ •λ ¬ν•œ λ‹€μŒ, μ‹œμž‘ μ‹œκ°„μ„ μ •λ ¬ν•˜μž. κ·Έλž˜μ„œ λ² μŠ€νŠΈλŠ” 회의 (1)

 

πŸ¦’ μ½”λ“œ

β‘  lambda둜 ν•œλ²ˆμ— λλ‚˜λŠ” μ‹œκ°„ μ •λ ¬ → μ‹œμž‘ μ‹œκ°„ μ •λ ¬ lambda a: (a[1], a[0])

β‘‘ 첫번째 meeting은 카운트 ν•œ μƒνƒœμ—μ„œ ν˜„μž¬ meeting의 λλ‚˜λŠ” μ‹œκ°„μ„ cur λ³€μˆ˜λ‘œ 두고 κ·Έ λ‹€μŒ meetingλΆ€ν„° meeting의 μ‹œμž‘ μ‹œκ°„μ΄ λλ‚˜λŠ” μ‹œκ°„λ³΄λ‹€ ν¬κ±°λ‚˜ 같은 지 계속 ν™•μΈν•˜λ©΄μ„œ cur λ³€μˆ˜μ— λ‹€μŒ 올 meeting의 λλ‚˜λŠ” μ‹œκ°„μ„ updateν•˜λ©° meeting 개수 update


β˜… 20117 호반우 μƒμΈμ˜ μ΄μƒν•œ ν’ˆμ§ˆ 계산법 β˜…

 

🧍‍♂️ greedy 관점 뢄석

: κ°œλ³„ 상황) 각 ν˜Έλ°˜μš°λ³„λ‘œ 묢을 지 / λ˜λŠ” κ°œλ³„λ‘œ 진행할 지 선택

: μ’…ν•© 상황) 묢음 λ˜λŠ” κ°œλ³„ 호반우의 ν’ˆμ§ˆμ„ λͺ¨λ‘ λ”ν•˜κΈ° / μ΅œμ μ˜ μ’…ν•© 상황) ν’ˆμ§ˆ μ΅œλŒ“κ°’ κΊΌλ‚΄κΈ°

 

β˜… 졜적의 μ’…ν•© 상황은 졜적의 κ°œλ³„ μƒν™©μ˜ λͺ¨μŒμœΌλ‘œ λ§Œλ“€ 수 있고, κ°œλ³„ μƒν™©μ˜ 졜적 greedy μ†”λ£¨μ…˜μ€ μ •λ ¬ν•œ λ’€ (1번째 큰 것, 1번째 μž‘μ€ 것) (2번째 큰 것, 2번째 μž‘μ€ 것), 이런 순으둜 (i번째 큰 것, i번째 μž‘μ€ 것) / ν™€μˆ˜ 개수면 쀑앙 호반우 κ°œλ³„ 1개

 

: κ°€μž₯ μž‘μ€ μˆ˜κ°€ μ΅œλŒ“κ°’μœΌλ‘œ λ‹Ήμž₯ λ°”λ€Œκ³ , 이후 κ·Έ λ‹€μŒ μ΅œλŒ“κ°’μ΄ κ·Έ λ‹€μŒ μ΅œμ†Ÿκ°’μœΌλ‘œ λ°”λ€Œλ©΄μ„œ μ§„ν–‰λ˜μ–΄μ•Ό μ΅œλŒ“κ°’μ΄ λ‚˜μ˜¨λ‹€. μ΅œλŒ“κ°’μ„ ν˜„μž¬μ˜ μ΅œμ†Ÿκ°’μœΌλ‘œ λ°”κΏ”μ£ΌλŠ”κ²Œ μ΅œμ„ μ˜ 상황. 그게 μ•„λ‹ˆλΌ μ—¬λŸ¬ 개둜 λ¬ΆλŠ”λ‹€λ©΄ μ΅œλŒ€ / μ΅œμ†Œκ°€ μ•„λ‹Œ μˆ˜κ°€ μ„œλ‘œ λ°”λ€” 경우 κ·Έ μ‚¬μ΄μ˜ μ°¨μ΄λŠ” μ΅œλŒ“κ°’-μ΅œμ†Ÿκ°’ 차이보닀 무쑰건 μž‘κΈ° λ•Œλ¬Έμ— μ΅œμ„ μ˜ 상황이 μ•„λ‹˜


β˜… 1946 μ‹ μž… 사원 β˜…

 

import sys
input=sys.stdin.readline
for _ in range(int(input())):
    N=int(input())
    l=[]
    for _ in range(N):
        a,b=map(int,input().split())
        l.append((a,b))
    l.sort()
    ans,cur=N,l[0][1]
    for pair in l[1:]:
        if pair[1]>cur:
            N-=1
        else:
            cur=pair[1]

    print(N)

 

🧍‍♂️ greedy 관점 뢄석

: κ°œλ³„ 상황) 각 사원 성적을 λ³΄λ©΄μ„œ 두 μ˜μ—­ λͺ¨λ‘ μˆœμœ„κ°€ λ–¨μ–΄μ§€λŠ” 사원이면 μ œμ™Έ

: μ’…ν•© 상황) λͺ¨λ‘ μ œμ™Έν•˜κ³  남은 μ‹ μž…μ‚¬μ›λ“€ / μ΅œμ μ˜ μ’…ν•© 상황) μ΅œλŒ€λ‘œ μ„ λ°œν•  수 μžˆλŠ” 남은 μ‹ μž…μ‚¬μ›λ“€ λͺ…μˆ˜

 

β˜… 졜적의 μ’…ν•© 상황은 졜적의 κ°œλ³„ μƒν™©μ˜ λͺ¨μŒμœΌλ‘œ λ§Œλ“€ 수 있고, κ°œλ³„ μƒν™©μ˜ 졜적 greedy μ†”λ£¨μ…˜μ€ λ¨Όμ € μ„œλ₯˜μ‹¬μ‚¬ 성적 순으둜 1μœ„λΆ€ν„° μ •λ ¬ν•œ λ’€ λ©΄μ ‘ μ„±μ λ§Œ μ΄μš©ν•΄μ„œ μ•žμ„  μ‹ μž…μ‚¬μ› μ΅œκ³ μˆœμœ„λ³΄λ‹€λ„ λͺ»ν•œ μˆœμœ„λΌλ©΄ 1λͺ…μ”© μ œμ™Έ: 즉 cur λ³€μˆ˜λ‘œ ν˜„μž¬ 졜고 μˆœμœ„λ₯Ό updateν•΄κ°€λ©° ν˜„μž¬ μ΅œκ³ μˆœμœ„λ³΄λ‹€ λͺ»ν•œ μˆœμœ„λ©΄ μ œμ™Έ. 더 λ‚˜μ€ μˆœμœ„λ©΄ cur update


β˜… 1449 수리곡 ν•­μŠΉ β˜…

 

import sys
input=sys.stdin.readline
cnt=0
N,L=map(int,input().split())
spots=sorted(list(map(int,input().split())))
ans,start=1,spots[0]-0.5

for spot in spots:
    if (spot+0.5-start)>L:
        start=spot-0.5
        ans+=1
print(ans)

 

🧍‍♂️ greedy 관점 뢄석

: κ°œλ³„ 상황) 물이 μƒˆλŠ” 곳을 ν…Œμ΄ν”„λ‘œ 뢙이기

: μ’…ν•© 상황) 물이 μƒˆλŠ” λͺ¨λ“  곳을 각각 ν…Œμ΄ν”„λ‘œ λΆ™μž„ / μ΅œμ μ˜ μ’…ν•© 상황) 뢙인 ν…Œμ΄ν”„ 개수 μ΅œμ†Ÿκ°’

 

β˜… 졜적의 μ’…ν•© 상황은 졜적의 κ°œλ³„ μƒν™©μ˜ λͺ¨μŒμœΌλ‘œ λ§Œλ“€ 수 있고, κ°œλ³„ μƒν™©μ˜ 졜적 greedy μ†”λ£¨μ…˜μ€ 맀 leak 끝뢀뢄과 ν˜„ start 지점 μ‚¬μ΄μ˜ 값이 ν…Œμ΄ν”„ 길이 L을 λ„˜λŠ” 지 맀번 ν™•μΈν•˜κ³  λ„˜μœΌλ©΄ 일단 ν…Œμ΄ν”„ 1개 ν•„μš”ν•˜λ―€λ‘œ 1 카운트 / μ–΄μ°¨ν”Ό ν…Œμ΄ν”„λŠ” μ •μˆ˜ +- 0.5 지점에 μ‹œμž‘ν•˜κ±°λ‚˜ λ©ˆμΆ”λ―€λ‘œ ν˜„ leak μ‹œμž‘λΆ€λΆ„μ„ start둜 μ„€μ •

 

β˜… 심화 greedy: 일단 ν…Œμ΄ν”„κ°€ 더 ν•„μš”ν•œ 상황이면 λ°”λ‘œ +1둜 λˆ„μ ν•΄ λ‚˜κ° (μ–΄λ €μš΄ λ‹€μ–‘ν•œ 상황 κ³ λ € 없이 μ–΄μ©” 수 μ—†λŠ” 상황 1개만 λ§Œλ“€μ–΄μ„œ κ·ΈλŒ€λ‘œ 카운트)


β˜… 30022 행사 μ€€λΉ„ β˜…

 

🧍‍♂️ 각 물건이 A 상점 λ˜λŠ” B 상점에 μžˆλŠ”λ° 두 상점 쀑 ν•œ 곳을 선택. 이 λ•Œ 각 상점별 μ‚¬μ•Όν•˜λŠ” ν’ˆλͺ©μ˜ κ°œμˆ˜λŠ” μ •ν•΄μ Έ μžˆμœΌλ―€λ‘œ, greedy의 핡심은 일단 상점 κ°„μ˜ 가격 μ°¨κ°€ 큰 κ³³λΆ€ν„° 점령 → νŠΉμ • μƒμ μ˜ ν’ˆλͺ© κ°œμˆ˜κ°€ λ‹€λ‹€λ₯΄λ©΄ κ·Έ λ•ŒλŠ” λ‹€λ₯Έ 상점 점령

 

import sys
input=sys.stdin.readline

N,A,B=map(int,input().split())
total=0
diff=[]
l1,l2=[],[]
for _ in range(N):
    a,b=map(int,input().split())
    l1.append(a)
    l2.append(b)
combined = [(l1[i], l2[i]) for i in range(N)]
combined.sort(key=lambda x: abs(x[0] - x[1]),reverse=True)
for x in combined:
    if (x[0]-x[1])>0:
        if B > 0:
            B-=1
            total+=x[1]
        else:
            A-=1
            total+=x[0]
    else:
        if A > 0:
            A-=1
            total+=x[0]
        else:
            B-=1
            total+=x[1]
print(total)

 

β˜… 두 μˆ˜κ°„μ˜ 차둜 μ •λ ¬ν•œ λ’€(lambda μ‚¬μš©), 각 μƒμ μ˜ ν’ˆλͺ© κ°œμˆ˜κ°€ λ‹€λ‹€λžλŠ”μ§€μ— 따라 κ²°μ • → μ§„ν–‰ν•˜λ©΄ 끝!


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

λŒ“κΈ€