Skip to content

Conversation

@dohyeondol1
Copy link
Contributor

@dohyeondol1 dohyeondol1 commented Jul 13, 2025

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

์„๊ณ  ๋ชจํ˜• ๋งŒ๋“ค๊ธฐ

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

2h

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

์ˆ˜๋„ ์ฝ”๋“œ
ํ•จ์ˆ˜ DFS(u):
    ๋งŒ์•ฝ visited[u]๊ฐ€ true์ด๋ฉด return
    visited[u]๋ฅผ true๋กœ ์„ค์ •
    u์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  v์— ๋Œ€ํ•ด:
        DFS(v) ์žฌ๊ท€ ํ˜ธ์ถœ

ํ•จ์ˆ˜ main():
    ์ž…๋ ฅ: height, width
    ๋ฐ˜๋ณต (i = 0 to height-1):
        ๋ฐ˜๋ณต (j = 0 to width-1):
            ํ˜„์žฌ ์…€ ๋ฌธ์ž ch ์ž…๋ ฅ
            base = (i * width + j) * 8  // ์ด ์…€์˜ ์ƒํƒœ ์‹œ์ž‘ ์ธ๋ฑ์Šค

            // ๋ฌธ์ž์˜ XOR ๋งˆ์Šคํฌ ์„ค์ •
            mask = 0
            ๋งŒ์•ฝ ch == 'H'์ด๋ฉด mask = 1
            ๋งŒ์•ฝ ch == 'I'์ด๋ฉด mask = 2
            ๋งŒ์•ฝ ch == 'O'์ด๋ฉด mask = 4

            // ๊ฐ ์ƒํƒœ k(0~7)์— ๋Œ€ํ•ด XOR ์—ฐ๊ฒฐ ์ถ”๊ฐ€
            ๋ฐ˜๋ณต (k = 0 to 7):
                graph[base + k]์— base + (k XOR mask) ์ถ”๊ฐ€

    // ์ขŒ์šฐ ์ธ์ ‘ ์…€ ์—ฐ๊ฒฐ
    ๋ฐ˜๋ณต (i = 0 to height-1):
        ๋ฐ˜๋ณต (j = 0 to width-2):  // j+1์ด ๋ฒ”์œ„ ๋‚ด์— ์žˆ์–ด์•ผ ํ•จ
            u = (i * width + j) * 8
            v = (i * width + (j+1)) * 8

            graph[u+1] <-> graph[v]         // ์ƒํƒœ 1 โ†” ์ƒํƒœ 0
            graph[u+3] <-> graph[v+2]       // ์ƒํƒœ 3 โ†” ์ƒํƒœ 2
            graph[u+5] <-> graph[v+4]       // ์ƒํƒœ 5 โ†” ์ƒํƒœ 4
            graph[u+7] <-> graph[v+6]       // ์ƒํƒœ 7 โ†” ์ƒํƒœ 6

    // ์ƒํ•˜ ์ธ์ ‘ ์…€ ์—ฐ๊ฒฐ
    ๋ฐ˜๋ณต (i = 0 to height-2):
        ๋ฐ˜๋ณต (j = 0 to width-1):
            u = (i * width + j) * 8
            v = ((i+1) * width + j) * 8

            graph[u+2] <-> graph[v]         // ์ƒํƒœ 2 โ†” ์ƒํƒœ 0
            graph[u+3] <-> graph[v+1]       // ์ƒํƒœ 3 โ†” ์ƒํƒœ 1
            graph[u+6] <-> graph[v+4]       // ์ƒํƒœ 6 โ†” ์ƒํƒœ 4
            graph[u+7] <-> graph[v+5]       // ์ƒํƒœ 7 โ†” ์ƒํƒœ 5

    ์—ฐ๊ฒฐ ์š”์†Œ ๊ฐœ์ˆ˜ cnt = 0
    ๋ฐ˜๋ณต (i = 0 to height * width * 8 - 1):
        ๋งŒ์•ฝ visited[i]๊ฐ€ false์ด๋ฉด:
            DFS(i)
            cnt += 1

    ์ถœ๋ ฅ: cnt

