본문 바로가기

알고리즘 문제풀이/코드트리(삼성 기출)

싸움땅(2022 하반기 오전 1번)

문제 링크: https://www.codetree.ai/frequent-problems/battle-ground/description

 

코드트리

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

빡구현 문제. 하지만 기존 구현 기출보다는 쉽다고 느꼈다. "분명 시험 시간이 1시간 늘었는데도 왜 쉽게 낸 것 같지?"라고 생각하신 분들은 2번을 풀어보시길..........

 

문제에서 필요한 것들을 흐름에 따라 차근차근 생각해보자.

 

- 각 라운드마다,

  - 싸움꾼 번호에 따라 하나씩 이동한다(이동했는데 격자 바깥이면 180도 돌아서 이동)

    - 1. 이동한 위치에 다른 싸움꾼이 있다?

      - 결투+점수 업데이트(함수 fight)

      - a. 패자

        - 무기를 버리고(함수 throw_weapon)

        - 이동할 수 있는 곳 찾아 이동 후 가능하면 무기 교체(함수 loser_move)

      - b. 승자

        - 패자가 버린 무기까지 고려해서 무기 교체(함수 change_weapon)

    - 2. 이동한 위치에 다른 싸움꾼이 없다?

      - 가능하면 무기 교체(함수 change_weapon)

    

*고려해야 할 점

  - 무기 교체 시 최선의 무기 선택 -> 위치에 따른 무기 정보가 담긴 field의 각 위치마다 heapq 사용

    - 파이썬 기준 max heap 사용 위해 음수로 저장, 점수 계산이나 무기 비교할 때 까먹으면 안 됨

  - 싸움꾼 위치정보 및 격자 탐색 -> 이를 위한 war_field matrix 사용

  - 어차피 무기를 교체한다는 건, 무조건 그 위치에 정착한다는 이야기(1-a, 1-b, 2 세가지 케이스 모두)

    - change_weapon 내에 해당 행동을 하는 싸움꾼의 위치를 war_field에 업데이트 하는 코드 추가

  - 동일한 타이밍에 3명 이상의 싸움꾼이 같은 위치에 있는 경우는 "절대" 불가능함 - 왜 그런지 차근차근 생각해보시길

    - war_field는 3차원 리스트까지 갈 필요 없음

  - 점수 업데이트 하는 부분은 승자 정하는 함수 fight에 추가

 

이 정도 고려해서 문제를 풀면 된다.