BOJ/๐Ÿฅˆ

โ˜…Coordinate Compression Upper-Intermediate - 3 Solvedโ˜…

metamong 2023. 1. 24.

โ˜… 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)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€