Carnival7
Change Developer
Carnival7
전체 방문자
오늘
어제
  • 분류 전체보기
    • 자바의 정석
    • 프로그래밍 언어별 tools
      • 파이썬
      • 자바
    • 코딩 테스트
      • 백준 강의 기초편
      • 백준 강의 연습편
      • 백준 강의 문제편
      • 삼성 기출
      • 백준 - 일반
      • 카카오 기출
      • 프로그래머스 - 일반
      • 코테 풀이 Tools
    • CS
      • Network
      • 운영체제
      • 알고리즘
      • DB
    • Web_Backend
      • Spring
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
      • 스프링 핵심 원리 - 기본편
    • DevOps
    • IT 업무 지식
      • 인프라
      • 클라우드
    • 자격증
      • AWS - CLF
      • 정처기 - 실기
    • 생각 정리

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 코딩테스트 #삼성기출 #구현 #시뮬레이션
  • 스프링 #인터셉터 #AOP #필터
  • 삼성기출 #백준강의문제편
  • DevOps
  • 스프링 #AOP
  • ci/cd
  • 스프링 부트 무중단 웹 서비스
  • DMZ
  • 알고리즘 #백준강의기초편 #코딩테스트
  • 프로그래머스 #카카오기출 #레벨2
  • code deploy
  • 슬라이딩 윈도우
  • nginx
  • 삼성기출 #2023 #상반기
  • 슬라이딩 윈도우 #덱
  • Github Actions

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Carnival7

Change Developer

코딩 테스트/백준 강의 연습편

브루트포스) 16197.두 동전

2022. 6. 7. 18:26

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

 

16197번: 두 동전

N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고,

www.acmicpc.net

dx = [0,0,1,-1]
dy = [1,-1,0,0]
# 두 동전 중 하나만 보드에서 떨어뜨리기 위해 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램
def recur(step,x1,y1,x2,y2):
    # 버튼을 10번보다 많이 눌러야 한다면, -1 출력
    if step==11:
        return -1
    fall1=False
    fall2=False
    # 동전이 이동하려는 방향에 칸이 없으면 동전은 보드 바깥으로 떨어진다.
    if x1<0 or x1>=n or y1<0 or y1>=m:
        fall1=True
    if x2<0 or x2>=n or y2<0 or y2>=m:
        fall2=True
    # 두 동전을 떨어뜨릴 수 없으면 -1 출력
    if fall1 and fall2:
        return -1
    if fall1 or fall2:
        return step
    ans=-1

    for k in range(4):
        nx1,ny1,nx2,ny2=x1+dx[k],y1+dy[k],x2+dx[k],y2+dy[k]
        # 동전이 이동하려는 칸이 벽이면, 동전은 이동하지 않는다.
        if 0<=nx1<n and 0<=ny1<m and a[nx1][ny1]=='#':
            nx1, ny1 = x1,y1
        if 0<=nx2<n and 0<=ny2<m and a[nx2][ny2]=='#':
            nx2, ny2 = x2,y2
        temp=recur(step+1,nx1,ny1,nx2,ny2)
        if temp==-1:
            continue
        # 버튼의 최소 횟수를 출력
        if ans==-1 or ans>temp:
            ans=temp
    return ans

n,m=map(int,input().split())
x1=x2=y1=y2=-1 # 두 동전 위치
a=[list(input()) for _ in range(n)]
# 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고, 두 동전의 위치는 다르다.
for i in range(n):
    for j in range(m):
        if a[i][j]=='o': # 동전 위치 찾으면
            if x1==-1:
                x1,y1=i,j
            else:
                x2,y2=i,j
            a[i][j]='.' #  해당 칸은 빈 칸으로. 이동하려는 칸에 동전이 있는 경우에도 한 칸 이동한다라는 조건에 대해, 빈 칸으로 만들어줘서 더 편하게 탐색하기 위해
print(recur(0,x1,y1,x2,y2))

'코딩 테스트 > 백준 강의 연습편' 카테고리의 다른 글

시뮬레이션과 구현) 16974.레벨 햄버거  (0) 2022.06.09
브루트포스) 16198.에너지 모으기  (0) 2022.06.07
브루트포스) 14500.테트로미노  (0) 2022.06.07
브루트포스) 15659.연산자 끼워넣기(3)  (0) 2022.06.07
브루트포스) 15658.연산자 끼워넣기(2)  (0) 2022.06.07
    '코딩 테스트/백준 강의 연습편' 카테고리의 다른 글
    • 시뮬레이션과 구현) 16974.레벨 햄버거
    • 브루트포스) 16198.에너지 모으기
    • 브루트포스) 14500.테트로미노
    • 브루트포스) 15659.연산자 끼워넣기(3)
    Carnival7
    Carnival7

    티스토리툴바