https://www.acmicpc.net/problem/17085
문제 풀이
주어진 크기의 판 내에서 2개의 십자가의 크기 곱이 가장 큰 값이 나오도록 해야하는 문제이다. 격자판의 크기는 최대넓이가 225칸 이므로 브루트포스 방식으로 풀어도 충분히 2초내가 나온다. 하지만 풀이 과정이 복잡해서 좀 어려웠던 문제이다.
1. 각 점마다 정보 탐색
우선 N*M 의 보드판을 순회하면서 각 점이 #이면 해당 점에서 최대 확장 가능한 넓이를 구해서 해당 점의 위치(row, col)와 최대 확장 길이를 dotInfo 배열에 추가한다.
2. 2개의 크기 간 유효성 검사
그 다음 dotInfo 에 들어간 배열들끼리 비교하면서 우선 비교할 십자가를 배열에 1로 저장한 뒤, 두 번째 십자가를 길이만큼 확장시키면서 겹치는지 검사해서 안 겹친다면 두 넓이의 곱을 result에 저장한다.
(여기서 유효성 검사 전에 2개의 십자가의 크기를 미리 곱한 뒤에 현재 result보다 클 경우에만 유효성 검사를 하면 불필요한 계산을 단축시킬 수 있다)
3. 추가로 고려해야 할 사항
당연히 해당 부분까지 완료하면 맞을거라고 생각하고 제출해봤는데 50% 부근즈음에서 오답이 났다.. 그래서 몇시간동안 각종 예시를 들며 찾아보았는데 해당 점에서 무조건 최대 크기의 정보만 저장하면 안된다는 것이다. 작은 것 끼리 곱해서 더 큰 경우가 나올 수 있기 때문이다.
예를 들어 아래의 코드에서 정답은 25 인데 최대크기만 저장하면 크기가 9와 1인게 곱해져서 9가 되므로 오답이 난 것이였다.
1 |
|
그래서 1번 과정에서 dotInfo 에 최대 크기만 저장하는것이 아닌 1부터 최대크기 까지를 저장하니까 해결됐다.
소스 코드
1 |
|