[문제]
https://www.codetree.ai/cote/13/problems/shoot-a-laser-in-the-mirror-2?&utm_source=clipboard&utm_medium=text
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
[문제 풀이]
처음에 보면 어떤식으로 구현을 해야하는지 감이 잘 오지 않는 문제일 수 있다.
그러니 차근차근 나눠서 천천히 진행을 해보도록 하자.
우선 해당 문제를 풀기 위해서 시작 하는 위치 파악하기를 진행을 해보자.
숫자에 따라서 방향과 위치가 정해지고 이에 따라 x값과 y 값의 추론이 가능하다.
n이 3이라 3 * 3 배열일때 k 값이 1,2,3 인 경우 북쪽으로 향하고 행이 0으로 고정이 된다. 그리고 열의 값은 각각 (k - 1) % n 이 된다.
똑같이 n이 3일때 k가 4,5,6인 경우에는 서쪽으로 향하고 열의 값은 n - 1 로 고정이 되고 행의 값은 각각 (k - 1) % n 이 된다.
이제 남쪽의 경우 7,8,9 숫자일때 처음 값은 k - 1 로 고정이고 뒤의 값은 모두 n - 1 - ((k - 1 ) % n) 의 값이 나온다.
동쪽의 경우에는 열의값이 0으로 고정 행의 값이 n - 1 (k - 1 % n)이 나온다.
이를 코드로 작성하면
이와 같은 코드가 작성이 가능하다. x값과 y값을 나느 arr[x][y]로 작성하기 때문에 바뀌어 있지만 arr[y][x] 로 작성하는 경우에는 해당 변수를 바꿔주면 된다.
이제 총 몇번을 튕기면서 범위 바깥으로 나가는지 파악해 주기 위해서 범위 바깥으로 나갔는지 아닌지 확인해주는 inRange()함수를 작성해주자.
마지막으로 이제 시작위치와 방향을 알았으니 반복문을 돌리면서 거울이 \와 / 의 경우에 어느 방향으로 바뀌는지를 파악하면서 해당 방향에 맞게 x값과 y값을 변동시켜 주자.
여기서 while문이 돌아가는 수 만큼을 더해주면 답이 나온다.
[회고]
생각보다 상당히 까다로웠던 문제. 방향값을 바꾸는데 우선 고생을 했고 다른 문제들과 다르게 dx, dy값을 바꾸기 위한 조건이 경우마다 달라서 결국 조건문을 통해 하드코딩을 해야만 했다.
if문을 줄이기 위해서 삼항연산자를 쓴 것은 좋은 선택이었던듯. 이건 좀 코드가 깔끔해져서 좋았다.
[코드]