일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 14501
- 15651
- 2798
- 14888
- 14503
- 문제풀이
- C
- 10872
- 러스트란 #cargo
- C++
- 백준
- 연산자 끼워넣기 성공
- 15652
- 백트래킹
- 15649
- 14891
- 15683
- 9663
- 분해합
- rust설치
- 팰린드롬수
- rustup
- 테트로미노
- 14890
- 13460
- 1259
- 14500
- 3190
- 15650
- 13458
Archives
Easy-So-Easy
[백준] 14500번 테트로미노 - C/C++ (Easy 풀이) 본문
반응형
백준 14500 문제(Problem)
입력
첫째 줄에 종이의 세로 크기 N과 가로 크기 M이 주어진다. (4 ≤ N, M ≤ 500)
둘째 줄부터 N개의 줄에 종이에 쓰여 있는 수가 주어진다. i번째 줄의 j번째 수는 위에서부터 i번째 칸, 왼쪽에서부터 j번째 칸에 쓰여 있는 수이다. 입력으로 주어지는 수는 1,000을 넘지 않는 자연수이다.
출력
첫째 줄에 테트로미노가 놓인 칸에 쓰인 수들의 합의 최댓값을 출력한다.
풀이 & 전체 코드(Solution & Code)
풀이)
dfs 코드를 기반으로 추가 구현 코드를 작성하면 쉽게 풀 수 있는 문제이다. 필자는 side_dfs 함수를 추가로 구현하여 문제를 풀었는데, 'ㅗ, ㅓ, ㅜ, ㅏ' 와 같이 4가지의 경우는 dfs만으로 구현할 수 없기에 side_dfs 함수로 이를 추가 구현하였다.
#include<iostream>
#include<algorithm>
using namespace std;
int n, m, map[501][501], res, visited[501][501];
// 인접한 두 셀 (x1, y1)과 (x2, y2)의 값을 더해서 합산하는 함수
void side_dfs(int x1, int y1, int x2, int y2, int sum) {
if(x1<0 || x1>=m || y1<0 || y1>=n) return ;
if(x2<0 || x2>=m || y2<0 || y2>=n) return ;
if(visited[y1][x1] || visited[y2][x2]) return;
sum += (map[y1][x1]+map[y2][x2]);
res = max(sum, res);
}
// DFS를 이용하여 테트로미노를 놓을 수 있는 모든 경우를 탐색하는 함수
void dfs(int depth, int sum, int x, int y) {
if(x<0 || x>=m || y<0 || y>=n) return ;
if(visited[y][x]) return;
sum += map[y][x];
if(depth == 4) {
res = max(res, sum);
return;
}
visited[y][x]=1;
if(depth==2) {
// 현재 셀의 인접한 옆 위치를 확인하기 위해 side_dfs 함수 호출
side_dfs(x-1, y, x+1, y, sum);
side_dfs(x, y+1, x, y-1, sum);
}
// 상하좌우 4방향으로 재귀적으로 탐색
dfs(depth+1, sum, x+1, y);
dfs(depth+1, sum, x-1, y);
dfs(depth+1, sum, x, y+1);
dfs(depth+1, sum, x, y-1);
visited[y][x]=0;
}
int main() {
cin >> n >> m;
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
cin >> map[i][j];
}
}
// 각 셀에서 DFS 함수 호출하여 최대 합 계산
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
dfs(1, 0, j, i);
}
}
cout << res;
}
반응형
'BaekJoon' 카테고리의 다른 글
[백준] 14503번 로봇 청소기 - C/C++ (Easy 풀이) (0) | 2023.07.06 |
---|---|
[백준] 14501번 퇴사 - C/C++ (Easy 풀이) (0) | 2023.07.06 |
[백준] 13458번 시험 감독 - C/C++ (0) | 2023.07.05 |
[백준] 13460번 구슬 탈출 2 - C/C++ (BFS) (0) | 2023.07.05 |
[백준 3190] 뱀 - C/C++ <쉽게 설명> (0) | 2023.06.27 |