[백준] 16724 - 피리 부는 사나이 (G2)

2021. 12. 20. 14:09·알고리즘 (PS)/BOJ
반응형

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

 

16724번: 피리 부는 사나이

첫 번째 줄에 지도의 행의 수를 나타내는 N(1 ≤ N ≤ 1,000)과 지도의 열의 수를 나타내는 M(1 ≤ M ≤ 1,000)이 주어진다. 두 번째 줄부터 N개의 줄에 지도의 정보를 나타내는 길이가 M인 문자열이 주

www.acmicpc.net

분리집합 + 그래프 탐색 문제이다.

주어진 입력에서 연결요소의 개수를 세면 된다.

 

같은 연결요소인지 아닌지 구분하기 위해 나는 분리집합을 사용했는데,

2차원 분리집합 구현은 처음이라 조금 애를 먹었던 것 같다.

그냥 단순무식하게 튜플을 있는 그대로 비교했는데, 다른 방법도 있을 것 같다.

 

내가 사용한 알고리즘

1. 모든 배열을 순회하면서 아직 방문하지 않은 노드를 만날때마다 해당 노드부터 DFS를 수행한다.

2. DFS를 하면서 만난 모든 노드는 같은 집합으로 묶어준다.

3-1. DFS를 수행하다가 더이상 길이 없으면 answer += 1

3-2. DFS를 수행하다가 맨 처음 시작했던 노드와 같은 집합인 노드로 이동했으면 사이클이니 answer += 1

3-3. DFS를 수행하다가 다른 집합의 방문했던 노드로 이동했으면 이미 세었던 개수에 포함되므로 종료

 

알고리즘은 간단한데, 최근에 BFS 문제를 위주로 풀기도 했고, 2차원 그래프요소에 대해 분리집합을 구현한건 처음이라

구현하는데 애를 먹었다.

(지만 아무리 그래도 G2 난이도는 아닌 것 같다.)

 

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**8)

TEST_MODE = False
def printMatrix(matrix):
    if not TEST_MODE:
        return
    for i in range(n):
        print(matrix[i])

def DFS(i, j):
    global n, m, answer
    if graph[i][j] == 'D' and i+1 < n:
        if not visit[i+1][j]:
            visit[i + 1][j] = True
            union((i, j), (i+1, j))
            DFS(i+1, j)
        else:
            if find(i, j) == find(i+1, j):
                answer += 1


    elif graph[i][j] == 'U' and i > 0:
        if not visit[i-1][j]:
            visit[i - 1][j] = True
            union((i, j), (i-1, j))
            DFS(i-1, j)
        else:
            if find(i, j) == find(i-1, j):
                answer += 1


    elif graph[i][j] == 'R' and j+1 < m:
        if not visit[i][j+1]:
            visit[i][j + 1] = True
            union((i, j), (i, j+1))
            DFS(i, j+1)
        else:
            if find(i, j) == find(i, j+1):
                answer += 1


    elif graph[i][j] == 'L' and j > 0:
        if not visit[i][j-1]:
            visit[i][j - 1] = True
            union((i, j), (i, j-1))
            DFS(i, j-1)
        else:
            if find(i, j) == find(i, j-1):
                answer += 1

    else: # 이동을 할 수 없을 때
        answer += 1


def find(i, j):
    if parent[i][j] == (i, j):
        return (i, j)

    parent[i][j] = find(parent[i][j][0], parent[i][j][1])
    return parent[i][j]


def union(t1, t2):
    t1 = find(t1[0], t1[1])
    t2 = find(t2[0], t2[1])
    parent[t2[0]][t2[1]] = t1


n, m = map(int, input().split())
visit = [[False for _ in range(m)] for _ in range(n)]
parent = [[(i, j) for j in range(m)] for i in range(n)]
graph = [list(input()) for _ in range(n)]

answer = 0
for i in range(n):
    for j in range(m):
        if not visit[i][j]:

            visit[i][j] = True
            DFS(i, j)


printMatrix(visit)
printMatrix(parent)

print(answer)
반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 (PS) > BOJ' 카테고리의 다른 글

[백준] 2098 - 외판원 순환 (G1)  (0) 2021.12.22
[백준] 1562 - 계단 수 (G1)  (0) 2021.12.21
[백준] 9466 - 텀프로젝트 (G3)  (0) 2021.12.17
[백준] 4386 - 별자리 만들기 (G4)  (0) 2021.12.13
[백준] 10942 - 펠린드롬? (G3)  (0) 2021.12.12
'알고리즘 (PS)/BOJ' 카테고리의 다른 글
  • [백준] 2098 - 외판원 순환 (G1)
  • [백준] 1562 - 계단 수 (G1)
  • [백준] 9466 - 텀프로젝트 (G3)
  • [백준] 4386 - 별자리 만들기 (G4)
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
  • 에버듀
    Blog. 에버듀
    에버듀
  • 전체
    오늘
    어제
    • 분류 전체보기 (614)
      • 개인 프로젝트 (43)
        • 토이 프로젝트 (3)
        • [2020] 카카오톡 봇 (9)
        • [2021] 코드악보 공유APP (22)
        • [2022] 유튜브 뮤직 클론코딩 (9)
        • [2025] 한글 SQL 데이터베이스 (0)
      • 팀 프로젝트 (22)
        • [2020] 인공지능 숫자야구 (4)
        • [2022] OSAM 온라인 해커톤 (10)
        • [2024] GDSC 프로젝트 트랙 (6)
        • [2025] 큰소리 웹 페이지 (2)
      • CS (335)
        • 자료구조 (19)
        • 어셈블리 (41)
        • 멀티미디어응용수학 (7)
        • 컴퓨터 구조 (29)
        • 알고리즘 분석 (4)
        • 컴퓨터 네트워크 (38)
        • 프로그래밍언어론 (15)
        • HCI 윈도우즈프로그래밍 (26)
        • 기초데이터베이스 (29)
        • 운영체제 (23)
        • 오토마타 (24)
        • 문제해결기법 (11)
        • 블록체인 (22)
        • 소프트웨어공학 (21)
        • 기계학습심화 (12)
        • 컴퓨터그래픽스와 메타버스 (8)
        • 분산시스템특론 (6)
      • 자기계발 (44)
        • 생각 정리 (22)
        • 대외활동 (11)
        • 동아리 (7)
        • 자격증 (3)
        • 머니 스터디 (1)
      • 알고리즘 (PS) (107)
        • BOJ (101)
        • Programmers (5)
        • 알고리즘 이모저모 (1)
      • WEB(BE) (8)
        • express.js (1)
        • Spring & Spring Boot (7)
      • WEB(FE) (2)
        • html, css, js (1)
        • React.js (1)
      • Tool & Language (6)
        • Edit Plus (1)
        • Git (1)
        • Python3 (2)
        • Java (2)
      • Infra (12)
        • AWS (1)
        • Oracle Cloud (8)
        • Firebase (2)
        • Network (1)
      • Android (18)
        • Java (6)
        • Flutter (12)
      • Window (2)
        • Visual Studio 없이 WPF (1)
        • MFC (1)
      • 독서 (14)
        • Inside Javascript (7)
        • Database Internals (6)
        • 한 글 후기 (1)
  • 링크

    • github
    • website
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에버듀
[백준] 16724 - 피리 부는 사나이 (G2)
상단으로

티스토리툴바