developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 삼성코테자바풀이
  • 코테파이썬
  • MA모형
  • 삼성코테구현문제추천
  • 데이터분석
  • 시계열분석
  • BOJ파이썬풀이
  • 삼성코테기출자바풀이
  • c++ 빌더 패턴
  • 삼성코테파이썬
  • 삼성코테파이썬풀이
  • 삼성코테파이썬준비
  • 시계열
  • 삼성코테구현풀이
  • 삼성코테준비
  • SW역량테스트파이썬
  • 카카오코테java풀이
  • AR모형
  • Arima
  • 통계분석
  • c++디자인패턴
  • 삼성코테기출
  • 통계학
  • 백준파이썬풀이
  • SW역량테스트파이썬풀이
  • ARIMA모형
  • 삼성코테자바준비
  • 삼성코테자바꿀팁
  • 운영체제인터럽트
  • 카카오코테

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 청소년 상어 19236번 (python)

2021. 10. 19. 20:17

❓ 문제 - 백준 청소년 상어 19236번 - python 풀이법

 

출처 

(https://www.acmicpc.net/problem/19236)

 

19236번: 청소년 상어

첫째 줄부터 4개의 줄에 각 칸의 들어있는 물고기의 정보가 1번 행부터 순서대로 주어진다. 물고기의 정보는 두 정수 ai, bi로 이루어져 있고, ai는 물고기의 번호, bi는 방향을 의미한다. 방향 bi는

www.acmicpc.net

 

 

 

📝 문제해결법

1. 이 문제는 구현+DFS로 풀었다.

  • 4*4 공간의 board 안에 물고기가 들어있는 번호, 방향을 저장한다. 만약 물고기가 잡아먹혔을 때 번호를 0으로 바꾼다.
  • DFS를 통해 상어가 해당 방향으로 움직였을 때, 먹은 물고기의 번호로 점수를 더해주고 상어가 먹은 물고기 번호의 합의 최대값을 갱신한다. 또한 상어가 이동한 지역의 물고기를 먹으므로 해당 지역의 물고기 번호를 0으로 변경한다.
  • 상어가 물고기를 먹은 후 물고기의 움직임이 일어나는데, 물고기의 이동은 순서대로 진행되므로 보드에서 해당 물고기의 번호가 존재(먹히지 않았음)하면 해당 물고기의 방향대로 이동할 수 있다면 이동하는 곳의 위치와 현재 위치에 board 정보를 서로 변경하고, 만약 해당 방향에 이동할 수 없다면 45도 반시계 방향으로 계속 돌면서 이동할 수 있는 곳을 찾는다.
  • 물고기가 다 이동한 후, 상어의 이동이 시작되는데 상어의 현재 방향대로 갈 수 있는 모든 곳에 이동이 가능하면(범위 안 넘고, 물고기가 존재함) DFS로 들어가서 물고기를 먹는다.
  • 모든 DFS를 돈 후 상어가 먹은  물고기 번호의 최대값을 출력한다.

2. 문제 푼 후 느낀점

  • 처음 DFS 고려 안 하고 상어가 이동할 방향에서 갈 수 있는 모든 곳의 최대값으로 이동하는 구현을 했으나 최대값, 최솟값은 완전탐색의 문제라는 의심을 항상 하고 있어야한다.
  • 주어진 문제의 조건을 잘 고려해서 섬세하게 구현해야한다.

 

💻 소스코드

   
# 청소년 상어 - BOJ 19236
# DFS+구현
import copy

board = [[] for _ in range(4)]

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

for i in range(4):
    data = list(map(int, input().split()))
    fish = []
    for j in range(4):
        # 물고기 번호, 방향
        fish.append([data[2*j], data[2*j+1]-1])
    board[i] = fish


max_score = 0


def dfs(sx, sy, score, board):
    global max_score
    score += board[sx][sy][0]
    max_score = max(max_score, score)
    board[sx][sy][0] = 0

    # 물고기 움직임
    for f in range(1, 17):
        f_x, f_y = -1, -1
        for x in range(4):
            for y in range(4):
                if board[x][y][0] == f:
                    f_x, f_y = x, y
                    break
        if f_x == -1 and f_y == -1:
            continue
        f_d = board[f_x][f_y][1]

        for i in range(8):
            nd = (f_d+i) % 8
            nx = f_x + dx[nd]
            ny = f_y + dy[nd]
            if not (0 <= nx < 4 and 0 <= ny < 4) or (nx == sx and ny == sy):
                continue
            board[f_x][f_y][1] = nd
            board[f_x][f_y], board[nx][ny] = board[nx][ny], board[f_x][f_y]
            break

    # 상어 먹음
    s_d = board[sx][sy][1]
    for i in range(1, 5):
        nx = sx + dx[s_d]*i
        ny = sy + dy[s_d]*i
        if (0<= nx < 4 and 0<= ny < 4) and board[nx][ny][0] > 0:
            dfs(nx, ny, score, copy.deepcopy(board))

dfs(0, 0, 0, board)
print(max_score)

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

BOJ - 스타트택시 19238번 (python)  (0) 2021.10.20
BOJ - 어른 상어 19237번 (python)  (0) 2021.10.20
BOJ - 모노미노도미노2 20061번 (python)  (0) 2021.10.19
BOJ - 주사위 윷놀이 17825번 (python, JAVA)  (0) 2021.10.18
BOJ - 원판 돌리기 17822번 (python)  (0) 2021.10.18
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 스타트택시 19238번 (python)
    • BOJ - 어른 상어 19237번 (python)
    • BOJ - 모노미노도미노2 20061번 (python)
    • BOJ - 주사위 윷놀이 17825번 (python, JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바