[BOJ] 16197 두 동전

2021. 8. 5. 20:17· Koala - 4기

딱히 뚜렷한 방법이 생각이 나지 않았습니다.. 그래서 그냥 맨 처음 생각났던 '한번에 두개 해보자'로 풀기 시작했습니다.

from sys import stdin
input=stdin.readline

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

n,m=map(int,input().split())
board=[list(input().rstrip()) for i in range(n)]
vi1=[[0 for i in range(m)]for i in range(n)]
vi2=[[0 for i in range(m)]for i in range(n)]

coins=[]
ans=11

for i in range(n):
    for j in range(m):
        if board[i][j]=='o':
            coins.append((j,i))

def dfs(coin1,coin2,tmpt):
    global ans
    if tmpt>=ans:
        return
    coin1_moved=False
    coin2_moved=False
    for i in range(4):
        fallen=0
        nx1=coin1[0]+dx[i]
        ny1=coin1[1]+dy[i]
        nx2=coin2[0]+dx[i]
        ny2=coin2[1]+dy[i]
        if nx1<0 or ny1<0 or nx1>=m or ny1>=n:
            fallen+=1
        if nx2<0 or ny2<0 or nx2>=m or ny2>=n:
            fallen+=1
        if fallen==1:
            ans=min(ans,tmpt+1)
            continue
        elif fallen==2:
            continue
        elif ny1==ny2 and nx1==nx2:
            continue
        if board[ny1][nx1]=='#':
            nx1=coin1[0]
            ny1=coin1[1]
        if board[ny2][nx2]=='#':
            nx2=coin2[0]
            ny2=coin2[1]
        if board[ny1][nx1]=='.' and vi1[ny1][nx1]==0:
            board[ny1][nx1],board[coin1[1]][coin1[0]]=board[coin1[1]][coin1[0]],board[ny1][nx1]
            vi1[ny1][nx1]=1
            coin1_moved=True
        if board[ny2][nx2]=='.' and vi2[ny2][nx2]==0:
            board[ny2][nx2],board[coin2[1]][coin2[0]]=board[coin2[1]][coin2[0]],board[ny2][nx2]
            vi2[ny2][nx2]=1
            coin2_moved=True
        if coin1_moved or coin2_moved:
            dfs((nx1,ny1),(nx2,ny2),tmpt+1)
        if coin1_moved:
            board[ny1][nx1],board[coin1[1]][coin1[0]]=board[coin1[1]][coin1[0]],board[ny1][nx1]
            vi1[ny1][nx1]=0
        if coin2_moved:
            board[ny2][nx2],board[coin2[1]][coin2[0]]=board[coin2[1]][coin2[0]],board[ny2][nx2]
            vi2[ny2][nx2]=0
            
            
dfs(coins[0],coins[1],0)
        
        
print(ans if ans!=11 else -1)

코드가 굉장히 보기싫게 생겼네요..

간단히 설명하자면 2개의 코인 위치를 보내주고 상하좌우 한 방향을 정해서 두개 다 옮겨주었습니다.

이때 배열 밖으로 벗어나게 되면 떨어진 것의 개수를 셀 변수 fallen의 값을 +1해주었습니다. 매번 움직일 때마다 초기화시켜주므로 fallen은 0,1,2 셋 중 하나의 값을 가지게 되어있습니다.

2인 경우 하나만 떨어져야 하는데 두 개 떨어졌으므로 continue

1개만 떨어졌으면 그것이 정답이므로 기존의 정답과 비교해서 작은 값을 정답에 저장해주었습니다. 그리고 하나만 떨어졌다면 남은 하나가지고 탐색을 이어나갈 필요가 없으므로 마찬가지로 continue 시켜주었습니다.

만약 코인을 옮긴 위치가 같아진다면 2개가 겹치게 되고 이 상황에서 뭘 해도 하나만 떨어트릴수는 없으므로 continue 시켜주었습니다.

만약 이동한 코인의 위치가 벽인 경우에는 좌표에 이동하기 이전의 값을 넣어주었습니다.

만약 이동한 코인의 위치가 '.'인 경우에는 기존 코인의 위치와 바꿔주고 코인이 움직였음을 알려줄 변수 coin_moved를 이용해 어떤 코인이 움직였는지를 확인해주었습니다. 백트래킹을 할 때 만약 어떤 코인은 움직이지 않았다면 그 코인을 이동하기 이전의 값으로 바꿀 수는 없고, 어떤 코인도 움직이지 않았다면 이동을 안 한 것이나 다름없기 때문에 아무일도 없도록 코드를 짜 주었습니다.

