문제
출처 : https://www.acmicpc.net/problem/18430
N*M그리드가 주어진다.
길동이는 N*M그리드의 각 칸을 적절히 잘라서 부메랑을 만들어야한다.
길동이가 만들수있는 부메랑들의 크기의 총합을 가장 크게하는 프로그램을 만드는 문제다.
풀이
N과 M이 5가 최대이므로 완전탐색으로 풀수있는 문제였다.
백 트래킹으로 구현한 전형적인 백트래킹 문제다. 구현중 주의할점은 아래와 같다.
현재 위치를 y,x라 했을때, 다음에 탐색할 범위는 y, x중 하나를 중점으로 잡아야한다.
만약 다음 범위를 y~N, x~M으로 지정할경우, 그 외의 경우는 고려하지못하기때문에 오답이 나온다.
주요 소스코드
private int getBoomerang(int x){
int ret = 0;
for(int i = 0; i < N; i++){
for(int j = x; j < M; j++){
if(duplicateChecking(i,j)) continue;
for(int l = 0; l < 4; l++){
int wing1 = i+dy[l];
int wing2 = j+dx[l];
if(duplicateChecking(wing1, j) || duplicateChecking(i, wing2)) continue;
flipCheck(i, j, wing1, wing2);
ret = Math.max(ret, getBoomerang(j)+calcBoomerangSize(i, j, wing1, wing2));
flipCheck(i, j, wing1, wing2);
}
}
}
return ret;
}
전체소스코드
'알고리즘 (2020 : 08 : 10 ~ ) > 구현, 시뮬' 카테고리의 다른 글
[백준 / BOJ] 1195 킥다운 (0) | 2022.04.03 |
---|---|
[백준 / BOJ] 17363 우유가 넘어지면? (0) | 2021.10.07 |
[백준 / BOJ] 1244 스위치 켜고 끄기 (0) | 2021.08.31 |
[백준 / BOJ] 13335 트럭 (Java) (0) | 2021.08.28 |
[백준 / BOJ] 17298 오큰수 (Java) (0) | 2021.08.21 |