[Python] 4963번 섬의 개수 / 재귀함수.ver

2025. 4. 8. 00:45·coding test/Baekjoon

밀린 알고리즘 공부를 시작했다.

DFS와 BFS부터 시작하는 게 좋을 것 같다고 해서 4963번을 풀게 되었다.

이번 알고리즘은 DFS로 풀었다.

 

def island(yi,xi):
    dy=[1,0,-1,1,-1,1,0,-1]
    dx=[-1,-1,-1,0,0,1,1,1]
    
    visited[yi][xi]=True
    
    for i in range(8):
        y=yi+dy[i]
        x=xi+dx[i]
        if 0<=x<w and 0<=y<h:
            if m[y][x]==1 and visited[y][x]==False: #m[y][x]==1 확인하지 않았음
                island(y,x)
                
while True:
    w,h=map(int,input().split())
    
    if w==0 and h==0:
        break
        
    else:
        cnt=0
        m=[] #map
        visited=[[False for i in range(w)] for i in range(h)] #한 번 방문 후 섬 없다고 하면 됌
        for _ in range(h):
            m.append(list(map(int,input().split())))
            
        for y in range(h):
            for x in range(w):
                if m[y][x]==1 and visited[y][x]==False:
                    island(y,x)
                    cnt+=1
        print(cnt)

처음에 코드를 돌렸을 때 첫 번째 테스트케이스 말고 뒤에 케이스에 모두 1이 나오길래 뭐가 문제인지 몰랐다.

나중에 지피티로 확인해보니 재귀함수로 다시 들어갈 때 방문하지 않은 경우만 고려하고, 섬인 경우(1)의 조건을 빼었던 것이 문제였다.

다시 수정하니까 제대로 돌아갔다. 

 

그리고 이렇게 푼 알고리즘을 스터디원과 함께 풀이를 하였는데 visited를 굳이 안 써도 되겠다는 조언을 해주셨다.

visited를 쓰지 않고 방문한 후 섬이 없다고 하면 굳이 변수를 하나 더 설정할 필요 없다고 해주셔서 고쳐보았다.

def island(yi,xi):
    dy=[1,0,-1,1,-1,1,0,-1]
    dx=[-1,-1,-1,0,0,1,1,1]
    
    m[yi][xi]=0 #섬을 방문한 경우 0으로 바꿔줌
    
    for i in range(8):
        y=yi+dy[i]
        x=xi+dx[i]
        if 0<=x<w and 0<=y<h:
            if m[y][x]==1: 
                island(y,x)
                
while True:
    w,h=map(int,input().split())
    
    if w==0 and h==0:
        break
        
    else:
        cnt=0
        m=[] #map
        for _ in range(h):
            m.append(list(map(int,input().split())))
            
        for y in range(h):
            for x in range(w):
                if m[y][x]==1:
                    island(y,x)
                    cnt+=1
        print(cnt)

이렇게 수정하였더니 훨씬 간단해졌다.

 

작성한 코드를 백준에 내니 문제가 또 생겼었다.

이 문제 대해서는 

https://www.acmicpc.net/board/view/93923

질문 게시판의 글에 도움을 받아 

import sys
sys.setrecursionlimit(10**6)

코드를 추가하였더니 해결되었다.

'coding test > Baekjoon' 카테고리의 다른 글

[Python] 4963번 섬의 개수 / DFS.ver  (0) 2025.04.13
[Python] 2583번 영역 구하기 / DFS  (0) 2025.04.13
[Python] 2609번 최대공약수와 최소공배수  (0) 2025.02.24
[Python] 1260번 DFS와 BFS  (0) 2025.02.24
[Python] 16916번 부분 문자열  (0) 2025.02.18
'coding test/Baekjoon' 카테고리의 다른 글
  • [Python] 4963번 섬의 개수 / DFS.ver
  • [Python] 2583번 영역 구하기 / DFS
  • [Python] 2609번 최대공약수와 최소공배수
  • [Python] 1260번 DFS와 BFS
wish404
wish404
자동 로그
  • wish404
    wish-log
    wish404
    • 홈
    • 태그
    • 방명록
    • github
    • 분류 전체보기 (75)
      • log (8)
        • 블로그 관리 (5)
        • 에러 모음 (2)
      • coding test (47)
        • Algorithm (4)
        • Baekjoon (34)
        • SW Expert Academy (6)
        • etc (3)
      • 프로그래밍 언어 (7)
        • JAVA (7)
      • 데이터 엔지니어링 (5)
        • Kafka (0)
        • Spark (4)
        • Airflow (1)
        • Elasticsearch (0)
      • 머신러닝&딥러닝 (3)
        • Kaggle 스터디 (3)
        • 논문 리뷰 (0)
        • MLOps (0)
      • 신입 개발자가 되기까지 (5)
        • 취준일기 (1)
        • SSAFY (2)
        • 프로젝트 (1)
        • CS 공부 (1)
  • 인기 글

  • 태그

    플로이드워샬
    틀린문제
    싸피
    복습
    SSAFY
    heapq
    복습해야지
    dp
    다익스트라
    그리디
    후위순회
    중위순회
    Dijkstra
    dijk
    그리디 알고리즘
    전위순회
    최단 경로
    dfs
    벨만포드
    BFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
wish404
[Python] 4963번 섬의 개수 / 재귀함수.ver
상단으로

티스토리툴바