BOJ/πŸ₯‰

β˜…Greedy Beginner I - 9 Solved()β˜…

metamong 2022. 12. 2.

β˜… 10162 μ „μžλ ˆμΈμ§€ β˜…

 

T=int(input())
a=T//300
flag=0
for i in range(a,-1,-1):
    after_A=T-i*300
    b=after_A//60
    for j in range(b,-1,-1):
        after_B=after_A-j*60
        if after_B%10==0:
            flag+=1
            k=after_B//10
            print(i,j,k)
            break
    if flag==1:
        break
if flag==0:print(-1)

 

πŸ‡ greedy 관점 뢄석

: κ°œλ³„ 상황) A / B / C λ²„νŠΌμ„ λˆ„λ₯΄λŠ” 상황

: μ’…ν•© 상황) A / B / C λ²„νŠΌμ„ μ—¬λŸ¬ 번 눌러 T time에 λ”± 맞게 μš”λ¦¬ν•˜κΈ°

 

β˜… 졜적의 μ’…ν•© 상황은 졜적의 κ°œλ³„ μƒν™©μ˜ λͺ¨μŒμœΌλ‘œ λ§Œλ“€ 수 있고, κ°œλ³„ μƒν™©μ˜ 졜적 greedy μ†”λ£¨μ…˜μ€ Aλ²„νŠΌμ„ μš°μ„ μ μœΌλ‘œ → Bλ²„νŠΌ → Cλ²„νŠΌμ„ λˆ„λ₯Έλ‹€. (μ‹œκ°„ νš¨μœ¨μ„ μœ„ν•΄ κ΅¬ν•˜λ©΄ λ°”λ‘œ breakλ¬Έ)

 

πŸ‡ λ¨Όμ € 300초둜 λ‚˜λˆ μ§„λ‹€λ©΄, κ·Έλ‹€μŒ 100초둜 λ‚˜λˆ μ§€λŠ” 지 ν™•μΈν•˜κ³ , λ§ˆμ§€λ§‰μœΌλ‘œ 10으둜 λ‚˜λˆ μ§€λŠ” 지 μ°¨λ‘€λŒ€λ‘œ 확인. 

→ greedyν•œ λ¬Έμ œμ΄λ―€λ‘œ, 300초둜 λ‚˜λˆˆ λͺ«μ΄ 큰 것뢀터 0κΉŒμ§€ 거꾸둜 μ°¨λ‘€λŒ€λ‘œ ν™•μΈν•˜λ‹€κ°€ 닡이 λ‚˜μ˜€λ©΄ print()ν•˜κ³  λ°”λ‘œ break!


β˜… 3578 Holes β˜…

 

