소스 코드
def bfs(qq,rr):
global res
temp = [[qq,rr]]
while len(temp) != 0:
i,j = temp.pop(0)
# 8 방향 확인하기
for e in range(8):
ni = i+x[e]
nj = j+y[e]
# 지도 밖으로 나가지 않으면
if 0 <= ni < h and 0 <= nj < w:
# 육지이고 방문한 적 없으면
if board[ni][nj] == 1 and visited[ni][nj] == 0:
temp.append([ni,nj])
visited[ni][nj] = 1
res += 1
return
# 좌상 상 우상 좌 우 좌하 하 우하
x = [-1,-1,-1,0,0,1,1,1]
y = [-1,0,1,-1,1,-1,0,1]
while True:
# w,h
w,h = map(int,input().split())
# w,h가 모두 0 이면 check의 숫자를 더해서 끝낸다
if w == 0 and h == 0:
break
else:
# 지도
board = [list(map(int,input().split())) for _ in range(h)]
# 섬의 개수
res = 0
# 방문 여부
visited = [[0]*w for _ in range(h)]
# 섬 보내기
for q in range(h):
for r in range(w):
if board[q][r] == 1 and visited[q][r] == 0:
visited[q][r] = 1
bfs(q,r)
print(res)
해결 방법
1. bfs를 사용
2. 한 번에 방문할 수 있는 육지를 확인한다
3. 입력은 여러 개의 테스트 케이스로 이루어져 있음(몇 개인지는 알 수 없음)
4. 그래서 while True를 통해 계속 반복하고, w,h가 모두 0 이면 탈출
느낀 점
1. 해당 코드를 pycharm에서 돌리면 eof오류가 발생함(답은 나옴)
2. 예외처리를 통해 문제를 해결해야 하지만 귀찮아서 그냥 넘어감...(서버에서는 문제 없이 잘 돌아감)
ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제 풀이.백준' 카테고리의 다른 글
[BOJ/백준 코딩] 컨베이어 벨트 위의 로봇 - PYTHON #20055 (0) | 2021.02.23 |
---|---|
[BOJ/백준 코딩] 주사위 게임 - PYTHON #5566 (0) | 2021.02.22 |
[BOJ/백준 코딩] 치킨 배달 - PYTHON #15686 (0) | 2021.02.20 |
[BOJ/백준 코딩] 안전 영역 - PYTHON #2468 (0) | 2021.02.19 |
[BOJ/백준 코딩] 미로 만들기 - PYTHON #1347 (0) | 2021.02.19 |