알고리즘/programmers

[Programmers 위클리 챌린지 3주차] 퍼즐 조각 채우기

꾸준함. 2021. 9. 4. 14:24

문제 링크입니다: https://programmers.co.kr/learn/courses/30/lessons/84021

코딩테스트 연습 - 3주차

[[1,1,0,0,1,0],[0,0,1,0,1,0],[0,1,1,0,0,1],[1,1,0,1,1,1],[1,0,0,0,1,0],[0,1,1,1,0,0]] [[1,0,0,1,1,0],[1,0,1,0,1,0],[0,1,1,0,1,1],[0,0,1,0,0,0],[1,1,0,1,1,0],[0,1,0,0,0,0]] 14 [[0,0,0],[1,1,0],[1,1,1]] [[1,1,1],[1,0,0],[0,0,0]] 0

programmers.co.kr


타 위클리 챌린지 문제에 비해 정답자가 현저히 낮은 문제였습니다.

알고리즘은 아래와 같습니다.
1. 전처리를 위해 table 배열 내 블록 후보들을 구합니다.
1.1 좌표들을 저장하는데, 추후 비교를 위해 좌상단으로 좌표들을 옮긴 상태에서 좌표 배열에 넣어줍니다. (getArrangedCoords 함수 참고)
2. 마찬가지로 전처리를 위해 game_board 배열 내 빈 공간들을 구합니다.
2.1 여기서도 추후 비교를 위해 좌상단으로 좌표들을 옮긴 상태에서 좌표 배열에 넣어줍니다.
3. 2번에서 구한 빈 공간에 1번에서 구한 블록 후보들을 최대한 많이 넣어줍니다. (func 함수 참고)
3.1 여기서 빈 공간과 블록 후보들을 비교하기 위해 블록 좌표들을 모두 좌상단으로 옮겼습니다.
3.3 빈 공간에 아직 사용하지 않은 모든 블록 후보들을 시도합니다.
3.3 블록 후보들은 회전이 가능하므로 90도씩 회전해가며 빈 공간에 넣을 수 있는지 확인합니다. (좌표 90도 회전의 경우 https://calcworkshop.com/transformations/rotation-rules/ 링크를 참고하면 어떻게 회전시켜야할지 감이 오실 것입니다.)
4. 3번 과정을 거친 뒤, 최대한 많은 블록 후보들을 넣었을 때 결과를 구한 후 출력해줍니다.

* 중복되는 코드들이 많은데 리팩토링은 여러분의 몫으로 남기겠습니다~



개발환경:Visual Studio 2017

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형