GreatAlgorithm-Study / AlgorithmStudy

🌟알고리즘 대장정🌟
6 stars 4 forks source link

[11주차_월요일] 팩맨 #143

Open yeongleej opened 4 days ago

yeongleej commented 4 days ago
### 🤔 시간복잡도 고려사항

### 💡 풀이 아이디어
KodaHye commented 3 days ago

🤔 시간복잡도 고려사항

전에 백준에서 똑같은 문제를 풀었었고, 이번에 문제 풀이도 저번이랑 비슷하게 했는데, 코드트리에서는 백준에서 맞은 방법으로 풀이했을 때 시초가 발생하더라고요?,,,

HashMap을 사용했을 때 시간이 조금 더 걸려도, 시간 초과는 발생하지 않을거라고 생각했는데,,, 요상하네요 !!,,,

(백준에서는 HashMap이 아닌 ArrayList로 몬스터들을 관리했긴 합니다! 그래도 구현 흐름은 비슷한데,,,, ㅠ!!!)


💡 풀이 아이디어

변수에 대한 설명

함수에 대한 설명

Jewan1120 commented 2 days ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

설명 쓰기 빡세군요.. 엄청난 구현 문제였습니다.

yeongleej commented 1 day ago

🤔 시간복잡도 고려사항

=> 최대 경우의 수 : O( t 64 16) => 완전탐색 가능

💡 풀이 아이디어

** 각각의 배열 리스트에는 알, 몬스터의 방향이 저장됨



**1. 몬스터 복제 시도** : `makeEgg()` 
- 알 생성하기
- 살아있는 몬스터들과 동일한 위치와 동일한 방향으로 알 생성하기

**2. 몬스터 이동** : `moveMonster()` 
- 몬스터들이 움직여야 하므로 임시 배열 생성해서 몬스터 움직임 저장하기
    - `List<Integer>[] tmp = new ArrayList[N*N];`
- 몬스터 반복
-  이동 할 곳이 범위에 벗어나지 않고 && 팩맨의 위치가 아니고 && 시체의 위치가 아니라면 이동
    - 시체 위치 => `ghost[i][j]`는 (i, j)에서 죽은 몬스터의 턴 수가 기록됨  
- 8방향 모두 돌았는데 이동할 곳이 없다면 원래 위치 저장
- 이동한 몬스터의 임시배열을 원본배열로 저장
    - `mrr = tmp`

**3. 팩맨 이동** : `movePacman()`
- `makePacDir()`: **중복 순열** 구하기
    - `dList` : 우선순위에 따른 팩맨의 이동경로
        - [(상상상), (상상좌), .......] => 64개
    - 미리 팩맨의 이동 경로 구해놓고 반복
- `countMonster(drr)` : 이동경로 drr에 따른 먹을 수 있는 몬스터 개수 구하기
    - ❗  이때 주의해야 할 점은,  경로에서 먹었던 몬스터를 또 먹으면 안되므로 방문배열로 기록하기
- 가장 많이 먹을 수 있는 이동 경로를 구하고, 팩맨 이동시키기
- 시체 기록하기
    - `ghost[i][j] = nowTurn` : 팩맨이 (i, j)에서 몬스터를 먹은 턴수 기록
    - (시체는 같은 위치에 또 다른 시체가 생기면 가장 최근에 생긴 턴 수에 +2 만큼 후에 없어지므로 갱신해도 됨)

**4. 몬스터 시체 소멸** : `removeGhost()`
- `ghost[i][j] + 2`가 nowTurn과 같으면 해당 시체는 소멸됨

**5. 몬스터 복제 완성**
- `egg`에 있던 알들을 몬스터 배열 리스트 `mrr`에추가

> 팩맨의 이동 경로에서 먹었던 몬스터를 다시 먹지 않는 것을 주의해야 하는 문제인 것 같습니다