h=int(input())
if h==0:print(1)
elif h==1:print(0)
else:
    if h%2==0:print('8'*(h//2))
    else:print('4'+'8'*(h//2))

 

πŸ‡ greedy 관점 뢄석 (κ°œλ³„ 상황이 λΆ„κΈ°λ¬ΈμœΌλ‘œ λ‚˜λˆ„μ–΄μ§)

: κ°œλ³„ 상황) hole을 λ§Œλ“€κΈ° μœ„ν•΄ 0/4/6/9/8쀑 ν•œ 개 숫자λ₯Ό λˆ„λ₯΄λŠ” 상황

: μ’…ν•© 상황) 숫자λ₯Ό μ—¬λŸ¬ 번 눌러 λ§Œλ“  μˆ«μžκ°€ μ΅œμ†Ÿκ°’μœΌλ‘œ λ‚˜μ˜€κ³  / λˆ„λ₯΄λŠ” 개수 hκ°€ μ΅œμ†Ÿκ°’μ΄ λ˜κ²Œλ” λ§Œλ“€κΈ°

 

β˜… 졜적의 μ’…ν•© 상황은 졜적의 κ°œλ³„ μƒν™©μ˜ λͺ¨μŒμœΌλ‘œ λ§Œλ“€ 수 있고

→ κ°œλ³„ μƒν™©μ˜ 졜적 greedy μ†”λ£¨μ…˜: λˆ„λ₯Ό λ•Œ 8을 μš°μ„ μ μœΌλ‘œ λˆ„λ₯΄λ˜, hκ°€ ν™€μˆ˜μΌ 경우 4λ₯Ό λ¨Όμ € λˆ„λ₯΄κ³  이후 8 λˆ„λ₯΄κΈ° (hκ°€ 0κ³Ό 1만 μ˜ˆμ™Έ)

 

πŸ‡ ꡬ멍이 μƒκΈ°λŠ” 숫자 0,4,6,9,8의 μ‘°ν•©μœΌλ‘œλ§Œ λ§Œλ“€μ–΄μ•Ό ν•˜κ³ , 맨 μ•žμ— 0이 두 번 연속 올 수 μ—†λ‹€.

 

πŸ‡ μ΅œμ†Ÿκ°’μœΌλ‘œ λ§Œλ“€μ–΄μ•Ό ν•˜λ―€λ‘œ μžλ¦Ώμˆ˜κ°€ μ΅œμ†Œμ—¬μ•Ό ν•œλ‹€. λ”°λΌμ„œ 8둜 μ΅œλŒ€ν•œ ꡬ성이 λ˜μ–΄μ•Ό 함 (greedy)

β‘  ν™€μˆ˜κ°œμˆ˜μ˜ hole을 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€λ©΄ 8을 μ΅œλŒ€ν•œ μ±„μš°κ³ , λ§ˆμ§€λ§‰ 개수 1κ°œλŠ” κ°€μž₯ μ΅œμ†Ÿκ°’μΈ 4 - 즉 48888~ ν˜•νƒœμ—¬μ•Ό ν•œλ‹€.

β‘‘ 짝수개수의 hole을 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€λ©΄ 8둜만 κ΅¬μ„±λ˜μ–΄μ•Ό ν•œλ‹€.

β‘’β‘£ hole이 μ—†λ‹€λ©΄ 1, hole이 1개 μžˆλ‹€λ©΄ 1


β˜… 2720 μ„Ένƒμ†Œ 사μž₯ λ™ν˜ β˜…

 

for _ in range(int(input())):
    C=int(input())
    print(C//25,(C%25)//10,((C%25)%10)//5,C%5)

 

πŸ‡ greedy 관점 뢄석

: κ°œλ³„ 상황) μΏΌν„° / λ‹€μž„ / λ‹ˆμΌˆ / νŽ˜λ‹ˆ 쀑 ν•œ ν™”νμ˜ μ’…λ₯˜λ₯Ό 선택해 λˆμ„ 거슬러 μ£ΌλŠ” 상황

: μ’…ν•© 상황) 주어진 λˆμ„ μ—¬λŸ¬ ν™”νλ‘œ 거슬러 μ£ΌλŠ” 상황 / λˆ„λ₯΄λŠ” 개수 hκ°€ μ΅œμ†Ÿκ°’μ΄ λ˜κ²Œλ” λ§Œλ“€κΈ°

 

β˜… 졜적의 μ’…ν•© 상황은 졜적의 κ°œλ³„ μƒν™©μ˜ λͺ¨μŒμœΌλ‘œ λ§Œλ“€ 수 있고

→ κ°œλ³„ μƒν™©μ˜ 졜적 greedy μ†”λ£¨μ…˜: μΏΌν„° - λ‹€μž„ - λ‹ˆμΌˆ - νŽ˜λ‹ˆ 순으둜 λ¨Όμ € μ’…λ₯˜λ₯Ό 선택

 

πŸ‡ λ™μ „μ˜ 개수λ₯Ό μ΅œμ†Œν™” ν•΄μ•Όν•˜λ―€λ‘œ μΏΌν„° - λ‹€μž„ - λ‹ˆμΌˆ - νŽ˜λ‹ˆ 순으둜 greedyν•˜κ²Œ 제일 큰 κΈˆμ•‘λΆ€ν„° 개수λ₯Ό countν•œλ‹€


β˜… 14720 우유 μΆ•μ œ β˜…

 

import sys
input=sys.stdin.readline

N=int(input())
l=list(map(int,input().split()))
t=0
direction=0
for i in l:
    if direction==0 and i==0:
        t+=1
        direction+=1
    elif direction==1 and i==1:
        t+=1
        direction+=1
    elif direction==2 and i==2:
        t+=1
        direction-=2
    
print(t)

 

πŸ‡ greedy 관점 뢄석

: κ°œλ³„ 상황) 각 μš°μœ κ°€κ²Œμ—μ„œ λ”ΈκΈ° / μ΄ˆμ½” / λ°”λ‚˜λ‚˜ / x(μ•ˆ λ§ˆμ‹¬) 쀑 ν•œ 개λ₯Ό 선택해 λ§ˆμ‹œλŠ” 상황