R x C ํฌ๊ธฐ์˜ ํ‹€์— ์›๊ธฐ๋‘ฅ๋“ค์„ ๋ฐฐ์น˜ํ•˜๊ณ , ๊ทธ ํ‹€์— ์„๊ณ ๋ฅผ ๋ถ€์€ ํ›„ ๊ตณํžˆ๊ณ  ๋‚˜์„œ ์›๊ธฐ๋‘ฅ์„ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ, ๋ถ„๋ฆฌ๋œ ์„๊ณ  ์กฐ๊ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ• ๋•Œ, ์›๊ธฐ๋‘ฅ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ๋‚œ ๋’ค ๋งŒ๋“ค์–ด์ง€๋Š” ๋ถ„๋ฆฌ๋œ ์„๊ณ  ์กฐ๊ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์šฐ์„  ๋‹จ์œ„ ์ •์œก๋ฉด์ฒด๋ฅผ ๋ณ€์˜ ๊ธธ์ด๊ฐ€ 1/2์ธ ์ž‘์€ ์ •์œก๋ฉด์ฒด 8๊ฐœ๋กœ ์ชผ๊ฐญ์‹œ๋‹ค.
๋‘ ์ด์›ƒํ•œ ์ž‘์€ ์ •์œก๋ฉด์ฒด ์•ˆ์˜ ์„๊ณ  ์กฐ๊ฐ์ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋‘˜ ์‚ฌ์ด์— ๊ฐ„์„ ์„ ์ด์–ด์„œ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‹จ์œ„ ์ •์œก๋ฉด์ฒด ๋‚ด์—์„œ ํšŒ์ „์ถ•๊ณผ ํ‰ํ–‰ํ•˜๊ฒŒ 4๊ฐœ์˜ ๊ฐ„์„ ์„ ์ž‡์Šต๋‹ˆ๋‹ค.
์œ„ ๊ทธ๋ฆผ์—์„œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฐ ๊ฐœ์ˆ˜๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

๋ฌธ์ œ์˜ H, I, O๋ฅผ ๋‹จ์œ„ ์ •์œก๋ฉด์ฒด๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์—ฐ๊ฒฐ ์ปดํฌ๋„ŒํŠธ๋กœ ์‹œ๊ฐํ™”ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

image

๊ทธ๋ฆฌ๊ณ  ๋‹จ์œ„ ์ •์œก๋ฉด์ฒด๋ผ๋ฆฌ ๋งž๋‹ฟ์€ ๋ฉด ์‚ฌ์ด์— 4๊ฐœ์˜ ๊ฐ„์„ ์„ ์ž‡์Šต๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์ด ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด DFS๋‚˜ BFS๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์—ฐ๊ฒฐ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์ €๋Š” ๋‹จ์œ„ ์ •์œก๋ฉด์ฒด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„ํ• ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

for(int i = 0; i < height; ++i) {
        for(int j = 0; j < width; ++j) {
            int base = (i * width + j) * 8;
            char ch;
            cin >> ch;

            int mask = 0;
            if(ch == 'H') mask = 1;
            else if(ch == 'I') mask = 2;
            else if(ch == 'O') mask = 4;

            for(int k = 0; k < 8; ++k)
                graph[base + k].push_back(base + (k ^ mask));
        }
    }

๊ฐ ์…€์— ๋Œ€ํ•ด ํ‹€์˜ ํ˜•ํƒœ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ์ด๋ฅผ ๋น„ํŠธ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์—ฐ๊ฒฐ๋  ๋…ธ๋“œ๋ฅผ ์ธ์ ‘๋ฆฌ์ŠคํŠธ์— pushํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๋งŒ์•ฝ ์•ž์„œ ๋ดค๋˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ I ๋‘๊ฐœ๊ฐ€ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ๋ผ๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋น„ํŠธ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

0 โ†’ 0 ^ 2 = 2 (2์ง„์ˆ˜ 0000 ๊ณผ 0010์˜ XOR์€ 0010์ด๋‹ค.)
1 โ†’ 1 ^ 2 = 3
2 โ†’ 2 ^ 2 = 0
3 โ†’ 3 ^ 2 = 1
4 โ†’ 4 ^ 2 = 6
5 โ†’ 5 ^ 2 = 7
6 โ†’ 6 ^ 2 = 4
7 โ†’ 7 ^ 2 = 5

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์…€ ๋‚ด๋ถ€์—์„œ์˜ ์—ฐ๊ฒฐ ์ปดํฌ๋„ŒํŠธ ์ž‘์—…์ž…๋‹ˆ๋‹ค.
์ด ์นœ๊ตฌ๋“ค์„ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค ์…€๋‹จ์œ„๋กœ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋ฉด ๊ทธ๋ž˜ํ”„๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๊ณ ,
์ด๋ฅผ DFS๋กœ ์—ฐ๊ฒฐ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•ด์ฃผ๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

@froglike6
Copy link
Collaborator

froglike6 commented Jul 16, 2025

