โ 18870 ์ขํ ์์ถ โ
๐จ๐ฝ๐ซ ์ขํ ์์ถ ๊ตฌํ์ ๋จผ์ ์ ๋ ฌ๋ก ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ ๋ค์ → ์ค๋ณต ์ ๊ฑฐ → ๊ทธ๋ฆฌ๊ณ index๋ฅผ ๊ณ์ฐํ๋ 3๊ฐ์ step์ผ๋ก ์งํ
๐จ๐ฝ๐ซ ๋ง์ง๋ง ์ธ ๋ฒ์งธ step์ ์๊ฐ๋จ์ถ์ ์ํด ์ด๋ค ๊ธฐ๋ฒ์ ์ฐ๋ ์ง์ ๋ฐ๋ผ ์ํฉ๋ณ๋ก ์์ ์๊ฐ์ ๋ค๋ฅด๊ฒ ๊ณ์ฐํ ์ ์๋ค.
โ ์ด๋ถํ์ bisect_left() ๊ณ์ฐ ํ์ด
from bisect import bisect_left
import sys
input=sys.stdin.readline
N=int(input())
l=list(map(int,input().split()))
B=sorted(set(l))
ans=[]
for i in l:
ans.append(bisect_left(B,i))
print(*ans)
→ step 1) ์ ๋ ฌ๋ก B[] ์์ฑ: sorted() ์ฌ์ฉ
→ step 2) ์ค๋ณต ์์ ์ ๊ฑฐ: set() ์ฌ์ฉ
→ step 3) ์ด๋ถํ์: bisect_left() ์ฌ์ฉ
โก ์ฌ์ ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ ํ์ด
import sys
input=sys.stdin.readline
N=int(input())
l=list(map(int,input().split()))
B=sorted(set(l))
res={B[i]: i for i in range(len(B))}
for j in l:
print(res[j],end=" ")
→ step 1) ์ ๋ ฌ๋ก B[] ์์ฑ: sorted() ์ฌ์ฉ
→ step 2) ์ค๋ณต ์์ ์ ๊ฑฐ: set() ์ฌ์ฉ
→ step 3) ์ฌ์ ์๋ฃํ dictionary ์ฌ์ฉ
โป ํด๋น ๋ฌธ์ ์ ๊ฒฝ์ฐ ๋ง๋ค์ด์ง ๋ฐฐ์ด B์ index๊ฐ ๊ณง ํด๋น ์๋ณด๋ค ์์ผ๋ฉฐ ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ์๋ค์ ๊ฐ์๋ฅผ ๋ปํ๋ค. ๋ฐ๋ผ์, ์์ B์ index๋ฅผ ๊ฐ๊ฐ key-value ์์ผ๋ก ๋ง๋ res dictionary๋ฅผ ๋ง๋ค์ด, ๋น ๋ฅด๊ฒ dictionary ์ ๊ทผ ํ์ด๋ ๊ฐ๋ฅ
→ Big-O ๋น๊ต
for i in l:
ans.append(bisect_left(B,i))
#--------------------------------
res={B[i]: i for i in range(len(B))}
for j in l:
print(res[j],end=" ")
→ for๋ฌธ ๋๊ณ bisect_left()๋ ์ด์งํ์์ผ๋ก O(logn)๋งํผ์ ์๊ฐ์ด ์์๋๋ฏ๋ก ์ด O(nlogn)
→ ์ญ์ for๋ฌธ ๋๊ณ dictionary indexing ์ ๊ทผ์ O(1)๋งํผ์ ์๊ฐ์ด ์์๋๋ฏ๋ก ์ด O(n)
โ 24035 Impartial Offerings โ
import sys
input=sys.stdin.readline
for k in range(1,int(input())+1):
N=int(input())
A=list(map(int,input().split()))
B=sorted(set(A))
d={B[i]: i+1 for i in range(len(B))}
total=0
for i in A:
total+=(d[i])
print(f'Case #{k}: {total}')
๐จ๐ฝ๐ซ ๋ฌธ์ ์ค๋ช : 10 10 20 25 ๋ผ๋ฉด ์์ ์๋ถํฐ ์ฐจ๋ก๋ก 10 1๊ฐ์ฉ / 20 2๊ฐ์ฉ / 25 3๊ฐ์ฉ = 1 + 1 + 2 + 3 ๊ฒฐ๊ณผ 7
→ ์ ๋ชฉ ๊ทธ๋๋ก ๋ถ๊ณตํ(impartially)ํ๊ฒ ์์ gift ๋ฅผ ์ ๊ฒ 1, ๊ทธ ๋ค์ ํฐ gift 2, ๊ทธ ๋ค์ 3 ์ด๋ฐ ์์ผ๋ก ์ด ๋ํ ๊ฒฐ๊ณผ ์ถ๋ ฅ
๐จ๐ฝ๐ซ ๋ฐ๋ผ์, ์ ๋ฌผ์ ํฌ๊ธฐ๋ ์ ํ ์ค์์น ์๊ณ ์ ๋ฌผ์ ๋์ ๊ด๊ณ๋ง ์ค์ํ๋ฏ๋ก Coordinate Compression ๊ธฐ๋ฒ ์ ์ฉ
๐จ๐ฝ๐ซ ์ 18870 ๋ฌธ์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก ํผ์ ธ ์๋ ์๋ฅผ ์์ ๋์ ๊ด๊ณ์ ๋ฐ๋ผ ์์ถํด ๊ฐ ์ ๋ณ ํฌ๊ธฐ ์์๋ฅผ dictionary์ ์ ์ฅ
๐จ๐ฝ๐ซ dictionary ์ ๊ทผ O(1)์ ์ํด ๋ชจ๋ dictionary value๋ฅผ ํฉํ ๊ฒฐ๊ณผ total ๋ณ์ ์ถ๋ ฅ
โ 9574 Goldilocks and the N Cows โ
import sys
input=sys.stdin.readline
N,X,Y,Z=map(int,input().split())
ABs=[]
up,down=Y-X,Y-Z
for _ in range(N):
A,B=map(int,input().split())
ABs.extend([(A,'I'),(B,'O')])
ABs.sort()
ABs=[i[1] for i in ABs]
ans,cul=0,0
for j in ABs:
if j=='I':
ans=max(ans,cul+up)
cul+=up
else:
cul-=down
print(N*X+ans)
๐จ๐ฝ๐ซ
→ A(i)์ B(i) ์ฌ์ด๋ฅผ ๋ง์๋ฉด right ์จ๋๋ก Y unit of milk๋ฅผ ๋ง์๊ณ , A(i) ๋ฏธ๋ง์ cold ์จ๋ X unit, B(i) ์ด๊ณผ๋ hot ์จ๋ Z unit. (์ฆ ์ด 3๊ตฌ๊ฐ ๋๋)
= ์ด๋ฅผ ๋ค๋ฅด๊ฒ ํํํ๋ฉด
'๊ฐ cow์ A(i)๋ฅผ I, B(i)๋ฅผ O๋ผ๊ณ ํ๋ฉด I์ O ์ฌ์ด์ผ ๊ฒฝ์ฐ up ๋ ๋ง์๊ณ , O๋ฅผ ์ด๊ณผํ๋ฉด down unit ์ค์ด๋ ๋ค' (๊ทธ๋ฆผ ์ฐธ๊ณ )
→ ๊ฐ cow์ I์ O๋ฅผ ๋ชจ๋ ๋์ดํ๊ณ ์ ํ๋ฉด, ์ ์์ ์ ๊ฒฝ์ฐ 3 - 4 - 5 - 7 - 8 - 10 - 13 - 20.
→ ๋ชจ๋ I ๋ณด๋ค ์์ ์๋ผ๋ฉด N*X๋งํผ์ ์ต์ unit์ ๋ง์๊ฒ ๋๊ณ , ์ต์ unit์์ 1์ฉ ์ฆ๊ฐํ๋ฉด์ I์ O๋ฅผ ๊ฑฐ์น๋ฉด up ์ถ๊ฐ๋๊ฑฐ๋, down ๊ฐ์
→ ๋์ค์ I์ O๋ฅผ ๊ฑฐ์น ์ ์ค ์ต๋๊ฐ์ด ๊ตฌํ๊ณ ์ ํ๋ ๋ต!
โ ์ ๋ ฌ (๊ฐ, I/O ์ ๋ณด)์ธ tuple sort() (sort()๋ tuple์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ)
โก ์ ๋ ฌ๋ ABs(์ด๋ฏธ ์ ๋ ฌํ๊ธฐ์ ๊ฐ์ ์๋ฏธ ์์ - Coordinate Compression ์๋ฃ)์์ ๋ ๋ฒ์งธ ์์ I / O์ ๋ฐ๋ผ I๋ผ๋ฉด up ์ถ๊ฐ - ์ด ๋ ans update / O๋ผ๋ฉด down ๊ฐ์
import sys
input=sys.stdin.readline
N,X,Y,Z=map(int,input().split())
ABs=[]
up,down=Y-X,Y-Z
for _ in range(N):
A,B=map(int,input().split())
ABs.extend([(A,'I'),(B,'O')])
ABs.sort()
ans,cul=0,0
for j in ABs:
if j=='I':
ans=max(ans,cul+up)
cul+=up
else:
cul-=down
print(N*X+ans)
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Greedy Upper-Intermediate I - 9 Solvedโ (0) | 2023.01.27 |
---|---|
โ Math & Geometry Upper-Intermediate I - 6 Solvedโ (0) | 2023.01.26 |
โ Prefix Sum Upper + Intermediate I - 7 Solvedโ (0) | 2023.01.18 |
โ PQ ์ค์๊ธ - 6๋ฌธ์ ()โ (0) | 2023.01.11 |
โ Stack & Queue & Deque Upper-Intermediate I - 12 Solvedโ (0) | 2023.01.08 |
๋๊ธ