설모의 기록
[백준 14500] 테트로미노 본문
이 문제는 4개짜리 테트로미노 블럭을 주어진 이차원 배열에 놨을 때 배열의 값의 합이 최대가 되는 값을 구하는 문제입니다. 폴리오미노의 조건은 아래와 같습니다.
- 정사각형은 서로 겹치면 안된다.
- 도형은 모두 연결되어 있어야 한다.
- 정사각형의 꼭지점끼리 연결되어 있어야 한다. 즉, 변과 꼭지점이 맞닿아 있으면 안된다.
이 때, 정사각형 4개를 이어붙인 폴리오미노를 테트로미노라 하고 아래의 그림과 같이 5가지 종류입니다.
저도 처음에는 '5개를 어떻게 회전하지.. 4*4배열을 생성해서 그 배열을 회전해야하나..' 하는 함정에 빠졌습니다. 이것을 어떻게 해결하냐가 관건입니다.
이 문제는 dfs로 간단하게 풀리는 문제입니다. 'ㅜ' 블럭을 제외한 4개의 블럭은 한번에 그릴 수 있죠? 다시 말하면 dfs로 한번에 탐색할 수 있는 것이죠. 아래의 그림을 보시면 이해되실거예요!
<'ㅜ'블록을 제외한 나머지 블록의 배열 값 합 구하기>
위의 그림을 예로 들면, 첫 번째 배열에서 아래칸에서 dfs를 시작하겠습니다. 우선 오른쪽을 탐색한다고 생각하면 두번째 그림이 되겠죠? 이후에 2칸을 더 탐색하는 경우는 오른쪽의 4가지 경우입니다. 이 그림은 위의 'ㅜ' 블럭을 제외한 나머지 블럭들을 나타냅니다. 두번째 그림에서 오른쪽을 탐색하지 않고 위, 아래, 왼쪽을 탐색한다면 이 4개의 블럭들을 회전한 그림이 나오겠죠! 따라서 4만큼만 dfs를 돌려서 나오는 배열 값의 합 중 최대값을 MAX변수에 저장하면 됩니다.
<'ㅜ'블록의 배열 값 합 구하기>
그럼 이제 'ㅜ' 블럭만 남았죠? 'ㅜ' 블럭은 위의 그림과 같이 4가지의 ㅏ, ㅓ, ㅗ, ㅜ 블럭을 구해 MAX값을 갱신했습니다. 이 문제는 'ㅜ'블럭과 나머지 블럭을 나누고 dfs를 적용할 수 있냐가 관건이었습니다! 아래 전체 소스코드를 첨부하겠습니다.
'알고리즘' 카테고리의 다른 글
[백준 6603] 로또 (0) | 2018.05.02 |
---|---|
[백준 1389] 케빈 베이컨의 6단계 법칙 (0) | 2018.05.02 |
[백준 13458] 시험감독 (0) | 2018.04.15 |
[백준 14501] 퇴사 (0) | 2018.04.15 |
[백준 14502] 연구소 (0) | 2018.04.14 |
Comments