sprint-N-Queens 후기(+완료)

flobeeee·2021년 1월 28일
0

Sprint

목록 보기
9/25
post-thumbnail

의도

프로그래머스 3단계 문제에 해당한다는 N-Queens 스프린트를 진행했다.
굉장히 어려운 난이도이며, 다 해결하지 못해도 괜찮다고 했다.
이정도까지의 난이도는 실제 현업에서 잘 안쓰이며,
알고리즘 사고를 키우기 위한 목적으로 스프린트를 진행한다고 했다.
그 말을 듣고 약간 긴장이 풀렸다. 그리고 해내고 싶었다.

개념

n개의 Queen을 n*n 체스판 위에 서로 공격할 수 없도로 위치하는 과제다.
Queen은 가로 세로 대각선으로 이동가능하며, 칸 수 제한이 없다.

진행

우선 N-Rooks 문제로 포문을 열었다.
Queen의 하위버전이고, 가로 세로로만 이동이 가능한 말이었다.
다른 기본적인 코드들은 만들어져 있어서, 우리가 작성해야할 함수들은 많이 않았다.
1. Rook끼리 충돌이 일어나는지 (행충돌, 열충돌, 대각선충돌, 역대각선 충돌)
2. Queen끼리 충돌이 일어나는지
에 대해 먼저 작성했다.

초반에 이미 작성되어 있는 함수들을 이용하는 법을 깨닫는데 시간을 많이 썼다.
콘솔창에 각각 찍어보면서 어떻게 함수를 구현할지 고민했다.
행충돌과 열충돌까지는 괜찮았는데, 대각선이 너무 힘들었다.
풀고나서는 단순한 로직이었지만, 많은 시도 끝에 나온거라서 애정이 갔다.

그 다음 작성해야할 함수는 (n은 1 ~ 8 범위로 입력)
1. 1개의 N-Rooks 정답을 출력 -> 단순하게 정답위치마다 말을 놓았다.
2. N-Rooks 정답개수를 출력 -> 직접 손으로 그려보니 패턴을 발견에서 단순 수식으로 구현했다.
3. 1개의 N-Queens 정답을 출력 -> n이 5일때 까지는 해결이 됐으나, 6부터 해결이 안된다 ㅠ
4. N-Queens 정답개수를 출력 -> 3번이 해결되지않아 손도 못댔다.

문제점

1개의 N-Rooks 함수를 작성하는 것부터 각잡고 코드를 짰어야 했다고 생각한다.
1번함수를 제대로 작성했다면, 2번도 비슷한 방향으로 풀었을 것이고, 그게 3, 4번과 연결이 되었을 것이다.
그런데 나는 테스트케이스를 통과하는데 급급한 나머지.. ! 다음을 생각하지 않고 코드를 짰다.

내가 막힌 부분은. 재귀함수를 통해, 말을 놓다가 어느부분을 놓아도 충돌이 일어나면, 다시 되돌아와서 말을 지워야하는데 그 부분을 제어하지 못한다.
그림을 그리면서 진행을 해도, 재귀가 되돌아온 부분에서 다음 코드로 진행을 하고 이 부분이 능숙하지 못하다. (= 재귀함수를 능숙하게 사용하지 못한다.)

그래도 코드를 어느정도 작성해놔서 조금만 더 손보면(내가 코드의 문제점을 찾아내서 보완한다면) 모든 테스트를 다 통과할 수 있을 것이다. 우선은 N-Queens에 매달리기보다 내가 부족한 개념들을 보완하고 나서 시간이 남으면 도전해봐야겠다.
한끗차이일텐데 그 한끗을 찾아내는게 너무 어렵지만 꼭 찾고싶다.

마무리하며

도전하는 일은 어렵지만 재미있다.
나중에 일을 하면서도 코딩문제는 계속 풀고싶다.
지금도 네모로직을 푸는 걸 좋아한다. 가끔 시간이 날때마다 소소하게 진행하는데,
코딩테스트도 나중에 나에게 즐거움을 가져다 줄 것이라고 생각한다.
(사실 지금도 코플릿 문제 풀때마다 즐겁다.)

나의 단점은 처음 방향성을 잘못 잡으면 빠져나오지를 못한다.
그러나 방향성을 제대로 잡는 순간, 폭풍처럼 해결할 수 있다.
요행을 바라지말고, 차근차근 실력을 쌓아야겠다.

추가 (21.01.31)

드디어 엔퀸즈를 마무리했다.
재귀함수를 잘 다루지 못하는 부분은, 재귀함수 코플릿 문제를 처음부터 끝까지 다시 풀면서 개념을 다시 익혔다. 이를 발판으로 코드를 구현해내는데 성공했다 !

하지만, 7x7과 8x8 보드판일때, 엔퀸즈 해답 개수를 출력하는 부분이 신경에 거슬렸다.
정답 개수보다 더 많이 출력되는 걸로 보아, 아마 중복되는 해답이 있을거라 생각했고, 이것저것 시도해봤지만 해결하지 못해서 결국 코드스테이츠 헬프데스크에 질문글을 작성했다.
답변은 코드상에는 문제가 없고, 충돌이 있는경우의 조건문에 있는 함수에 이상이 있을 거라는 의견이었다.

확인 후 해당 판에 충돌이있는지 확인하는 함수특정좌표를 기준으로 충돌하는지 확인하는 함수로 대체하니까 완전히 통과하였다. 그리고 기존에 작성하였던 함수를 들어가니 for문에서 i의 초기값이 -2로 설정이 되어있었다. n의 범위가 0~8 까지인데 상수가 있다니, 당연히 오류가 날 수 밖에 없다.(아마 대표기준인 4x4를 염두해두고 작성한 코드였던 것 같다. 지금은 제대로 작성하여서 통과한다. 하지만 특정좌표를 기준으로 충돌하는 함수가 시간이 더 적게 걸려서 해당 함수를 사용했다. 4초에서 0.7초 정도로 개선됐다 !! ) 나는 왜 조건문으로 쓴 함수를 확인해볼 생각을 하지 않은걸까? 스스로 문제를 잡아내지 못한 게 아쉽다.

그래도 축하할 점은 레퍼런스코드가 아닌 내 코드만으로 프로그래머스 3단계 수준에 해당하는 문제를 풀어냈다는 것! 자신감을 얻었다.
제출은 화요일까지였지만 오늘인 일요일까지 고민과 코드수정을 거듭했다. 뿌듯하다.
엔퀸즈 절대 잊지 못할 것이다. 처음 맞딱뜨렸을 때의 그 막막함과, 해결 뒤의 뿌듯함. 그리고 자잘한 실수로인한 허무함. 많은 감정을 느꼈다. 앞으로 코딩을 하면서 지칠 때가 있을거라고 생각한다. 하지만 지금 이 경험이 나를 계속 나아가게 할 것이라고 믿는다.

profile
기록하는 백엔드 개발자

0개의 댓글