👨‍💻
Hamin TIL
  • Today I Learned 🧑🏻‍💻
  • 회고
  • git
    • git_basics
      • Git 101
      • Git branch
      • Git_ignore
    • Git Book
    • 우아한형제들
    • pull_request
  • db
    • DA
      • 데이터표준화
      • 데이터_요건분석
      • 전사아키텍처_이해
      • 데이터모델링
    • SQL
      • SQL기본및활용
        • SQL활용
          • 절차형SQL
          • 계층형질의와셀프조인
          • DCL
          • 그룹함수
          • 윈도우함수
          • 표준조인
          • 집합연산자
          • 서브쿼리
        • SQL고급활용및튜닝
          • 옵티마이저와실행계획
          • 조인수행원리
          • 인덱스기본
        • SQL기본
          • 함수
          • 관계형데이터베이스개요
          • GROUPBY,HAVING절
          • DDL
          • 조인
          • ORDERBY절
          • DML
          • WHERE절
          • TCL
      • 데이터모델링의이해
        • 데이터모델과성능
          • 정규화의 성능
          • 데이터베이스구조와성능
          • 분산데이터베이스와성능
          • 대량 데이터에 따른 성능
          • 반정규화와 성능
          • 성능데이터모델링의 개요
        • 데이터모델링의이해
          • 식별자
          • 속성
          • 관계
          • 엔터티
          • 데이터 모델의 이해
    • DB
  • trouble
    • libomp
    • After macOS update, git command
    • system
  • algorithm
    • BOJ
      • 평범한 배낭
      • 17825-주사위윷놀이
      • 14888-연산자끼워넣기
      • 14503-로봇청소기
      • 10157
      • 14502-연구소
      • 18428-감시피하기
      • 14501
      • 18405-경쟁적전염
      • 14499-주사위굴리기
      • 16236-아기상어
      • 15686-치킨배달
      • 19237-어른상어
      • 16234-인구이동
      • 19236-청소년상어
      • 1339-단어수학
      • 리모콘
      • 18353 - 병사배치하기
      • 18352-특정거리의도시찾기
      • 12100-2048
      • N-Queen
      • 3190-뱀
      • 11724
    • programmers
      • 영어끝말잇기
      • 기둥과 보
      • H - index
      • 정수삼각형
      • 2018 KAKAO BLIND RECRUITMENT - 압축
      • 삼각달팽이
      • 거스름돈
      • [1차] 셔틀버스
    • data_structure
      • Queue
      • Graph
      • Stack
      • Hash table
    • implementation
      • dynamic_programming
      • sort
      • Least common multiple
      • dfs
      • dijkstra
      • bfs
      • binary_search
    • aps
      • notes
    • modules
  • python
    • requirements.txt
    • Jupyter notebook
    • 00_들어가기 전에
    • Python Virtual Environment
    • Python Syntax
  • django
    • Class Based View in Django
    • Model in Django
    • URL Name
    • Form and ModelForm
    • Authentication
    • Tips & Tricks
    • Optimization
    • Request and Response Objects
    • Templates
    • Variable Routing & DTL
    • Django REST API with JSON web token (JWT)
    • Intro to Django
    • Django REST Framework
    • Wrap-up
    • Image Upload
  • javascript
    • Ajax (Asynchronous Javascript And XML)
    • Document Object Model
    • Java Script 101
    • ES (ECMAscript)
  • java
    • Java 101
  • aws
    • beginning_cloud_computing_with_aws
      • 02 AWS 주요 서비스 이해하기
      • 01 아마존 웹 서비스 Cloud 개요
  • programming
    • Communication
    • CS_용어사전
  • vue.js
    • 01_Vue.js_Intro
  • data_science
    • 01_데이터에서인사이트발견하기
    • pandas
    • 04_데이터분류모델
    • 02_텍스트마이닝첫걸음
    • 05_종합예제
    • 03_미래를예측하는데이터분석
    • Statistics
      • 모수와 추정량
    • 통계학노트
  • linux
    • Linux Commands
  • ide
    • VScode
    • Pycharm
  • html,css
    • HTML 101
    • CSS 101
  • colab
    • colab_101
  • 의사결정나무및모형비교
Powered by GitBook
On this page

Was this helpful?

  1. algorithm
  2. BOJ

19237-어른상어

Previous15686-치킨배달Next16234-인구이동

Last updated 4 years ago

Was this helpful?

  1. 모든 냄새 업데이트

  2. 모든 상어들을 조건에 맞게 이동

    1. 냄새가 존재하지 않는 곳을 우선순위에 따라 탐색

    2. 자신의 냄새를 우선순위에 따라 탐색

  3. 시간 추가

  4. 1번 상어만 남았다면 시간 출력

  5. 1,000 초가 지났다면 -1 출력

n, m, k = map(int,input().split())

# 모든 상어의 위치를 포함하는 2차원 리스트
array = []
for i in range(n):
    array.append(list(map(int, input().split())))

# 모든 상어의 현재 방향 정보
directions = list(map(int, input().split()))

# 각 위치마다 [특정 냄새의 상어 번호, 특정 냄새의 남은시간]을 저정하는 2차원 리스트
smell = [[[0, 0]] * n for _ in range(n)]

# 각 상어의 회정 방향 우선 순위 정보
priorities = [[] for _ in range(m)]
for i in range(m):
    for j in range(4):
        priorities[i].append(list(map(int, input().split())))

# 특정 위치에서 이동 가능한 4가지 방향
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

'''
인풋은 필요한 공간을 만들어주고 삽입하는 식으로 만들어보자
'''