์™€ ์ด ๋ฌธ์ œ ๋งค์šฐ ์–ด๋ ต๋„ค์š”. ๋จธ๋ฆฟ์†์œผ๋กœ ์ฝ”๋“œ ์งฐ์„ ๋•Œ๋Š” ์ž˜ ๋Œ์•„๊ฐ”๋Š”๋ฐ, ์‹ค์ œ๋กœ ํ•˜๋‹ˆ ์ž˜ ์•ˆ๋˜๋„ค์š” ใ… ใ… ...
๋” ์ด์ƒ ์ œ ๋จธ๋ฆฟ์†์˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ๋ฏฟ์„ ์ˆ˜ ์—†์–ด์„œ, ๊ฒฐ๊ตญ ๊ฑฐ๋Œ€ ์–ธ์–ด ๋ชจ๋ธ์˜ ๋„์›€์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐํšŒ์— ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ๋งˆ์Šคํ„ฐํ•˜๊ณ  ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ด ๋ฌธ์ œ์— ์‹œ๋„ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. (์ˆ˜ํ•™๋ณด๋‹ค ๊ทธ๋ž˜ํ”„๊ฐ€ ํ™•์‹คํžˆ ์–ด๋ ต๊ตฐ์š” ใ… ใ… ใ… ใ… )

๊ฑฐ๋Œ€ ์–ธ์–ด ๋ชจ๋ธ์˜ ๋„์›€์„ ๋ฐ›์€ ํŒŒ์ด์ฌ ์ฝ”๋“œ

import sys
sys.setrecursionlimit(1 << 25)
input = sys.stdin.readline

R, C = map(int, input().split())
grid = [input().rstrip() for _ in range(R)]

N = 8 * R * C
parent = list(range(N))
size   = [1] * N

def find(x):
    while parent[x] != x:
        parent[x] = parent[parent[x]]
        x = parent[x]
    return x

def union(a, b):
    ra, rb = find(a), find(b)
    if ra == rb:
        return
    if size[ra] < size[rb]:
        ra, rb = rb, ra
    parent[rb] = ra
    size[ra] += size[rb]

EDGES_X = [(0, 1), (2, 3), (4, 5), (6, 7)]          # ๊ฐ€๋กœ(H) ์ถ•
EDGES_Y = [(0, 2), (1, 3), (4, 6), (5, 7)]          # ์„ธ๋กœ(I) ์ถ•
EDGES_Z = [(0, 4), (1, 5), (2, 6), (3, 7)]          # ์ˆ˜์ง(O) ์ถ•

EAST_PAIRS  = [(1, 0), (3, 2), (5, 4), (7, 6)]      # (x, y) โ†’ (x+1, y)
SOUTH_PAIRS = [(2, 0), (3, 1), (6, 4), (7, 5)]      # (x, y) โ†’ (x, y+1)

def idx(y, x, k):
    return ((y * C + x) * 8) + k

for y in range(R):
    for x in range(C):
        cell = grid[y][x]
        keep = EDGES_X if cell == 'H' else EDGES_Y if cell == 'I' else EDGES_Z
        base = (y * C + x) * 8
        for a, b in keep:
            union(base + a, base + b)

for y in range(R):
    for x in range(C):
        base = (y * C + x) * 8

        if x + 1 < C:
            nb = (y * C + (x + 1)) * 8
            for a, b in EAST_PAIRS:
                union(base + a, nb + b)

        if y + 1 < R:
            nb = ((y + 1) * C + x) * 8
            for a, b in SOUTH_PAIRS:
                union(base + a, nb + b)

answer = sum(1 for i in range(N) if parent[i] == i)
print(answer)

@Fnhid
Copy link
Collaborator

Fnhid commented Aug 1, 2025

์ €๋Š” ์ธ์ ‘ ํ–‰๋ ฌ์„ ์ด์šฉํ•ด์„œ ํ’€์–ด๋ณด๋ ค ํ–ˆ๋Š”๋ฐ, ๋ฉ”๋ชจ๋ฆฌ ์ด์Šˆ๋กœ ๋˜์กŒ์Šต๋‹ˆ๋‹ค. ๐Ÿซ ๐Ÿซ 
์›ฌ๋งŒํ•œ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ๋Š” ํ˜„์„๋‹˜์ฒ˜๋Ÿผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ํ•ด๊ฒฐํ•˜๋Š”๊ฒŒ ํ˜„๋ช…ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทœ๋ชจ๊ฐ€ ์ž‘๊ณ  ๊ฐ„์„ ์ด ๋งŽ์€ ๊ทธ๋ž˜ํ”„์—๋Š” ์ธ์ ‘ ํ–‰๋ ฌ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋„ค์š”!

@dohyeondol1 dohyeondol1 removed the request for review from hadongun August 1, 2025 13:14
@Fnhid Fnhid merged commit e6554a3 into main Aug 2, 2025
@dohyeondol1 dohyeondol1 deleted the 21-dohyeondol1 branch August 18, 2025 04:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants