Skip to content

Commit 36784ce

Browse files
committed
[Gold IV] Title: 테트로미노, Time: 664 ms, Memory: 34736 KB -BaekjoonHub
1 parent f714a8d commit 36784ce

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# [Gold IV] 테트로미노 - 14500
2+
3+
[문제 링크](https://www.acmicpc.net/problem/14500)
4+
5+
### 성능 요약
6+
7+
메모리: 34736 KB, 시간: 664 ms
8+
9+
### 분류
10+
11+
구현, 브루트포스 알고리즘
12+
13+
### 제출 일자
14+
15+
2025년 6월 23일 13:11:45
16+
17+
### 문제 설명
18+
19+
<p>폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다.</p>
20+
21+
<ul>
22+
<li>정사각형은 서로 겹치면 안 된다.</li>
23+
<li>도형은 모두 연결되어 있어야 한다.</li>
24+
<li>정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다.</li>
25+
</ul>
26+
27+
<p>정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다.</p>
28+
29+
<p style="text-align:center"><a href="https://commons.wikimedia.org/wiki/File:All_5_free_tetrominoes.svg"><img alt="" src="https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/problem/14500/1.png" style="height:167px; width:250px"></a></p>
30+
31+
<p>아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누어져 있으며, 각각의 칸에는 정수가 하나 쓰여 있다.</p>
32+
33+
<p>테트로미노 하나를 적절히 놓아서 테트로미노가 놓인 칸에 쓰여 있는 수들의 합을 최대로 하는 프로그램을 작성하시오.</p>
34+
35+
<p>테트로미노는 반드시 한 정사각형이 정확히 하나의 칸을 포함하도록 놓아야 하며, 회전이나 대칭을 시켜도 된다.</p>
36+
37+
### 입력
38+
39+
<p>첫째 줄에 종이의 세로 크기 N과 가로 크기 M이 주어진다. (4 ≤ N, M ≤ 500)</p>
40+
41+
<p>둘째 줄부터 N개의 줄에 종이에 쓰여 있는 수가 주어진다. i번째 줄의 j번째 수는 위에서부터 i번째 칸, 왼쪽에서부터 j번째 칸에 쓰여 있는 수이다. 입력으로 주어지는 수는 1,000을 넘지 않는 자연수이다.</p>
42+
43+
### 출력
44+
45+
<p>첫째 줄에 테트로미노가 놓인 칸에 쓰인 수들의 합의 최댓값을 출력한다.</p>
46+
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.LinkedList;
6+
import java.util.Queue;
7+
import java.util.StringTokenizer;
8+
9+
public class Main {
10+
11+
static int N,M;
12+
static int arr[][];
13+
static int dx[] = {-1,1,0,0};
14+
static int dy[] = {0,0,-1,1};
15+
static boolean visited[][];
16+
static int answer = Integer.MIN_VALUE;
17+
18+
public static void main(String[] args) throws IOException {
19+
20+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
21+
22+
StringTokenizer st = new StringTokenizer(br.readLine());
23+
24+
N = Integer.parseInt(st.nextToken());
25+
26+
M = Integer.parseInt(st.nextToken());
27+
28+
arr = new int[N][M];
29+
30+
for(int i =0; i<N; i++) {
31+
st = new StringTokenizer(br.readLine());
32+
for(int j =0; j<M; j++) {
33+
arr[i][j] = Integer.parseInt(st.nextToken());
34+
}
35+
}
36+
37+
visited = new boolean[N][M];
38+
for(int i =0; i<N; i++) {
39+
for(int j =0; j<M; j++) {
40+
visited[i][j] = true;
41+
dfs(i,j, arr[i][j], 1);
42+
visited[i][j]= false;
43+
}
44+
}
45+
System.out.println(answer);
46+
}
47+
48+
static void dfs(int x, int y, int sum, int count) {
49+
50+
if(count ==4) {
51+
answer = Math.max(sum, answer);
52+
return;
53+
}
54+
55+
for(int i = 0; i<4; i++) {
56+
int nowx = x +dx[i];
57+
int nowy = y + dy[i];
58+
59+
if(nowx >=0 && nowx <N && nowy >=0 && nowy <M) {
60+
if(!visited[nowx][nowy]) {
61+
62+
if(count ==2) {
63+
visited[nowx][nowy] = true;
64+
dfs(x,y, sum+arr[nowx][nowy], count+1);
65+
visited[nowx][nowy] = false;
66+
}
67+
68+
visited[nowx][nowy] = true;
69+
dfs(nowx, nowy, sum+arr[nowx][nowy], count+1);
70+
visited[nowx][nowy]= false;
71+
}
72+
}
73+
74+
}
75+
}
76+
}

0 commit comments

Comments
 (0)