짜고 보니 엄청 더럽고 시간도 비효율적으로 쓴 느낌이네요.. 최소 횟수다 보니 오히려 bfs로 푸는 쪽이 더 편했을 것이란 생각이 드네요

 

저작자표시 (새창열림)

'Koala - 4기' 카테고리의 다른 글

[BOJ] 백준 두 동전 16197번  (0) 2021.08.07
[BOJ] 1062 가르침  (0) 2021.08.06
[BOJ] 2239 스도쿠  (0) 2021.08.05
[BOJ] 백준 스도쿠 2239번  (0) 2021.08.05
[BOJ 2239번] : 스도쿠  (2) 2021.08.05
'Koala - 4기' 카테고리의 다른 글
  • [BOJ] 백준 두 동전 16197번
  • [BOJ] 1062 가르침
  • [BOJ] 2239 스도쿠
  • [BOJ] 백준 스도쿠 2239번
KauKoala
KauKoala
항공대 알고리즘 동아리 Koala 🥰
Koala항공대 알고리즘 동아리 Koala 🥰
KauKoala
Koala
KauKoala
전체
오늘
어제
  • 분류 전체보기 (1888)
    • 공지 게시판 (10)
    • 정보 게시판 (8)
    • Codeforce (15)
    • acm-icpc (6)
    • Koala - 1기 (16)
    • Koala - 2기 (111)
      • Programming Contest (1)
      • A반 (20)
      • B반 (39)
      • C반 (22)
      • 기초 강의 (18)
    • Koala - 3기 (10)
      • 기초 스터디 (7)
    • Koala - 4기 (67)
    • Koala - 5기 (144)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (68)
    • Koala - 6기 (102)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (25)
      • 모의 테스트 스터디 (1)
    • Koala - 7기 (167)
      • 기초 알고리즘 스터디 (97)
      • 코딩테스트 준비 스터디 (68)
      • 모의 테스트 스터디 (1)
    • Koala - 8기 (44)
      • 기초 알고리즘 스터디 (32)
      • 코딩테스트 준비 스터디 (10)
      • 코드포스 버츄얼 스터디 (0)
      • 프로그래머스 LV2 스터디 (0)
    • Koala - 9기 (205)
      • 기초 알고리즘 스터디 (138)
      • 코딩테스트 준비 스터디 (64)
      • 모의테스트 준비 스터디 (1)
    • Koala - 10기 (117)
      • 기초 알고리즘 스터디 (30)
      • 코딩테스트 준비 스터디 (86)
      • 모의테스트 준비 스터디 (1)
    • Koala - 11기 (151)
      • 기초 알고리즘 스터디 (46)
      • 코딩테스트 준비 스터디 (104)
      • 모의테스트 준비 스터디 (1)
    • Koala - 12기 (86)
      • 기초 알고리즘 스터디 (31)
      • 코딩테스트 준비 스터디 (55)
    • Koala - 13기 (119)
      • 기초 알고리즘 스터디 (52)
      • 코딩테스트 준비 스터디 (67)
    • Koala - 14기 (116)
      • 기초 알고리즘 스터디 (39)
      • 코딩테스트 준비 스터디 (77)
    • Koala - 15기 (138)
      • 기초 알고리즘 스터디 (73)
      • 코딩테스트 준비 스터디 (65)
    • Koala - 16기 (47)
      • 코딩테스트 기초 스터디 (16)
      • 코딩테스트 심화 스터디 (31)
    • Koala - 17기 (62)
      • 코딩테스트 기초 스터디 (15)
      • 코딩테스트 심화 스터디 (47)
    • Koala - 18기 (31)
      • 코딩테스트 기초 스터디 (11)
      • 코딩테스트 심화 스터디 (20)
    • Koala - 19기 (42)
      • 코딩테스트 기초 스터디 (7)
      • 코딩테스트 심화 스터디 (35)
    • Koala - 20기 (0)
      • 코딩테스트 기초 스터디 (0)
      • 코딩테스트 심화 스터디 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 🐨항공대 알고리즘 학회 Koala 3기 모집
  • 🐨항공대 알고리즘 학회 Koala 2기 모집
  • 소모임 소개

인기 글

태그

  • C++
  • BFS
  • dfs
  • 파이썬
  • BOJ
  • 백준
  • dp
  • 백트래킹

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
KauKoala
[BOJ] 16197 두 동전
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.