본문 바로가기
개인 공부/알고리즘 트레이닝

[Softeer] 장애물 인식 프로그램

by 아메리카노와떡볶이 2022. 10. 29.
728x90
[Softeer] 장애물 인식 프로그램

 

https://softeer.ai/practice/info.do?idx=1&eid=408&sw_prbl_sbms_sn=95336 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

문제

자율주행팀 SW 엔지니어인 당신에게 장애물과 도로를 인식할 수 있는 프로그램을 만들라는 업무가 주어졌다.

 

[그림 1] 지도 예시

 

우선 [그림 1]과 같이 정사각형 모양의 지도가 있다. 1은 장애물이 있는 곳을, 0은 도로가 있는 곳을 나타낸다.

 

당신은 이 지도를 가지고 연결된 장애물들의 모임인 블록을 정의하고, 불록에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 장애물이 좌우, 혹은 아래위로 붙어 있는 경우를 말한다. 대각선 상에 장애물이 있는 경우는 연결된 것이 아니다.

 

 

[그림 2] 블록 별 번호 부여

 

[그림 2]는 [그림 1]을 블록 별로 번호를 붙인 것이다. 

 

지도를 입력하여 장애물 블록수를 출력하고, 각 블록에 속하는 장애물의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.

제약조건

N은 정사각형임으로 가로와 세로의 크기는 같으며 5 ≤ N ≤ 25

 

입력형식

입력 값의 첫 번째 줄에는 지도의 크기 N이 입력되고, 그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.

 

출력형식

첫 번째 줄에는 총 블록 수를 출력 하시오.

그리고 각 블록 내 장애물의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.

입력예제1

7
1110111
0110101
0110101
0000100
0110000
0111110
0110000

출력예제1

3
7
8
9

이 문제 어디서 본 것 같은데?

https://man-25-1.tistory.com/217

 

[python] BOJ 2667 단지번호붙이기

BOJ 2667 단지번호붙이기 https://www.acmicpc.net/problem/2667 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지

man-25-1.tistory.com

단지 번호 붙이기 문제랑 똑같은 문제다 !

dfs, bfs를 통해 단지내 건물들을 방문하고, 카운팅하여 출력하는 것

 

분명 예전에 풀었던 문제기때문에.. 쉽게 해결할 것이라 생각하고 코드를 썼는데 자꾸 틀렸다

내가 처음에 작성한 코드는 아래와 같다

import sys
from collections import deque

def bfs(x,y):
    cnt = 0
    queue = deque()
    queue.append((x,y))

    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or ny <0 or nx>= N or ny >= N:
                continue
            if graph[nx][ny] == 0:
                continue

            if graph[nx][ny] == 1:
                graph[nx][ny] = 99 #방문처리
                queue.append((nx,ny))
                cnt += 1            
    return cnt    

N = int(input())
graph = []
for i in range(N):
    tmp = list(map(int,input()))
    graph.append(tmp)

res = []
dx = [-1,1,0,0]
dy = [0,0,-1,1]

for i in range(N):
    for j in range(N):
        if graph[i][j] == 1:
            res.append(bfs(i,j))
            
print(len(res))
res.sort(reverse=False)

for r in res:
    print(r)

뭐가 틀렸는지 보이시나요?.

정답은 .. 바로 

    cnt = 0
    queue = deque()
    queue.append((x,y))

여기 세 라인에 있습니다.

bfs x,y에 대해서 호출할 때 해당 x,y 좌표를 방문한 것 이기때문에 

1. 카운트를 1로 초기화 해야합니다.

2. x,y 좌표에 대한 방문처리를 그래프에도 해주어야합니다.

 

그래서 고친답안은...

import sys
from collections import deque

def bfs(x,y):
    cnt = 1
    queue = deque()
    queue.append((x,y))
    graph[x][y] = 99 #방문처리
    
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or ny <0 or nx>= N or ny >= N:
                continue
            if graph[nx][ny] == 0:
                continue

            if graph[nx][ny] == 1:
                graph[nx][ny] = 99 #방문처리
                queue.append((nx,ny))
                cnt += 1            
    return cnt    

N = int(sys.stdin.readline())
graph = []
for i in range(N):
    tmp = list(map(int,input()))
    graph.append(tmp)

res = []
dx = [-1,1,0,0]
dy = [0,0,-1,1]

for i in range(N):
    for j in range(N):
        if graph[i][j] == 1:
            res.append(bfs(i,j))
            
print(len(res))
res.sort(reverse=False)

for r in res:
    print(r)

 

정답 !!

728x90

'개인 공부 > 알고리즘 트레이닝' 카테고리의 다른 글

[Softeer] 8단 변속기  (0) 2022.10.28
[Softeer] 금고털이  (0) 2022.10.28
[Softeer] 우물 안 개구리  (0) 2022.10.28
[Softeer] 성적 평균  (1) 2022.10.28
[python] BOJ 14502 연구소  (0) 2022.10.23

댓글