13
Algostudy SOCC 오혁 [email protected] 1회차 스터디 10 LAKE

Algostudy_lake문제풀이_oh4851

Embed Size (px)

Citation preview

Algostudy

SOCC 오혁 [email protected]

1회차 스터디 10 LAKE

문제

호수의 개수를 구하는 문제 (상,하,좌,우,대각선으로 연결된 곳 W(물)는 같은 호수로 본다)

W 물

. 땅

W . . . W .

. W W . W W

. . W . W W

. . . . W .

. W . . W W

W W . . . W

. W . W . W

. W W . . W

입력 행 N , 열 M 이 입력으로 주어진다. (1 <= N <= 100; 1 <= M <= 100)

입출력예 입력: 8 6 출력: 3

문제풀이

영상처리의 라벨링과 동일한 작업 과정을 거침 1. 최초로 W가 발견되는 위치까지 탐색 2. W가 발견 될 경우 이를 n번째 호수로 표시하고 배열의 인접한 점을 탐색

3. 만약 인접한 곳에 W가 없다면 1.의 위치에서 다시 W가 발견되는 지점을 찾고 2., 3.의 과정 반복

W . . . W .

. W W . W W

. . W . W W

. . . . W .

. W . . W W

W W . . . W

. W . W . W

. W W . . W

문제풀이

W와 .을 입력 받으면 W -> 255(흰색) . -> 0(검은색) 으로 매핑함

문제풀이

왼쪽에서 오른쪽, 위에서 아래의 순서로 W(255)를 발견할때까지 배열을 탐색

좌측 그림의 예에서는 (0, 0)에서 255인 점을 발견 스택에 (0, 0)을 PUSH

(0, 0)

STACK

문제풀이

스택이 비어있지 않다면, POP을 수행하고 해당 위치를 COUNT값으로 표시함

그 후 인접한 점(상, 하, 좌, 우, 대각)을 탐색하여 배열의 유효범위를 벗어나지 않고 255인 위치이면 해당 점을 PUSH하고 -1로 표시(재접근 방지)

1

(1, 1)

(0, 0)

STACK

문제풀이

마찬가지로 스택이 비어있지 않다면, POP을 수행하고 해당 위치를 COUNT값으로 표시함

그 후 인접한 점(상, 하, 좌, 우, 대각)을 탐색하여 배열의 유효범위를 벗어나지 않고 255인 위치이면 해당 점을 PUSH하고 -1로 표시(재접근 방지)

1

1

(2, 2)

(1, 2)

(1, 1)

STACK

문제풀이

마찬가지로 스택이 비어있지 않다면, POP을 수행하고 해당 위치를 COUNT값으로 표시함

그 후 인접한 점(상, 하, 좌, 우, 대각)을 탐색하여 배열의 유효범위를 벗어나지 않고 255인 위치이면 해당 점을 PUSH하고 -1로 표시(재접근 방지)

1

1

1

(2, 2)

(1, 2)

STACK

문제풀이

(1, 2)인 점을 POP해서 COUNT(1)로 표시하고 나면 스택이 비게 되므로 첫번째 호수를 찾는 작업을 마침

그 후 (0, 0)에서부터 다시 W(255)를 탐색해 나감

1

1 1

1

(1, 2)

STACK

문제풀이

(0, 4)에서 다음 W(255)를 발견하고 앞선 과정과 마찬가지로 반복함

1

1 1

1

(0, 4)

STACK

문제풀이

위의 과정을 반복하면 좌측과 같은 결과가 완성됨 호수의 갯수는 COUNT값을 출력하면 됨

1 2

1 1 2 2

1 2 2

2

3 2 2

3 3 2

3 3 2

3 3 2 STACK

소스코드입력: N, M을 입력받고 W(물)입력 시 255로 매핑

탐색: 배열을 탐색하며 W(255)인 위치를 찾고 PUSH

라벨링: 스택에서 POP한 점을 COUNT값으로 표시하고 인접 배열 탐색 - PUSH, POP은 자유롭게 구현 가능

출력: 라벨링을 마친 후 COUNT값 출력

추가정보

해당 문제는 위와 같은 알고리즘 외에 아래의 알고리즘으로도 해결 가능함

1. Connected Component Labeling 2. Grassfire Labeling

결국 중복된 탐색 없이 배열의 인접한 위치를 묶어주고 묶은 것의 갯수를 파악할 수 있으면 해당 문제를 풀 수 있음