설모의 기록

[백준 14500] 테트로미노 본문

알고리즘

[백준 14500] 테트로미노

HA_Kwon 2018. 4. 15. 20:07

 이 문제는 4개짜리 테트로미노 블럭을 주어진 이차원 배열에 놨을 때 배열의 값의 합이 최대가 되는 값을 구하는 문제입니다. 폴리오미노의 조건은 아래와 같습니다.

  1. 정사각형은 서로 겹치면 안된다.
  2. 도형은 모두 연결되어 있어야 한다.
  3. 정사각형의 꼭지점끼리 연결되어 있어야 한다. 즉, 변과 꼭지점이 맞닿아 있으면 안된다.
이 때, 정사각형 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