@Eeap
velog
@Eeap
전체 방문자
오늘
어제
  • 전체 (168)
    • osam (1)
    • Cloud (21)
      • Docker (2)
      • AWS (13)
    • AI & Data (7)
    • Algorithm (76)
      • Baekjoon (75)
      • Codeforces (1)
    • Language (18)
      • Java (18)
    • Back-end (17)
      • Spring (3)
      • JSP & Servlet (12)
      • Go (2)
    • 일상 (4)
    • 기타 (8)
    • git (1)
    • Infra (9)
      • Apache Kafka (5)
      • Kubernetes (4)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • knowledge bases
  • flink
  • SageMaker
  • CLASS
  • bedrock api
  • converse api
  • AWS CodeCatalyst
  • java
  • AWS CodeArtifact
  • bedrock agent
  • AWS CodeStar
  • sagemaker unified studio
  • 인터페이스
  • 심폴릭링크
  • Python
  • Agent
  • 오블완
  • bedrock
  • 티스토리챌린지
  • invokemodel api

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
@Eeap

velog

Algorithm/Baekjoon

Python 16929번 Two Dots

2022. 8. 5. 20:29
반응형

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

 

16929번: Two Dots

첫째 줄에 게임판의 크기 N, M이 주어진다. 둘째 줄부터 N개의 줄에 게임판의 상태가 주어진다. 게임판은 모두 점으로 가득차 있고, 게임판의 상태는 점의 색을 의미한다. 점의 색은 알파벳 대문

www.acmicpc.net

 

문제를 처음 풀때 graph로 딕셔너리를 만들어서 풀려고 했는데

예시의 경우에선 답이 잘나오는데 중간에 예외적인 경우에서 오답처리가 돼서 좀 오랫동안 고민하다가 그냥 dfs의 재귀만 이용해서 풀었더니 정답이 되었다....ㅠ

풀이 방법은 먼저 방문했는지 확인하기 위해 visited라는 2차원 배열을 만들고 현재 칸을 방문했다는 것을 저장하기 위해 visited값을 바꿔주고

그 다음 이제 현재 칸에서 상하좌우로 이동하는데 이동하는 경우는 값이 같고 틀을 벗어나지 않고 이전값들과 같지 않으면 그 방향으로 한칸 이동한다.

그리고 만약 이동한 칸이 방문한 적이 있고 cnt값이 4이상이면(사이클이 형성되기 위해선 지나간 점들이 최소 4개 이상이어야함) result에 값을 넣어주고 return 해준다. 그 이후엔 result가 값이 있으면 yes를 출력하고 없으면 no를 출력해준다.

import sys
input=sys.stdin.readline
n,m = map(int,input().split())
ary = [list(input()) for _ in range(n)]
dx=[1,0,0,-1]
dy=[0,1,-1,0]
visited = [[0 for _ in range(m)] for __ in range(n)]
result=[]
def dfs(x,y,prex,prey,cnt):
    if visited[x][y] and cnt >=4:
        result.append("yes")
        return
    visited[x][y]=1
    for idx in range(4):
        nx = dx[idx]+x
        ny = dy[idx]+y
        if 0<=nx<n and 0<=ny<m and ary[nx][ny]==ary[x][y]:
            if [nx,ny]!=[prex,prey]:
                dfs(nx,ny,x,y,cnt+1)


for i in range(n):
    for j in range(m):
        if not visited[i][j]:
            dfs(i,j,i,j,0)
if result:
    print("Yes")
else:
    print("No")
반응형
저작자표시 (새창열림)

'Algorithm > Baekjoon' 카테고리의 다른 글

Python 1541번 잃어버린 괄호  (0) 2022.08.07
Python 16234번 인구 이동  (0) 2022.08.06
Python 16928번 뱀과 사다리 게임  (0) 2022.08.05
Python 11048번 이동하기  (0) 2022.08.03
Python 14225번 부분수열의 합  (0) 2022.08.01
    'Algorithm/Baekjoon' 카테고리의 다른 글
    • Python 1541번 잃어버린 괄호
    • Python 16234번 인구 이동
    • Python 16928번 뱀과 사다리 게임
    • Python 11048번 이동하기
    @Eeap
    @Eeap

    티스토리툴바