백준 3190 뱀

sko B·2026년 3월 8일

알고리즘

목록 보기
2/2

요즘 알고리즘 문제들을 풀고있다.

오늘은 풀면서 든 생각과 배운 것들을 적으려고한다.

오늘은 백준 3190 뱀 문제를 풀었다.

뭐 다들 익히 알겠지만 삼섬은 빡구현, BFS 중심의 문제를 주로 출제한다.

그러다보니 dx,dy라는 배열을 만들어서 이동에 관련된 연산을 편하게 for문으로 한 번에 처리하는 경우가 많을 것이다.

나의 경우 dx,dy를 상하좌우 방향으로 설정해둔다.

즉 dx = {-1,1,0,0} dy = {0,0,-1,1} 이런 식으로.

이유는 단순하다. 그냥 편해서, 익숙해서
상하좌우 라는 말이 단순히 너무 익숙했기에 난 그렇게 설정했었다.

오늘 뱀 문제에서 이 방향의 큰 문제가 드러났다.

정말 너무 긴 if-else를 반복해 지옥의 주먹구구식 방향처리 및 이동처리를 했는데, gemini에게 피드백을 받아보니 모듈러 연산으로 쉽게 처리할 수 있는 방법이 있었다.

다만 그렇게 하려면 내 기존 방식처럼 하는게 아닌 상우하좌 방향으로 설정해야한다.

코테 고수들은 방향 배열을 짤 때 주로 시계 방향(또는 반시계 방향)으로 인덱스를 부여한다고 한다.

그렇게 하는 이유는 이 문제처럼 머리가 돌아갈 때 시계 방향으로 1 칸 혹은 반시계 방향으로 한 칸 (여기선 +3을 해주면 된다) 하고 모률러 처리를 해버리면 너무 간단하게 방향 처리가 된다는 것이다.

또 하나

이 문제에서 난 뱀의 몸을 직접 deque에 넣고 하나하나 빼서 이동시키고 다시 que에 넣는 정말 비효율적인 방법을 사용했는데, 그냥 머리가 이동하면 새로운 객체를 넣어주고(addFirst), 사과가 있다면 그냥 두면되고, 없다면 꼬리를 자른다(pollLast)

알고리즘을 풀면서 배열 방향 처리 같은 섬세한 디테일 같은 부분들도 실력이라면 실력이지만 또 다른 면으로 보면 이런 부분을 생각해내지 못한다면 배워야 하는 부분이지 않겠는가?

0개의 댓글