문제 링크입니다: https://programmers.co.kr/learn/courses/30/lessons/84021
타 위클리 챌린지 문제에 비해 정답자가 현저히 낮은 문제였습니다.
알고리즘은 아래와 같습니다.
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
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > programmers' 카테고리의 다른 글
[Programmers 위클리 챌린지 6주차] 복서 정렬하기 (0) | 2021.09.06 |
---|---|
[Programmers 위클리 챌린지 5주차] 모음 사전 (0) | 2021.09.04 |
[Programmers 위클리 챌린지 4주차] 직업군 추천하기 (0) | 2021.09.04 |
[Programmers 위클리 챌린지 2주차] 상호 평가 (0) | 2021.09.03 |
[Programmers 위클리 챌린지 1주차] 부족한 금액 계산하기 (0) | 2021.09.03 |