[백준] 미세먼지 안녕!

유승선 ·2022년 6월 15일
0

백준

목록 보기
21/64



가끔 이런 생각이 들때가 있다. 너무나도 완벽한 아이디어와 또 너무나도 완벽한 코드를 다 짜고나면 굉장히 뿌듯하고 테스트 케이스가 통과했을때 이건 무조건 맞췄다 하고 제출 하는 순간. 내 기쁨을 비웃기라도 하듯 "틀렸습니다" 문구가 나온다. 그리고 코드를 다시 봐도 아이디어 면에서 틀린면은 없었고 분명히 내 구현에도 틀린 부분이 없다고 생각하면서 보다가 도저히 문제점을 못찾겠다 싶을때 답을 찾아본다. 그리고 다른 사람의 답 코드를 보면서 머리속에서 그림을 그리고 쭉쭉 읽다보면 이런 생각이 또 든다.

"나랑 생각한거 똑같은데 왜 이사람 코드는 되는거지?"

그렇다, 정말로 이런 경우가 많다. 사람마다 코드를 쓰는 스타일은 다르고 나는 나만의 스타일을 지향한다. 가령 예를 들면 누군가는 bfs를 할때 방향 벡터를 x와 y 로 따로 지정해주는 반면에 나는 pair<int,int> 벡터로 방향 벡터를 한번에 저장한다. 그렇지만 전체적인 아이디어와 구현의도는 같기때문에 이런것들이 코드에 영향을 줄 수는없다. 그리고 이 문제 또한 내 완벽한 아이디어와 구상을 비웃었던 비운의 문제였고 내 집착을 계속 요구했던 문제였다.

문제 내용은 이렇다, R * C 벡터에서 미세먼지가 있는 포인트들이 저장되어있는데 1초마다 이 포인트들의 먼지가 상하좌우로 확산을 하고 확산이 끝나고 나면은 공기 청정기가 바람을 쏘아서 위쪽라인에선느 반시계 방향으로, 그리고 아래 방향에서는 시계방향으로 돌아간다. 바람이 나오게 되면은 미세먼지는 한칸씩 뒤로 가게 되고 공기청정기 안으로 들어가는 먼지는 전부 없어진다. T만큼의 시간이 흘렀을때 우리는 남은 먼지양을 계산하고 리턴하면 되는 문제이다.

언뜻보면은 쉬운 문제같아 보일수도있지만 꽤 많은 생각이 필요했다. 가령, bfs 를 먼지의 좌표마다 확산을 하고 기존 먼제 값에 더해야하지만 좌표에 원래 저장된 먼지들의 값은 확산을 할때는 원본값을 유지했어야했다. 이말이 무엇이냐면은, 시나리오의 계산을 하면서도 원본값을 유지할수있는 방법이 필요하다 이거다. 먼지 확산이 끝나면은 또 먼지들이 한칸씩 이동을 해야하는데 이거는 예전에 내가 풀었던 roate array, 회전하기 등등 문제와 비슷해서 옛날 기억을 떠올리면서 문제를 풀었어야했다.

솔직히 얘기하면 모든 아이디어를 잘 구상했음에도 불구하고 너무 많이 틀렸고 너무 많은 고민을 했다. 그리고 답을 보고 문제를 맞춘 그 순간에도 내가 처음에 짰었던 코드에 문제점을 계속 보면서 아주 살짝 고친결과 답을 안봐도 풀수있었을 코드가 나왔었다.

전체적인 코드이다. T초동안 룹을 돌려야 했었고 아까도 얘기했던 원본 먼지값을 저장하기 위해 visited 라는 임의에 벡터를 생성해서 matrix값을 넣어주었다. 그리고 공기 청정기의 값 또한 중요했기에 따로 벡터를 만들어서 저장해주었다. 공기 청정기는 항상 같은 열에 있기때문에 행만 저장해주었다. 그리고 만약 visited[i][j] 에 저장되있다면 그것은 원래 먼지 좌표이기때문에 bfs를 해준다음 move_1, move_2 시나리오로 먼지를 움직여주었다.

bfs 방식, 시나리오 대로 계산을 해주었다.

move_1 은 반시계 방향으로 돌아가는거고 행렬 태두리 회전하기 문제를 풀었던거를 생각해서 top left bottom right 을 조정해주었다.

move_2는 시계방향이라 move_1의 반대이다.

처음에 내가 계속해도 문제를 틀리기에 생각했던것은 먼지를 움직이는 과정에서 내가 뻘짓을 했나 싶었지만, 어느 위치부터 옮기냐는 중요하지 않기에 틀린 부분이 없었다. 다만 내가 정말 크나큰 실수를 한것은 visited 벡터를 초기화 안해주고 그대로 쓴것이다. 이게 왜 문제냐면은 시나리오대로 먼지를 움직였을때는 이미 visited의 좌표 또한 달라진걸 의미하기에 그대로 다시 쓰면은 말도 안되는 코드가 나온다는것을 내가 몰랐다.

마지막에 자포자기 한 순간에 떠올랐고 이런 자잘한 실수를 줄여야겠다.

배운점:
1. 임의에 Visited 벡터를 사용할때는, 원래 좌표가 움직이는 순간 초기화 잊지말고 해줘야한다.
2. 자잘한 실수 줄이기.

profile
성장하는 사람

0개의 댓글