๐Ÿ“š Study/Baekjoon

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3 | dfs/bfs | ํผ์ฆ ์กฐ๊ฐ ์ฑ„์šฐ๊ธฐ

์œฐ๊ฐฑ 2026. 4. 2. 21:29

https://school.programmers.co.kr/learn/courses/30/lessons/84021

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 

1. ์ •๊ทœํ™”ํ•˜๋Š” ์•„์ด๋””์–ด

2. ํšŒ์ „ํ•  ๋•Œ ์ขŒํ‘œ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€

์ด ๋‘ ๋ถ€๋ถ„์—์„œ ๊ฐ์„ ๋ชป ์žก์•„์„œ gptํ•œํ…Œ ๋ฌผ์–ด๋ดค๋‹ค

์ œ๋Œ€๋กœ ํ˜ผ์ž ํ’€์–ด๋‚ด๊ธฐ๋ฅผ ๊ฑฐ์˜ 1์‹œ๊ฐ„ 30๋ถ„ ๊ฑธ๋ ธ๋‹ค.. ๋„ˆ๋ฌด ์–ด๋ ค์›Œ 

 

def dfs(x, y, board, value, path):
    board[x][y] = 2 # ๋ฐฉ๋ฌธ ํ‘œ์‹œ
    path += [(x,y)]
    
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    
    for i in range(4):
        nx, ny = x + dx[i], y + dy[i]
        if 0 <= nx < len(board) and 0 <= ny < len(board):
            if board[nx][ny] == value:
                dfs(nx, ny, board, value, path)

def normalize(list_n):
    min_x, min_y = 100, 100
    for x, y in list_n:
        min_x = min(x,min_x)
        min_y = min(y,min_y)
    
    list_new = [(x-min_x, y-min_y) for x,y in list_n]
    
    return sorted(list_new)
    
    
def move(list_a, list_b):
    # normalization
    norm_list_a, norm_list_b = normalize(list_a), normalize(list_b)

    return (norm_list_a == norm_list_b)

def rotate(list_a, list_b):
    # normalization
    norm_list_a, norm_list_b = normalize(list_a), normalize(list_b)
    
    # 90๋„ ํšŒ์ „: (x, y) -> (y, -x)
    # 180๋„ ํšŒ์ „:(x, y) -> (-x, -y)
    # 270๋„ ํšŒ์ „:(x, y) -> (-y, x)
    
    norm_list_b_90 = []
    norm_list_b_180 = []
    norm_list_b_270 = []
    for (x, y) in norm_list_b:
        norm_list_b_90.append((y,-x))
        norm_list_b_180.append((-x, -y))
        norm_list_b_270.append((-y, x))
    
    norm_list_b_90 = normalize(norm_list_b_90)
    norm_list_b_180 = normalize(norm_list_b_180)
    norm_list_b_270 = normalize(norm_list_b_270)

    return (norm_list_a == norm_list_b_90 or norm_list_a == norm_list_b_180 or norm_list_a == norm_list_b_270)
    

def find_answer(gb_list, table_list):
    answer = 0
    visited_gb = [False]*len(gb_list)
    visited_t = [False]*len(table_list)
    
    for idx_gb, gb in enumerate(gb_list):
        for idx_t, t in enumerate(table_list):
            if len(gb) == len(t):
                if (move(gb,t) or rotate(gb,t)) and (not visited_gb[idx_gb] and not visited_t[idx_t]): # ํ‰ํ–‰์ด๋™์ด ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ํšŒ์ „์ด ๊ฐ€๋Šฅํ•  ๋•Œ, ๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๋ฌธ x
                    answer += len(gb)
                    visited_gb[idx_gb] = True; visited_t[idx_t] = True
                    break
    
    return answer
                
    
def solution(game_board, table):
    # ๊ฒŒ์ž„๋ณด๋“œ์˜ ๋นˆ์นธ(0)์— table์˜ ์นธ(1)์„ ๋„ฃ๋Š” ๊ณผ์ •
    # ์•„์˜ˆ ๋™์ผํ•˜๊ฒŒ ์ฑ„์šธ ์ˆ˜๋„ ์žˆ๊ณ 
    # ์กฐ๊ฐ์„ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ์ฑ„์šธ ์ˆ˜๋„ ์žˆ์Œ <-- ์ด๊ฑฐ๊นŒ์ง€ ๊ตฌํ˜„ ๋ชปํ•˜๊ฒ ์Œ
        # ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ๋” ๋‚˜์€์ง€๋Š”.. ์‹ค์ œ ๋ช‡์นธ์„ ์ฑ„์› ๋Š”์ง€ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ๊ฒƒ ๊ฐ™์Œ
    
    # ์ฒ˜์Œ์— ํ•ด์•ผ ํ•  ์ผ์€, (dfs ์ ‘๊ทผ)
        # game board >> 0 ๊ทธ๋ฃน ์ฐพ๊ธฐ
        # table >> 1 ๊ทธ๋ฃน ์ฐพ๊ธฐ
        # ์ผ๋ฐ˜์ ์œผ๋กœ game board์˜ ๊ทธ๋ฃน์ด table ๊ทธ๋ฃน๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ๋งŽ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ
    gb_list = []
    for i in range(len(game_board)):
        for j in range(len(game_board)):
            if game_board[i][j] == 0:
                path = []
                dfs(i,j,game_board, 0, path) 
                gb_list.append(path)
                
    table_list = []
    for i in range(len(table)):
        for j in range(len(table)):
            if table[i][j] == 1:
                path = []
                dfs(i,j,table, 1, path)
                table_list.append(path)
    
    # ์ฑ„์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•  ๊ฒƒ์ธ๊ฐ€
        # ๋‹จ์ˆœํžˆ ํ‰ํ–‰์ด๋™์ด๋ฉด ๋งค์šฐ ์‰ฌ์›Œ์ง,, ๊ทธ ์œ„์น˜๋“ค์„ ๋™์ผํ•œ ๊ฐ’์œผ๋กœ x์ถ• y์ถ• ํ‰ํ–‰์ด๋™ ํ–ˆ์„ ๋•Œ ๋„๋‹ฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ
        # ๊ทผ๋ฐ ์šฐ๋ฆฌ์˜ ๋ฌธ์ œ๋Š” ํšŒ์ „์ด ๋œ๋‹ค๋Š” ์‚ฌ์‹ค,, ๊ทธ ์ขŒํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ๊ฒƒ์ธ๊ฐ€
        
    return find_answer(gb_list, table_list)