: μ’…ν•© 상황) λͺ¨λ“  μš°μœ κ°€κ²Œμ—μ„œ 각각의 우유λ₯Ό λ‹€μ–‘ν•˜κ²Œ 선택해 λ§ˆμ‹œλŠ” 상황 / λ§ˆμ‹œλŠ” 우유 κ°œμˆ˜κ°€ μ΅œλŒ“κ°’μ΄ λ˜κ²Œλ” λ§Œλ“€κΈ°

 

β˜… 졜적의 μ’…ν•© 상황은 졜적의 κ°œλ³„ μƒν™©μ˜ λͺ¨μŒμœΌλ‘œ λ§Œλ“€ 수 있고

→ κ°œλ³„ μƒν™©μ˜ 졜적 greedy μ†”λ£¨μ…˜: 각 κ°€κ²Œμ—μ„œλŠ” 우유λ₯Ό 1번만 λ§ˆμ‹€ 수 μžˆμœΌλ―€λ‘œ λ§ˆμ‹œλŠ” κ·œμΉ™μ΄ μ„±λ¦½ν•œλ‹€λ©΄ 'λ°”λ‘œ' κ·Έ κ°€κ²Œμ—μ„œ λ§ˆμ‹¬. (Xλ₯Ό μ„ νƒν•˜μ§€ μ•Šκ³  λ§ˆμ‹œλŠ” μ†”λ£¨μ…˜)

 

πŸ‡ λ§ˆμ‹€ 수 μžˆλ‹€λ©΄ λ°”λ‘œ λ§ˆμ‹œλŠ”, greedy μœ ν˜•! direction λ°©ν–₯ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄, direction λ³€μˆ˜μ— λ§žλŠ” 값이라면 λ°”λ‘œ λ§ˆμ‹œκ²Œλ” μ½”λ“œ 짬

 

πŸ‡ λ°©ν–₯λ³€μˆ˜λ₯Ό μ‚¬μš©ν•œ μ½”λ“œ κΈ°μ–΅ν•˜μž!


β˜… 17931 Greedily Increasing Subsequence β˜…

 

import sys
input=sys.stdin.readline
N=int(input())
A=list(map(int,input().split()))
ans=[A[0]]
l=1
cur=A[0]
for ai in A[1:]:
    if ai>cur:
        ans.append(ai)
        l+=1
        cur = ai
print(l)
print(*ans)

 

πŸ‡ greedy 관점 뢄석

: κ°œλ³„ 상황) Subsequenceλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ ν˜„μž¬μ˜ 숫자λ₯Ό subsequence에 넣을 지 μ•ˆ 넣을 지 κ²°μ •ν•˜λŠ” 상황

: μ’…ν•© 상황) Greedily Increasing Subsequenceλ₯Ό λ§Œλ“œλŠ” 상황

 

β˜… 졜적의 μ’…ν•© 상황은 졜적의 κ°œλ³„ μƒν™©μ˜ λͺ¨μŒμœΌλ‘œ λ§Œλ“€ 수 있고

→ κ°œλ³„ μƒν™©μ˜ 졜적 greedy μ†”λ£¨μ…˜: ν˜„μž¬ Cur 값보닀 큰 값이면 subsequence에 λ„£κΈ°λ₯Ό 선택


β˜… 5585 κ±°μŠ€λ¦„λˆ β˜…

 

n=0
money=1000-int(input())
for x in [500,100,50,10,5,1]:
    n+=(money//x)
    money%=x
print(n)

 

πŸ‡ greedyν•˜κ²Œ 큰 화폐 λ‹¨μœ„λΆ€ν„° λ¨Όμ € 카운트. κ·Έλž˜μ•Ό μ΅œμ’… 화폐 지폐 개수 μ΅œμ†Œν™” κ°€λŠ₯


β˜… 4796 μΊ ν•‘ β˜…

 

import sys
input=sys.stdin.readline
i=0
while 1:
    i+=1
    L,P,V=map(int,input().split())
    if (L,P,V)==(0,0,0):break
    print(f'Case {i}: {(V//P)*L+min(L,V%P)}')

 

πŸ‡ greedy 관점 뢄석

: κ°œλ³„ 상황) 각 일수 λ³„λ‘œ 캠핑을 갈 지, 말 지 κ²°μ •

: μ’…ν•© 상황) μΊ ν•‘μž₯을 κ°€λŠ” λ‚  수 총 λ”ν•˜κΈ°

 

β˜… 졜적의 μ’…ν•© 상황은 졜적의 κ°œλ³„ μƒν™©μ˜ λͺ¨μŒμœΌλ‘œ λ§Œλ“€ 수 있고

→ κ°œλ³„ μƒν™©μ˜ 졜적 greedy μ†”λ£¨μ…˜: μΊ ν•‘μž₯ κ°€λŠ” μ΅œλŒ€ 일수(μ΅œλŒ€ν•œ 각 P일 쀑 1일뢀터 LμΌκΉŒμ§€ μ­‰ κ°„ λ‹€μŒ, κ·Έ λ‹€μŒ PμΌμ—μ„œλ„ 1μΌμ—μ„œ LμΌκΉŒμ§€ 갈 수 있게 ν•œλ‹€. 주어진 PμΌμ—μ„œ μ΅œλŒ€ L일을 꽉꽉 μ±„μš°λŠ” 게 각 PμΌμ—μ„œμ˜ greedyν•œ κ²°μ •. ν›„λ°˜μ— κ°„λ‹€λ©΄ λ‹€μŒ PμΌμ—μ„œμ˜ L일과 겹쳐 캠핑을 λͺ» 갈 수 μžˆμœΌλ―€λ‘œ 1일뢀터 λͺ°μ•„ κ°€κ²Œ ν•΄μ•Ό μ΅œλŒ€ L일을 꽉꽉 채움 + λ‚˜λ¨Έμ§€λŠ” L일과 λΉ„κ΅ν•΄μ„œ minκ°’ μΆ”κ°€)


β˜… 2864 5와 6의 차이 β˜…

 

A,B=input().split()

a1,b1=A.replace('6','5'),B.replace('6','5')
a2,b2=A.replace('5','6'),B.replace('5','6')

print(int(a1)+int(b1),int(a2)+int(b2))

 

πŸ‡ greedy 관점 뢄석

: κ°œλ³„ 상황) 5와 6을 λ§Œλ‚˜λ©΄ 각각 5둜 λ°”κΏ€ 지, 6으둜 λ°”κΏ€ 지 κ²°μ •

: μ’…ν•© 상황) 두 수의 ν•©

 

β˜… 졜적의 μ’…ν•© 상황은 졜적의 κ°œλ³„ μƒν™©μ˜ λͺ¨μŒμœΌλ‘œ λ§Œλ“€ 수 있고

→ κ°œλ³„ μƒν™©μ˜ 졜적 greedy μ†”λ£¨μ…˜: μ΅œμ†Ÿκ°’은 λͺ¨λ“  6을 5둜, μ΅œλŒ“κ°’μ€ λͺ¨λ“  5λ₯Ό 6으둜 (replace()둜 ν•œλ²ˆμ—)


β˜… 30019 κ°•μ˜μ‹€ μ˜ˆμ•½ μ‹œμŠ€ν…œ β˜…

 

πŸ‡ ν˜„μž¬ μ‹œμ μ—μ„œ λ‹Ήμž₯ κ°•μ˜κ°€ λ¨Όμ € μ—΄λ¦¬λŠ” κ°•μ˜λ₯Ό μ„ νƒν•˜λ―€λ‘œ greedy적 μ ‘κ·Ό. cur list에 각 κ°•μ˜μ‹€μ˜ 끝 μ‹œκ°„μ„ update. sκ°€ μž„λ°•ν•œ 순으둜 μ£Όμ–΄μ§€λ―€λ‘œ 각 line μ§„ν–‰ν•˜λ©΄μ„œ ν˜„μž¬μ˜ e와 비ꡐ해 YES / NO 좜λ ₯

import sys
input=sys.stdin.readline

N,M=map(int,input().split())
cur = [0 for _ in range(N)]

for _ in range(M):
    k,s,e=map(int,input().split())
    if s >= cur[k-1]:
       print('YES')
       cur[k-1]= e
    else:
        print('NO')

 

 

 

 

 

 

 

 

 

 

 

 

 

 

λŒ“κΈ€