[BOJ 26169번] 세번 이내에 사과를 먹자(Python)

2024. 3. 11. 12:33· 코딩 테스트 준비/5정한
목차
  1. 📝 문제
  2. ✅ 풀이

📝 문제

💡 5 x 5 크기의 보드가 주어진다.
보드는 1 x 1 크기의 정사각형 격자로 이루어져 있다.
보드의 격자는 사과가 1개 있는 격자, 장애물이 있는 격자, 빈칸으로 되어 있는 격자로 구분된다.
격자의 위치는 (r, c)로 표시한다.
r은 행 번호, c는 열 번호를 나타낸다.
행 번호는 맨 위 위치가 0이고 아래 방향으로 1씩 증가한다.
열 번호는 맨 왼쪽 위치가 0이고 오른쪽으로 1씩 증가한다.
즉, 맨 왼쪽 위 위치가 (0, 0), 맨 아래 오른쪽 위치가 (4, 4)이다.

현재 한 명의 학생이 (r, c) 위치에 있고,
한 번의 이동으로 상, 하, 좌, 우 방향 중에서 한가지 방향으로 한 칸 이동할 수 있다.
학생이 사과가 있는 칸으로 이동하면 해당 칸에 있는 사과를 1개 먹는다.
장애물이 있는 칸으로는 이동할 수 없다.
학생이 지나간 칸은 학생이 해당 칸을 떠나는 즉시 장애물이 있는 칸으로 변경된다.
즉, 학생이 해당 칸에서 상, 하, 좌, 우 방향으로 한 칸 이동하는 즉시
해당 칸은 장애물이 있는 칸으로 변경된다.

학생이 현재 위치 (r, c)에서 세 번 이하의 이동으로
사과를 2개 이상 먹을 수 있으면 1을 출력하고, 그렇지 않으면 0을 출력하자.
⚙️ 입력 : 첫 번째 줄부터 다섯 개의 줄에 걸쳐 보드의 정보가 주어진다.
i번째 줄의 j번째 수는 보드의 (i - 1)번째 행, (j - 1)번째 열의 정보를 나타낸다.
보드의 정보가 1이면 해당 칸은 사과가 1개 있는 격자임을 나타내고,
0이면 빈칸이 있는 격자를 나타내고, -1이면 장애물이 있는 격자임을 나타낸다.
다음 줄에 학생의 현재 위치 r, c가 빈칸을 사이에 두고 순서대로 주어진다.
⚙️ 출력 : 첫 번째 줄에 학생이 현재 위치 (r,  c)에서
세 번 이하의 이동으로 사과를 2개 이상 먹을 수 있으면 1을 출력하고, 먹을 수 없으면 0을 출력한다.

 

문제링크

 

26169번: 세 번 이내에 사과를 먹자

5 x 5 크기의 보드가 주어진다. 보드는 1 x 1 크기의 정사각형 격자로 이루어져 있다. 보드의 격자는 사과가 1개 있는 격자, 장애물이 있는 격자, 빈칸으로 되어 있는 격자로 구분된다. 격자의 위치

www.acmicpc.net


✅ 풀이

board = []
for i in range(5):
    board.append(list(map(int, input().split())))

r, c = map(int, input().split())
bool = False

def dfs(r,c,move,cnt):
    global bool

    cnt = cnt
    if r > 4 or c > 4 or r < 0 or c < 0 or move > 3:
        return

    if board[r][c] == -1:
        return

    if board[r][c] == 1:
        cnt += 1

    temp = board[r][c]
    board[r][c] = -1

    if cnt == 2:
        bool = True
        return

    dfs(r+1, c, move+1, cnt)
    dfs(r-1, c, move+1, cnt)
    dfs(r, c+1, move+1, cnt)
    dfs(r, c-1, move+1, cnt)

    board[r][c] = temp

dfs(r,c,0,0)
if bool:
    print(1)
else:
    print(0)
💡 backtracking의 중요성을 깨닫게 된 문제이다.
먼저 재귀적으로 탐색하며, 보드판을 넘어가거나 3회 초과로 이동했을 경우 멈췄다.
또한 방문한 장소에 장애물이 있을 경우에도 재귀를 멈췄다.
만약 방문한 장소에 사과가 있다면 cnt에 1을 더해주었고,
방문한 장소에 장애물을 두기 위해서 -1로 값을 바꿔주었다.

여기서 문제가 발생하는데,
만약 원래 방문한 장소의 값을 저장해두고 나중에 복원해주는 작업을 하지 않으면,
나중에 재귀에 의해 같은 장소를 방문했을 경우 바뀐 값으로 체크가 되기 때문이다.

따라서 해당 작업을 추가해준 다음,
사과를 2개 먹는 순간 불필요하게 추가적인 재귀를 하지 않도록
bool을 True로 바꾸고 재귀를 멈췄다.

모든 조건을 설정한 다음엔 상, 하, 좌, 우 방향으로 이동하며 재귀를 진행하도록 했다.
저작자표시 비영리 변경금지 (새창열림)
  1. 📝 문제
  2. ✅ 풀이
'코딩 테스트 준비/5정한' 카테고리의 다른 글
  • [BOJ 2217번] 로프(Python)
  • [BOJ 1205번] 등수 구하기(Python)
  • [BOJ 1969번] DNA(Python)
  • [BOJ 16173번] 점프왕 쩰리 (Small)(Python)
zzzini
zzzini
종착지는 어디인지 모르지만
zzzini
나의 표류일지
zzzini
전체
오늘
어제
  • 분류 전체보기 (307)
    • ASAC 빅데이터 분석가 4기 (44)
      • Python기초 (6)
      • SQL (3)
      • Matplotlib & Seaborn (2)
      • Data Handling (6)
      • Web Crawling (3)
      • Machine Learning (9)
      • Deep Learning (10)
      • 데이터 분석 (1)
      • 기타 (2)
      • 수학 (2)
    • 코딩 테스트 준비 (168)
      • 5정한 (132)
      • 카카오 (14)
      • PCCP & PCCE (3)
      • 프로그래머스 (19)
    • 자격증 (35)
      • AWS CLF-C02 (18)
      • AWS SAA-C03 (1)
      • Tableau Desktop Specialist (5)
      • Tableau Certified Data Anal.. (11)
    • 독서 (17)
    • Tech (23)
      • Tableau (10)
      • AI (4)
      • Flask (1)
      • Node.js (2)
      • Cloud Computing (2)
      • Git & GitHub (1)
      • Notion API (1)
      • Linux (2)
    • Projects (2)
    • 알고리즘 공부 (6)
    • 🎵 (11)

블로그 메뉴

  • 글 쓰기
  • 홈
  • 방명록

공지사항

hELLO · Designed By 정상우.v4.2.1
zzzini
[BOJ 26169번] 세번 이내에 사과를 먹자(Python)
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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