알고리즘 모음(C++)

백준 14500 - 테트로미노(C++) 본문

백준

백준 14500 - 테트로미노(C++)

공대생의 잡다한 사전 2021. 8. 2. 22:08

문제 링크입니다 https://www.acmicpc.net/problem/14500

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

삼성 SW 역량 테스트 기출 문제입니다.

DFS를 이용하는 것이 핵심이였습니다.

 

문제 조건
출력 예시

 

위 도형중에서 'ㅗ' 모양의 보라색 도형을 제외한다면 나머지 모두는 상하좌우 4번을 연속해서 이동한다면 모두 구할 수 있습니다.

 

 

문제 접근 방법 

1. 모든 칸마다 DFS를 통해서 상하좌우 이동한다.

2. 4번 이동한다면, 지금까지의 최댓값과 비교한다.

3. 조건에 맞다면 'ㅗ' 모양으로 나올 수 있는 값들을 확인후 비교한다.

 

 

문제 접근 방법 - 1번 + 2번

void dfs(int x, int y, int sum, int cnt) {
    if (cnt == 4) {
        max_point = max(max_point, sum);
        return;
    }
    for (int i = 0; i < 4; i++) {
        int xx = x + dx[i];
        int yy = y + dy[i];
        if (xx >= 1 && yy >= 1 && xx <= N && yy <= M) {
            if (check[xx][yy] == 0) {
                check[xx][yy] = 1;
                dfs(xx, yy, sum + point[xx][yy], cnt + 1);
                check[xx][yy] = 0;
            }
        }
    }
}

dfs() 함수에 좌표, 지금까지의 합, 이동횟수를 받았습니다. 

이동 횟수가 4일때는, 지금까지 합을 최댓값과 비교해, 큰 값을 받았습니다.

 

 

문제 접근 방법 - 3번

void shape_1(int x, int y) {
    int sum = 0;
    sum += point[x][y] + point[x][y + 1] + point[x][y - 1] + point[x + 1][y];
    max_point = max(max_point, sum);
}
void shape_2(int x, int y) {
    int sum = 0;
    sum += point[x][y] + point[x][y+1] + point[x][y-1] + point[x-1][y];
    max_point = max(max_point, sum);
}
void shape_3(int x, int y) {
    int sum = 0;
    sum += point[x][y] + point[x][y - 1] + point[x + 1][y] + point[x - 1][y];
    max_point = max(max_point, sum);
}
void shape_4(int x, int y) {
    int sum = 0;
    sum += point[x][y] + point[x][y + 1] + point[x + 1][y] + point[x - 1][y];
    max_point = max(max_point, sum);
}

'ㅗ' 모양으로는 나올 수 있는 경우가 4가지 입니다. 이들을 조건에 따라 전부 확인했습니다.

 

 

자세한 것은 코드를 참고해주세요!

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

int N, M;
int point[501][501];
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
int check[501][501];
int max_point;

void dfs(int x, int y, int sum, int cnt) {
    if (cnt == 4) {
        max_point = max(max_point, sum);
        return;
    }
    for (int i = 0; i < 4; i++) {
        int xx = x + dx[i];
        int yy = y + dy[i];
        if (xx >= 1 && yy >= 1 && xx <= N && yy <= M) {
            if (check[xx][yy] == 0) {
                check[xx][yy] = 1;
                dfs(xx, yy, sum + point[xx][yy], cnt + 1);
                check[xx][yy] = 0;
            }
        }
    }
}

void shape_1(int x, int y) {
    int sum = 0;
    sum += point[x][y] + point[x][y + 1] + point[x][y - 1] + point[x + 1][y];
    max_point = max(max_point, sum);
}
void shape_2(int x, int y) {
    int sum = 0;
    sum += point[x][y] + point[x][y+1] + point[x][y-1] + point[x-1][y];
    max_point = max(max_point, sum);
}
void shape_3(int x, int y) {
    int sum = 0;
    sum += point[x][y] + point[x][y - 1] + point[x + 1][y] + point[x - 1][y];
    max_point = max(max_point, sum);
}
void shape_4(int x, int y) {
    int sum = 0;
    sum += point[x][y] + point[x][y + 1] + point[x + 1][y] + point[x - 1][y];
    max_point = max(max_point, sum);
}

void solve() {
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            check[i][j] = 1;
            dfs(i, j, point[i][j], 1);
            if (j - 1 >= 1 && j + 1 <= M && i + 1 <= N) shape_1(i, j);
            if (j - 1 >= 1 && j + 1 <= M && i - 1 >= 1) shape_2(i, j);
            if (i - 1 >= 1 && j - 1 >= 1 && i + 1 <= N) shape_3(i, j);
            if (i + 1 <= N && i - 1 >= 1 && j + 1 <= M) shape_4(i, j);
            check[i][j] = 0;
        }
    }
    cout << max_point;
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    cin >> N >> M;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            cin >> point[i][j];
        }
    }
    solve();
    return 0;
}

 

 

질문 및 조언 댓글 남겨주세요!

'백준' 카테고리의 다른 글

백준 1260 - DFS와 BFS(C++)  (0) 2021.08.02
백준 1707 - 이분 그래프(C++)  (0) 2021.08.02
백준 2178 - 미로 탐색(C++)  (0) 2021.07.31
백준 1600 - 말이 되고픈 원숭이(C++)  (0) 2021.07.30
백준 1012 - 유기농 배추(C++)  (0) 2021.07.30