티스토리 뷰
[BOJ 14500(G5) 리뷰]
삼성 SW역량테스트 기출문제다.
처음엔 엄청 간단한 문제인 줄 알았다. 그냥 DFS로 구현하면 쉽게 풀릴것같아 쓱 구현해서 돌려보니 문제가 발생했다.
DFS로는 이 모양을 만족할 수가 없는것이였다.
어떻게 처리할까 매우 고민했다. 이왕 하는거 논리적이고 깔끔하게 코드를 짜고싶어서 머리를 이리저리 굴려보았는데 답이 잘 안나왔다. 계속 고민하다보니 집중력이 계속 떨어져서 그냥 무식한 방법을 사용하기로 했다.
DFS를하면서 두번째 블록에 위치할때, 위 모양이 나올 수 있는 경우의 수를 생각해서 그냥 인덱스로 접근해서 구해버렸다. 그나마 순열로 구현하는게 깔끔할테지만, 넥퍼뮤 사용법도 까먹고해서.. 그냥 무식하게 구해버렸다.
어쨌든 맞았으니 기분은 좋긴한데 왠지모를 찝찝함이 남아있는 문제다..
/*
20.12.30
BOJ : 14500 테트로미노 (https://www.acmicpc.net/problem/14500)
브루트포스, 그래프탐색
*/
#include <bits/stdc++.h>
using namespace std;
int N, M;
int board[501][501];
bool vis[501][501];
int ans = 0;
int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };
void dfs(int r, int c, int cnt,int sum)
{
cnt += 1;
sum += board[r][c];
if (cnt == 4) {
ans = max(ans, sum);
return;
}
if (cnt == 2) {
vector <pair<int, int>> vc;
for (int dir = 0; dir < 4; dir++) {
int nx = r + dx[dir];
int ny = c + dy[dir];
if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if (vis[nx][ny]) continue;
vc.push_back({ nx,ny });
}
if (vc.size() == 2) {
ans = max(ans, sum + board[vc[0].first][vc[0].second] + board[vc[1].first][vc[1].second]);
}
else if (vc.size() == 3) {
ans = max(ans, sum + board[vc[0].first][vc[0].second] + board[vc[1].first][vc[1].second]);
ans = max(ans, sum + board[vc[1].first][vc[1].second] + board[vc[2].first][vc[2].second]);
ans = max(ans, sum + board[vc[0].first][vc[0].second] + board[vc[2].first][vc[2].second]);
}
}
for (int dir = 0; dir < 4; dir++) {
int nx = r + dx[dir];
int ny = c + dy[dir];
if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if (vis[nx][ny]) continue;
vis[nx][ny] = 1;
dfs(nx, ny, cnt, sum);
vis[nx][ny] = 0;
}
}
int main() {
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> board[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
vis[i][j] = 1;
dfs(i, j, 0, 0);
vis[i][j] = 0;
}
}
cout << ans;
}
'알고리즘 풀이 > BFS' 카테고리의 다른 글
BOJ : 2660 회장뽑기 (0) | 2021.02.06 |
---|---|
BOJ : 1039 교환 (0) | 2021.01.11 |
BOJ : 1963 소수 경로 (0) | 2020.09.15 |
BOJ : 1600 말이 되고픈 원숭이 (0) | 2020.08.05 |
BOJ : 2589 보물섬 (0) | 2020.08.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 투포인터
- nest.js
- nodeJS
- 스레드
- typeORM
- 동적계획법
- node.js
- 백트래킹
- 재귀
- 그래프
- 벨만포드
- 구현
- 컴퓨터 구조
- 컴퓨터 통신
- 자바스크립트
- nestjs
- dfs
- java
- 시뮬레이션
- Computer Architecture
- 그리디
- ReactNative
- 중앙대학교
- 예외처리
- 세그먼트 트리
- BFS
- 알고리즘
- 자바
- 백준
- boj
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함