문제 설명
2차원 배열이 주어진다.
2차원 배열을 적절히 조각내어 자르고 만들 수 있는 최댓값을 출력한다.
같은 경계에 있으면 숫자를 이어붙이고 다른 경계에 있는 숫자는 더한다.
시도
가로로 붙일지, 세로로 붙일지 2가지의 선택한다.
풀이
static int n, m, answer;
static int[][] paper;
static boolean[][] v;
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(reader.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
paper = new int[n][m];
v = new boolean[n][m];
for (int i = 0; i < n; i++) {
String str[] = reader.readLine().split("");
for (int j = 0; j < m; j++) {
paper[i][j] = Integer.parseInt(str[j]);
}
}
dfs(0,0);
System.out.println(answer);
}
private static void dfs(int y, int x) {
if (y >= n) { // 배열 탐색 완료
answer = Math.max(answer, sum());
return;
}
if (x >= m) { // 열의 끝에 도달했을 때 다음 행으로
dfs(y + 1, 0);
return;
}
v[y][x] = true;
dfs(y, x + 1);
v[y][x] = false;
dfs(y, x + 1);
}
private static int sum() {
int answer = 0;
int temp = 0;
for (int i = 0; i < n; i++) {
temp = 0;
for (int j = 0; j < m; j++) {
if (v[i][j]) {
temp *= 10;
temp += paper[i][j];
} else {
answer += temp;
temp = 0;
}
}
answer += temp;
}
for (int i = 0; i < m; i++) {
temp = 0;
for (int j = 0; j < n; j++) {
if (!v[j][i]) {
temp *= 10;
temp += paper[j][i];
} else {
answer += temp;
temp = 0;
}
}
answer+=temp;
}
return answer;
}
'Algorithm > 백준' 카테고리의 다른 글
백준 - 호석이 두 마리 치킨 (0) | 2023.03.27 |
---|---|
백준 - 캐슬 디펜스 (0) | 2023.03.24 |
백준 - 스티커 붙이기 (1) | 2023.03.23 |
백준 - 트리의 기둥과 가지 (0) | 2023.03.21 |
백준-이차원 배열과 연산 (0) | 2023.03.20 |
댓글