''''''''''''''''''''''''''''''''''''
def update_smell():
    # 모든 위치 확인
    for i in range(n):
        for j in range(n):
            # 냄새가 존재한다면, 시간 1 만큼 감소시키기
            if smell[i][j][1] > 0:
                smell[i][j][1] -= 1
            # 상어가 존재한다면 해당 위치 냄세 k 로 설정
            if array[i][j] != 0:
                smell[i][j] = [array[i][j], k]
                '''냄새로 그냥 상어번호와 방향정보 있는 리스트랑 냄새 넣어버리기'''
''''''''''''''''''''''''''''''''''''''''''
def move():
    # 이동 결과를 담기 위해 임시 결과 테이블을 초기화하자
    # 새로 작성할 arr 은 비어있어야 한다..! 그래야 기존의 arr 가 남지 않으니
    # 그로 인해 이동된 상어만 할당해주면 된다.
    new_array = [[0] * n for _ in range(n)]
    # 모든 위치 확인
    for x in range(n):
        for y in range(n):
            # 기존 arr 에 상어가 있다면
            if array[x][y] != 0:
                # 현재 상어의 방향을 변수로 잡아주자 !! 필요하니까 !!
                direction = directions[array[x][y] - 1]

                # 우선 냄새가 존재하지 않는 곳이 있는지 확인하자
                # 여기서 확인하는 순서가 중요하다.
                    # 현재 상어번호에 해당하는 인덱스 들어가서,
                        # 현재 상어의 방향에 해당하는 인덱스 들어가서,
                            # 순서대로 0~3 까지 순서대로 -> 반복문
                                # 그럼 결과적으로 1,2,3,4 방향을 찾는데 -1 해줘서 x 에 더해주자
                '''냄새가 존재하지 않는 곳을 찾았다면, 자신의 냄새가 있는 곳을 탐색할 필요 없으니 이를 if, continue 로 구현 '''
                found = False
                for index in range(4):
                    nx = x + dx[priorities[array[x][y] - 1][direction - 1][index] - 1]
                    ny = y + dy[priorities[array[x][y] - 1][direction - 1][index] - 1]
                    # 우선순위에 따라 탐색을 하기 위해 다음 방향을 잡았으니 이제 인덱스범위를 찾자
                    if 0 <= nx < n and 0 <= ny < n:
                        # 냄새가 존재하지 않으면
                        if smell[nx][ny][1] == 0:
                            # 상어 이동시키는데 먼저 상어의 현 방향 업데이트
                            directions[array[x][y] - 1] = priorities[array[x][y] - 1][direction - 1][index]
                            # 이동하는데 만약 이미 다른 상어가 있다면
                            if new_array[nx][ny] != 0:
                                new_array[nx][ny] = min(new_array[nx][ny],array[x][y])
                            else:
                                new_array[nx][ny] = array[x][y]
                            '''여기 도달했다는 것은 냄새가 존재하지 않는 곳을 찾아 이동했다는 것이니'''
                            found = True
                            # 더 이상 냄새가 존재하지 않는 곳을 탐색할 필요 없으니
                            break
                '''냄새가 존재하지 않는 곳을 찾았었다면 이후 자신의 냄새를 찾지 않는다.'''
                if found:
                    continue
                # 냄새가 존재하지 않는 곳이 없으니 자신의 냄새 찾자
                # 여기서도 확인하는 순서가 중요하다.
                    # 현재 상어번호에 해당하는 인덱스 들어가서,
                        # 현재 상어의 방향에 해당하는 인덱스 들어가서,
                            # 순서대로 0~3 까지 순서대로 -> 반복문
                                # 그럼 결과적으로 1,2,3,4 방향을 찾는데 -1 해줘서 x 에 더해주자
                for index in range(4):
                    nx = x + dx[priorities[array[x][y] - 1][direction - 1][index] - 1]
                    ny = y + dy[priorities[array[x][y] - 1][direction - 1][index] - 1]
                    # 우선순위로 탐색방향을 일단 잡았으니 인덱스 범위 확인하자
                    if 0 <= nx < n and 0 <= ny < n:
                        # 자신의 냄새라면
                        if smell[nx][ny][0] == array[x][y]:
                            # 그곳으로 이동할 것이니 일단 현재 상어의 방향 수정하자
                            directions[array[x][y] - 1] = priorities[array[x][y] - 1][direction - 1][index]
                            # 상어 이동
                            '''다른 상어가 있다면 자신의 냄새가 존재할 수 없다는 것을 인지하자'''
                            new_array[nx][ny] = array[x][y]
                            # 더이상 자신의 냄새가 있는 곳을 탐색할 필요가 없으니
                            break
    # 모든 상어에 대하여 이동을 완료했으니
    return new_array
''''''''''''''''''''''''''''''''''''
# 걸린시간
time = 0
while True:
    # 모든 곳 냄새 업데이트
    update_smell()
    # 모든 상어 이동시키기
    '''이렇게 arr 를 수정시키는 경우 새로운 arr 을 반환하는 함수를 넣자'''
    new_array = move()
    '''기존의 배열은 이동한 배열로 바꿔주자'''
    array = new_array
    time += 1

    # 1번 상어만 남았는지 체크
    check = True
    for i in range(n):
        for j in range(n):
            # 1보다 큰 상어가 존재한다면
            if array[i][j] > 1:
                # 1번 외의 상어가 존재하면 표시남겨줌
                check = False

    # 표시가 없다면
    if check:
        print(time)
        break

    # 1,000초가 지났다면
    if time >= 1000:
        print(-1)
        break
www.acmicpc.net/problem/19237