일단 씻고 나가자
1021번 : 회전하는 큐 본문
형편 없는 메모리와 시간 ㅋㅋ큐ㅠㅠ 그래도 큐 클래스를 사용하지 않고 문제 해석과 논리성만을 이용해서 풀었다는 거에 의의를 두자.. 문제 해석과 규칙성 발견에만 엄청난 시간을 쏟았던 문제. ㅋㅋ큐ㅠㅠ ㅋㅋ큐ㅠㅠ ㅋㅋQueueㅠㅠ
처음 틀렸을 때 for문의 length를 잘못 설정해서 틀렸었는데, 고치고 IDE에서 돌려 보니 논리적인 문제도 있었다. 조금 더 세심하게 보자.
역시 자바는 Queue 클래스를 가지고 있고 그걸 알고 있었으나, 걍 개인적인 고집으로 쓰지 않고 논리적으로 풀려고 했던 것 같다. 결과는 시간과 메모리의 아작. 괜히 Queue 클래스 한 번도 안 써봐서 두려웠던 점도 있었다. 앞으로 또 그런 생각으로 안일하게 문제를 푼다면 걍 뒤질 것이다.
이번에도 역시 문제 이해만 해도 힘들었다. 기계어의 익숙함에 속아 한국어를 잃은 것일까? 오늘도 멍청한 나는 열심히 노가다로 문제와 예시를 이해해보기로 한다.
문제는 이렇다. 처음 제공하는 두 번째 줄의 숫자들이 target index이다. (예외적으로 이번 문제에서는 index의 시작을 0으로 보지 않고 1로 보겠다.) 왼쪽으로 돌거나, 오른쪽으로 돌거나 해서 가까운 쪽으로 target index가 1번에 위치하게끔 하고 거기서 poll한다. 그럼 전체 배열은 target index 하나를 내보내고, 배열의 크기도 하나가 줄어든다.
따라서 이렇게 생각해보았다. 결국 target index는 1번 자리로 가는 것이 목표이고, 그럼 1번 자리와 해당 index와의 차이만으로 얼만큼 이동했는지를 계산할 수 있다. 이때 왼쪽이냐 오른쪽이냐가 중요한데, 해당 index가 1과 가까우면 왼쪽, 배열의 현재 length+1 과 가까우면 오른쪽이다. 왜 length+1인고 하냐면 배열의 맨 끝까지 도달하는 이동 거리가 length-index이고, 거기서 1번 자리로 가려면 오른쪽으로 한 칸을 더 가야하기 때문이다.
근데 문제는 이후에 움직일 나머지 index들이다. 처음에야 주어진 index였지, 이전 index 때문에 배열 전체가 왼쪽 혹은 오른쪽으로 돌면서 자기 위치도 바뀌고, 또한 배열의 length까지 하나 줄어드니 (이전 index 값이 poll 당했으니까! ) 얘네의 위치도 조정해주어야 한다. 따라서 하나의 index위치가 n만큼 이동하면 이후에 있는 모든 index값들도 왼쪽, 오른쪽이냐에 따라 n만큼 더해주거나 빼주었다. 왼쪽으로 이동한다면 전체적으로 index가 하나씩 줄어들 것이고, 오른쪽으로 이동한다면 전체 index가 하나씩 늘어날 것이다.
근데 나머지 index를 계산할 때 더하거나 빼다가 배열의 length보다 커지거나 음수가 될 수도 있겠지? 더 커진 경우엔 %length해서 나머지 값으로 index를 매겨 주고, 음수인 경우엔 +length를 통해 올바른 index를 넣어 주면 되겠다.
그래서 대망의~~~ 메모리는 메모리대로 먹고 시간은 시간대로 써서 하등 쓸모도 없고 욕만 먹을, 데이터 쓰레기가 되어 IT 업계의 좋은 퇴출 사유 예시로 후대에 두고두고 전해지게 될 나의 코드는~~~~
후 힘들었다 ^^;;!! 하고 다른 사람 풀이 찾아 보니까 걍 Queue 클래스로 간단하게 풀었더라. 저도 아니까 비판 댓글은 안 받습니다. 그만 혼자 있고 싶네요. 큐바~
'Coding-Test > 백준을 자바라' 카테고리의 다른 글
24174번 : 알고리즘 수업 - 힙 정렬 2 (0) | 2023.03.22 |
---|---|
1158번 : 요세푸스 문제 (1) | 2023.03.17 |
26008번 : 해시 해킹 (0) | 2023.03.16 |
10818번 : 최소, 최대 (2) | 2023.03.15 |
25556번 : 포스택 (0) | 2023.03.14 |