๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐Ÿ’ป๐Ÿ’ญ๐ŸŽง๐ŸŒ

BOJ 10775 : ๊ณตํ•ญ (Python) ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€ ํ’€์ด

BOJ 10775 : ๊ณตํ•ญ (Python)

adorableco 2023. 2. 28. 23:05
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

https://www.acmicpc.net/problem/10775

 

10775๋ฒˆ: ๊ณตํ•ญ

์˜ˆ์ œ 1 : [2][?][?][1] ํ˜•ํƒœ๋กœ ๋„ํ‚น์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. 3๋ฒˆ์งธ ๋น„ํ–‰๊ธฐ๋Š” ๋„ํ‚น์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค. ์˜ˆ์ œ 2 : [1][2][3][?] ํ˜•ํƒœ๋กœ ๋„ํ‚น ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , 4๋ฒˆ์งธ ๋น„ํ–‰๊ธฐ๋Š” ์ ˆ๋Œ€ ๋„ํ‚น ์‹œํ‚ฌ ์ˆ˜ ์—†์–ด์„œ ์ดํ›„ ์ถ”๊ฐ€์ ์ธ ๋„ํ‚น์€ ๋ถˆ

www.acmicpc.net

 

 

์ฝ”๋“œ

import sys
input = sys.stdin.readline

def find_parent(x):
    if parent[x] == x:
        return x
    P = find_parent(parent[x])
    parent[x] = P
    return parent[x]

def union(x, y):
    x = find_parent(x)
    y = find_parent(y)
    if x < y:
        parent[y] = x
    else:
        parent[x] = y

G = int(input())
P = int(input())

parent = {i: i for i in range(0, G+1)}
planes = []
count = 0

for _ in range(P):
    planes.append(int(input()))

for plane in planes:
    x = find_parent(plane)

    if x == 0:
        break
    union(x, x-1)
    count += 1

print(count)

 

 

ํ’€์ด

2์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋‹ˆ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋”ฐ์„œ union-find๋ฅผ ์‚ฌ์šฉํ•ด ํ’€์—ˆ๋‹ค. (2์ค‘ ๋ฐ˜๋ณต๋ฌธ ์ฝ”๋“œ๋Š” ์•„๋ž˜์—)

 

1. find_parent(x)

def find_parent(x):
    if parent[x] == x:
        return x
    P = find_parent(parent[x])
    parent[x] = P
    return parent[x]

ํ•ด๋‹น ์›์†Œ์˜ ๋ถ€๋ชจ๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜๋กœ ์žฌ๊ท€๋ฅผ ์ด์šฉํ•œ๋‹ค. 

 

 

2. union(x,y)

def union(x, y):
    x = find_parent(x)
    y = find_parent(y)
    if x < y:
        parent[y] = x
    else:
        parent[x] = y

x, y ๋ชจ๋‘ ๋ถ€๋ชจ ์›์†Œ๋ฅผ ์ฐพ์•„์„œ ๋‘˜ ์ค‘ ๋” ์ž‘์€ ๋ถ€๋ชจ ์›์†Œ๋ฅผ ๋”ฐ๋ผ๊ฐ„๋‹ค. โ†’ ๋‘˜์˜ ๋ถ€๋ชจ ์›์†Œ๊ฐ€ ๊ฐ™์•„์ง„๋‹ค  == ๊ฐ™์€ ํ•ฉ์ง‘ํ•ฉ

 

์•„... ๋จธ๋ฆฌ๋กœ๋Š” ์ดํ•ด๊ฐ€ ๋˜๋Š” ๋“ฏ ํ•œ๋ฐ ๋ง๋กœ ์„ค๋ช…์„ ๋ชปํ•˜๊ฒ ๋‹ค.. ๊ทธ๋Ÿผ ์ „ ์ดํ•ด๋ฅผ ๋œํ•œ๊ฑฐ๊ฒ ์ฃ ... 


 

 

 

๊ธฐํƒ€

์šฐ์„  ์œ„ ์ฝ”๋“œ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์„œ ํ‹€๋ฆฐ ์ฝ”๋“œ์ด๋‚˜ ์•„๋งˆ ๋‹ต์„ ์ถœ๋ ฅํ•˜๋Š”๋ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋‹ค.

 

i ๋ฒˆ์งธ ๋น„ํ–‰๊ธฐ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ gi ๋ฒˆ์งธ ๊ฒŒ์ดํŠธ ์ค‘ ํ•˜๋‚˜์— ์˜๊ตฌ์ ์œผ๋กœ ๋„ํ‚นํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒŒ์ดํŠธ์˜ ์ˆ˜๊ฐ€ ์ ์€ ๋น„ํ–‰๊ธฐ๋“ค(gi๊ฐ€ ์ž‘์„์ˆ˜๋ก ๊ฒŒ์ดํŠธ์˜ ๋ฒ”์œ„๊ฐ€ ์ž‘์•„์ง€๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒŒ์ดํŠธ์˜ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ ๋‹ค.) ์ด ์•ž ์ชฝ ๊ฒŒ์ดํŠธ์— ๋„ํ‚นํ•  ์ˆ˜ ์žˆ๋„๋ก ์–‘๋ณดํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋น„ํ–‰๊ธฐ๋Š” gi๋ฒˆ์งธ ๊ฒŒ์ดํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ 1๋ฒˆ์งธ ๊ฒŒ์ดํŠธ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ๋„ํ‚น์ด ๊ฐ€๋Šฅํ•œ์ง€ ์ฒดํฌํ•œ ํ›„ ๋„ํ‚นํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. 

check ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ๊ฒŒ์ดํŠธ๊ฐ€ ์•„์ง ๋„ํ‚น๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด 0์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค.

๋„ํ‚น์„ ์›ํ•  ์‹œ์—

check ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ 0 ์ด๋ผ๋ฉด ์›์†Œ๋ฅผ 1๋กœ ๋ฐ”๊พธ๊ณ  (๋„ํ‚น๋˜์—ˆ๋‹ค๋Š” ํ‘œ์‹œ) result ๊ฐ’์„ 1์ฆ๊ฐ€ํ•œ ํ›„์— ๋‹ค์Œ ๋น„ํ–‰๊ธฐ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

check ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ 1์ด๋ผ๋ฉด ์ˆซ์ž๊ฐ€ ๋” ์ž‘์€ ์™ผ์ชฝ ๊ฒŒ์ดํŠธ๋กœ ์ด๋™ํ•˜์—ฌ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 if maximum == 0:
        break

maximum ์ด 0์ด ๋  ๋•Œ๊นŒ์ง€, ์ฆ‰ gi๋ฒˆ์งธ๋ถ€ํ„ฐ ์ฒดํฌํ•œ ๋ชจ๋“  ๊ฒŒ์ดํŠธ๊ฐ€ ๋„ํ‚น์ด ๋ผ์žˆ๋‹ค๋ฉด ๊ณตํ•ญ์€ ํ์‡„๋˜๋ฏ€๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ์ข…๋ฃŒํ•˜๊ณ  ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

์ฝ”๋“œ

import sys
input = sys.stdin.readline

G = int(input())
P = int(input())
gate = [0] * P
check = [0] *(G+1)

for i in range(P):
    gate[i] = int(input())
    
result = 0

for i in range(P):
    maximum = gate[i]
    while maximum != 0:
        if check[maximum] == 0:
            check[maximum] = 1
            result += 1
            break
        maximum -= 1
    if maximum == 0:
        break
        
print(result)์— ๋‹ค์Œ ๋น„ํ–‰๊ธฐ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

 

๋ฐ˜์‘ํ˜•