마법사 상어와 토네이도
생각한 부분
토네이도 이동 방향 : 좌,하,우,상 토네이도 이동 칸 수 : 1,1,2,2,3,3,4,4...
토네이도의 이동방향과 이동 칸 수의 규칙성을 찾긴 했는데 델타 어레이로 코드로 어떻게 구현해야할지 감을 잡을 수 없었고 좀 어려웠다. 하지만 그냥 하면 구현하면 되는 거였다! 내가 참고한 솔루션에서는 a를 제외한 8개 칸에 대해 일련의 순서대로 8개 방향의 델타어레이를 만들었다! 좌, 하에 해당하는 방향은 dx, dy 모두 맞았지만 우-dx, 상-dy에서 순서가 바꼈었다.
일단 상-dy에서는 문제에서 제시된 모래 이동 방향을 시계방향으로 90도 회전한 것이기 때문에 일련의 순서 또한 90도 회전해야하는 것이 맞다. 우-dx도 마찬가지로 문제에서 주어진 왼쪽 이동 그림을 회전하면 된다. 숫자가 대칭을 이루며 동일하기 때문에 순서가 바뀌어도 결과값은 동일하지만, 정확하고 일관성있게 구현하도록 노력하자!
잘못 이해한 부분 토네이도가 현재 (3,1)에 있고, 오른쪽 방향으로 2칸 이동할 때, 순간이동하는 것처럼 (3,1)=>(3,3) 으로 바로 이동한다고 생각했다. 하지만 이동하는 "칸수"가 "2"인 만큼, 토네이도는 (3,1)->(3,2)->(3,3) 이렇게 한칸씩 이동한다!⭐️⭐️따라서 (3,3)에 모래양이 0이여서 모래가 제대로 확산하지 못했지만, 토네이도가 이동하는 칸수를 한 칸씩 이동시키면 이동하는 칸마다 모래양이 존재한다! => 이동하는 칸수 만큼 토네이도 이동을 반복한다! for(int d=0;d<4;d++) {//좌하우상 for(int moveCount=0;moveCount<dc[d];moveCount++){//현재 방향에 따라 이동할 칸수 다름!
구현 Skill⭐️⭐️⭐️⭐️⭐️ 스텝 바이 스텝. 단계별로 하나씩 구현해나가는 것이 필요하다...숫자가 나와서 더 복잡할 것만 같고, 소수 얘기(소수는 버린다는 얘기)가 있길래 자료형 소수를 저장하는 것으로 해야하는지, 계산이 어떻게 이뤄질지 겁부터 났다..ㅋㅋ어려운 척 연기하는 문제에 압도당해버린 것이다. 구현은 일단 귀차니즘은 완전히 버려야한다. - 귀차니즘 버리기 성공. 그리고 어렵다고 생각하는 부분을 구체화시켜서 생각을 확장해나가야 한다!⭐️⭐️⭐️⭐️⭐️ =>y에 있는 모래 확산, 9개 좌표로 이동. => 각 9개 칸에 해당하는 비율을 저장한 배열을 만들어서 이 또한 하나의 델타어레이로 9개 좌표로 모래 확산양 쉽게 계산할 수 있다!!!!!! 좌하우상 방향에 따라 비율 좌표가 달라지기 때문에 spreadX[d][s] 로 구현된다. (d = 좌하우상 중 방향, s = 9개의 좌표)
토네이도 이동을 반복하는 조건 : 이동하는 위치가 격자 범위를 벗어나면 이동 종료. 핵심 구현 부분
이동 방향 : 좌하우상✅
이동 칸 갯수 : {1,1,2,2} => 이동방향 한 싸이클을 돌면 2씩 증가⭐️⭐️⭐️⭐️⭐️
이동한 위치(nx,ny)의 값으로 모래 확산 연산 : int sand에 y 저장. 확산 후 y는 0이 되기 때문에 Map[nx][ny] = 0으로 셋팅.
모래가 확산되는 9개 좌표 구하기 : 일련의 순서로 9개 좌표(x,y) 델타어레이 생성 문제에서 주어졌듯이 방향에 따라 주어진 그림을 회전시키면 된다.⭐️⭐️⭐️⭐️⭐️ 오른쪽 위에서부터 알파칸을 제외하고 9개 좌표에 1번부터 숫자를 부여함. 근데 숫자가 대칭적으로 같기 때문에 좌표 번호가 1,2 => 2,1 바뀌어도 결과값은 같지만, 손가락을 비틀어서라도 정확하게 일관성있게 구현하도록 하자!
모래가 확산되는 9개 좌표 각각 확산 비율 : 확산 비율 정수 저장하는 델타어레이 생성⭐️⭐️⭐️
생각 확장해나가기
이동 방향
⬅ | ⬇ | ➡ | ⬆ |
이동하는 칸 갯수 : 좌하우상 한 싸이클 돌 때마다 2씩 증가한다는 것을 알 수 있다!
⬅ | ⬇ | ➡ | ⬆ |
1 | 1 | 2 | 2 |
3 | 3 | 4 | 4 |
5 | 5 | 6 | 6 |
... | ... | ... | ... |
모래가 확산하는 9개 좌표 : 각 좌표에 번호를 부여해서 이 번호 순서대로 구현하면 헷갈리는 것을 줄일 수 있다! spreadX = {{{-1,1,-2,-1,1,2,-1,1,0},
{-1,-1,0,0,0,0,1,1,2},
{1,-1,2,1,-1,-2,1,-1,0},
{1,1,0,0,0,0,-1,-1,-2}}; spreadY = {{1,1,0,0,0,0,-1,-1,-2},
{-1,1,-2,-1,1,2,-1,1,0},
{-1,-1,0,0,0,0,1,1,2},
{1,-1,2,1,-1,-2,1,-1,0}};
Last updated