마법사 상어와 비바라기
혼자 힘으로 풀었다. 답이 나오긴 했는데 마지막에 구름 생성하는 부분에서 컬렉션의 좌표에 있는 것을 제외하는 부분에서 틀렸었닫. 이 부분을 어떻게 처리할까 고민 많이 하면서 코드를 짰는데 역시 이 부분에서 틀렸다.
나처럼 컬렉션으로 구름 정보를 저장한 코드를 샅샅이 찾아봤다. 나와 로직 구현이 거의 비슷했다. 이 레퍼런스를 통해 2차원 boolean 배열 check을 이용함으로써 해결할 수 있다는 인사이트를 얻었다!!
구름이 이동한 후에, 그 이동후 좌표를 true로 마킹함으로써, 구름 생성할 때 check배열값이 true인지 확인함으로써 필터링하여 해결할 수 있다!!!
내가 원래 짠 코드에서 boolean 2차원 배열 객체 추가해서 2-3줄만 추가함으로써 정답을 맞출 수 있었다!!!!!!!!!!!!너무 감격스럽다ㅠㅠ이렇게 혼자 힘으로 골드5문제 맞춘적도 없지만 이렇게 정답과 근사하게 코드로 구현핸낸 능력도 많이 길러진 것 같다!
역시 이해 안되는 부분은 외우고, 좋은 코드를 많이 보는 것이 도움이 많이 되는 것 같다!
현재 내코드의 시간, 메모리는 216ms, 25956KB 이다. 코드를 리팩토링 해서 188ms, 16400KB로 줄일 수 있다!(약 28ms 감소 가능.미비하므로 함수 쪼개기는 패쓰..)
리팩토링한 코드 //방향 벡터 리팩토링 2,3 결과 : 100KB 메모리 감소, 시간은 그대로.
구름 정보는 int[ ][ ]에 저장한다. 0:구름 없음, 1:구름 있음, 2: 이동한 후 구름의 위치를 의미한다!
구름 이동, 물 복사, 구름 생성 3개의 메서드로 모듈을 분리했다!
구름 이동에 필요한 방향 벡터와 물 복사에 필요한 방향 벡터 => 하나의 방향벡터로 했다! 구름 이동에 필요한 방향 벡터는 문제에서 주어진다. 총 8개의 방향이 있고, 델타어레이로 구현한다. 물복사에 쓰이는 대각선 4개 방향을 구하는 것은 이 8개 방향 중 1,3,5,7번째에 해당하고, 이 순서는 상관없기 때문에 사용이 가능하다!!!//신선한 충격..진짜 대박적....
구름 이동할 때 범위 초과 처리 : 방향 벡터값에 s를 곱하는 부분 다음과 같이 방향 벡터 값에 N을 더하고, 여기에 s를 곱해주면 범위 초과하는 처리를 하지 않아도 된다! 왜 그런지 모르겠지만 일단 암기해두자. nx = (i + d(x[d] +N)*s) %N ny = (j+ (dy[d]+N)*s)%N
Last updated