Top 39 테트 로 미노 11569 People Liked This Answer

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 테트 로 미노 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://toplist.pilgrimjournalist.com team, along with other related topics such as: 테트 로 미노 펜토미노, 폴리오미노, 테트리스, Tetromino, 트리오미노, 백준 폴리오 미노, 헥소 미노 개수


[삼성 SW 역량 테스트 기출] 테트로미노
[삼성 SW 역량 테스트 기출] 테트로미노


14500번: 테트로미노

  • Article author: www.acmicpc.net
  • Reviews from users: 38808 ⭐ Ratings
  • Top rated: 4.2 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 14500번: 테트로미노 Updating …
  • Most searched keywords: Whether you are looking for 14500번: 테트로미노 Updating ACM-ICPC, ICPC, 프로그래밍, 온라인 저지, 정보올림피아드, 코딩, 알고리즘, 대회, 올림피아드, 자료구조
  • Table of Contents:

문제

입력

출력

제한

예제 입력 1
복사

예제 출력 1
복사

예제 입력 2
복사

예제 출력 2
복사

예제 입력 3
복사

예제 출력 3
복사

힌트

출처

Baekjoon Online Judge

채점 현황

문제

유저 대회 고등학교 대회

출처

대학교 대회

도움말

14500번: 테트로미노
14500번: 테트로미노

Read More

테트로미노 – 위키백과, 우리 모두의 백과사전

  • Article author: ko.wikipedia.org
  • Reviews from users: 25245 ⭐ Ratings
  • Top rated: 3.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 테트로미노 – 위키백과, 우리 모두의 백과사전 테트로미노(tetromino) 또는 4-오미노(4-omino)는 4개의 정사각형으로 이루어진 폴리오미노이다. 5가지의 자유 테트로미노, 7가지의 단면 테트로미노, 19가지의 고정 … …
  • Most searched keywords: Whether you are looking for 테트로미노 – 위키백과, 우리 모두의 백과사전 테트로미노(tetromino) 또는 4-오미노(4-omino)는 4개의 정사각형으로 이루어진 폴리오미노이다. 5가지의 자유 테트로미노, 7가지의 단면 테트로미노, 19가지의 고정 …
  • Table of Contents:

종류[편집]

직사각형[편집]

테트로미노 - 위키백과, 우리 모두의 백과사전
테트로미노 – 위키백과, 우리 모두의 백과사전

Read More

SuperM :: [DFS] 14500번 테트로미노

  • Article author: hibee.tistory.com
  • Reviews from users: 33187 ⭐ Ratings
  • Top rated: 3.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about SuperM :: [DFS] 14500번 테트로미노 14500_테트로미노 14500번 테트로미노 https://www.acmicpc.net/problem/14500 문제 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, … …
  • Most searched keywords: Whether you are looking for SuperM :: [DFS] 14500번 테트로미노 14500_테트로미노 14500번 테트로미노 https://www.acmicpc.net/problem/14500 문제 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, … 14500_테트로미노 14500번 테트로미노 https://www.acmicpc.net/problem/14500 문제 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해..
  • Table of Contents:

네비게이션

[DFS] 14500번 테트로미노

14500번 테트로미노

문제

입력

출력

예제 입력

예제 출력

해결방법

소스코드

티스토리툴바

사이드바

검색

SuperM :: [DFS] 14500번 테트로미노
SuperM :: [DFS] 14500번 테트로미노

Read More

[백준 14500번] 테트로미노 – 파이썬

  • Article author: data-flower.tistory.com
  • Reviews from users: 46146 ⭐ Ratings
  • Top rated: 4.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [백준 14500번] 테트로미노 – 파이썬 문제 링크: https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, … …
  • Most searched keywords: Whether you are looking for [백준 14500번] 테트로미노 – 파이썬 문제 링크: https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, … 문제 링크: https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안..
  • Table of Contents:

세상을 바꾸는 데이터

[백준 14500번] 테트로미노 – 파이썬 본문

티스토리툴바

[백준 14500번] 테트로미노 - 파이썬
[백준 14500번] 테트로미노 – 파이썬

Read More

백준 14500 테트로미노

  • Article author: velog.io
  • Reviews from users: 24427 ⭐ Ratings
  • Top rated: 3.9 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 백준 14500 테트로미노 Updating …
  • Most searched keywords: Whether you are looking for 백준 14500 테트로미노 Updating # 문제
    ### DFS를 사용해서 합의 최댓값을 구하는 문제. (ㅜ 모양은 예외처리 합니다)

    1. n 종이의 크기 (4 ≤ N, M ≤ 500)

    2. 종이 한칸의 수는 (1<= aij <= 1,000) 3. 5개의 모양을 종이에 놓아서 합의 최대값을 구합니다.

  • Table of Contents:
백준 14500 테트로미노
백준 14500 테트로미노

Read More

테트로미노

  • Article author: wblog.wiki
  • Reviews from users: 18164 ⭐ Ratings
  • Top rated: 3.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 테트로미노 Updating …
  • Most searched keywords: Whether you are looking for 테트로미노 Updating 의 Tetromino는 네 이루어지는 기하학적 형상 인 사각형 접속 직교 (에지가 아닌 모서리 IE). [1] [2] 이것은 도미노 및 펜토미노 와 마찬가지로 특정 유형의 폴리오미노 입니다. 해당 폴리 큐브 착신, tetracube는 네 이루어지는 기하학적 형상 인 큐브 직교하도록 접속되어있다.
  • Table of Contents:
테트로미노
테트로미노

Read More

[백준/C++] 14500 번 : 테트로미노 풀이

  • Article author: silver-g-0114.tistory.com
  • Reviews from users: 49098 ⭐ Ratings
  • Top rated: 4.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [백준/C++] 14500 번 : 테트로미노 풀이 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 … …
  • Most searched keywords: Whether you are looking for [백준/C++] 14500 번 : 테트로미노 풀이 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 … 백준 14500 번 : 테트로미노 문제 링크 : www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각..
  • Table of Contents:

개발아 담하자

[백준C++] 14500 번 테트로미노 풀이 본문

[백준/C++] 14500 번 : 테트로미노 풀이
[백준/C++] 14500 번 : 테트로미노 풀이

Read More

백준 14500 테트로미노 c++ (dfs)

  • Article author: ongveloper.tistory.com
  • Reviews from users: 37741 ⭐ Ratings
  • Top rated: 4.4 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 백준 14500 테트로미노 c++ (dfs) 문제 출처 : https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, … …
  • Most searched keywords: Whether you are looking for 백준 14500 테트로미노 c++ (dfs) 문제 출처 : https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, … 문제 출처 : https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안..
  • Table of Contents:

문제

입력

출력

알고리즘 분류

풀이

코드

태그

관련글

댓글0

공지사항

최근글

인기글

최근댓글

태그

전체 방문자

티스토리툴바

백준 14500 테트로미노 c++ (dfs)
백준 14500 테트로미노 c++ (dfs)

Read More

[백준] 14500 – 테트로미노 (java)

  • Article author: intrepidgeeks.com
  • Reviews from users: 3128 ⭐ Ratings
  • Top rated: 4.2 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [백준] 14500 – 테트로미노 (java) 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. …
  • Most searched keywords: Whether you are looking for [백준] 14500 – 테트로미노 (java) 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다.
  • Table of Contents:
 [백준] 14500 - 테트로미노 (java)
[백준] 14500 – 테트로미노 (java)

Read More


See more articles in the same category here: https://toplist.pilgrimjournalist.com/blog/.

SuperM :: [DFS] 14500번 테트로미노

14500_테트로미노

14500번 테트로미노

문제

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다.

정사각형은 서로 겹치면 안된다.

도형은 모두 연결되어 있어야 한다.

정사각형의 꼭짓점끼리 연결되어 있어야 한다. 즉, 변과 꼭짓점이 맞닿아있으면 안된다.

정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다.

아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누어져 있으며, 각각의 칸에는 정수가 하나 쓰여 있다.

테트로미노 하나를 적절히 놓아서 테트로미노가 놓인 칸에 쓰여 있는 수들의 합을 최대로 하는 프로그램을 작성하시오.

테트로미노는 반드시 한 정사각형이 정확히 하나의 칸을 포함하도록 놓아야 하며, 회전이나 대칭을 시켜도 된다.

입력

첫째 줄에 종이의 세로 크기 N과 가로 크기 M이 주어진다. (4 ≤ N, M ≤ 500)

둘째 줄부터 N개의 줄에 종이에 쓰여 있는 수가 주어진다. i번째 줄의 j번째 수는 위에서부터 i번째 칸, 왼쪽에서부터 j번째 칸에 쓰여 있는 수이다. 입력으로 주어지는 수는 1,000을 넘지 않는 자연수이다.

출력

첫째 줄에 테트로미노가 놓인 칸에 쓰인 수들의 합의 최댓값을 출력한다.

예제 입력

5 5 1 2 3 4 5 5 4 3 2 1 2 3 4 5 6 6 5 4 3 2 1 2 1 2 1

4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

4 10 1 2 1 2 1 2 1 2 1 2 2 1 2 1 2 1 2 1 2 1 1 2 1 2 1 2 1 2 1 2 2 1 2 1 2 1 2 1 2 1

예제 출력

19

20

7

해결방법

모든 경우를 매칭하여 최대값을 구하는 완전탐색 문제이다

⭐️ 솔루션 1 ⭐️

처음 문제를 보고 모든 도형을 저장한 뒤, 전체의 맵을 돌아보는 것을 생각했다 시간복잡도를 계산해봤는데 시간초과가 발생하지 않아서 이대로 구현을 했다

모든 도형은 1×1 정사각형 4개로 이뤄져있기 때문에 미리 모든 도형을 배열로 저장하였다

int tetromino[6][4][4][2] = { }

그 다음 반복문을 통해 모든 도형을 매칭하여 값을 얻었다

// 행 탐색 for(int i=0; i1) break; if(k == 1 && d>0) break; go_tetris(i,j,k,d); } } } }

이렇게 단순구현 시, 시간복잡도는 아래와 같다

전체 맵을 탐색 (n * m)

k 종류의 도형 매칭 (k)

도형 4방향 회전 (d)

1×1 정사각형 4개로 칸의 합 구하기 (i)

시간복잡도 : O(500^2 * 6 * 4 * 4) = O(24,000,000)

⭐️ 솔루션 2 ⭐️

하지만 구글링을 해보니 이 문제는 DFS 로 구현을 하는 문제였다…. 그래서 다시 DFS 로 구현을 시도했다 시간복잡도를 계산해봤는데 시간초과가 발생하지 않아서 이대로 구현을 했다

새로운 솔루션은 DFS 탐색을 수행하는 것이다

한 노드에서 4번만큼 4방향으로 노드를 확장시킨다면? ‘ㅗ’ 도형을 제외한 모든 테트로미노의 경우가 나오게된다 !!! 그렇다면 dfs 로 나머지 도형을 탐색하고 ‘ㅗ’ 도형만 예외로 처리를 해주면 된다 !!

DFS 구현 시, 시간복잡도는 아래와 같다

전체 맵을 탐색 (n * m)

각 노드별 DFS 탐색 (4^4)

예외의 경우(ㅗ) 탐색 (4*4)

1×1 정사각형 4개로 칸의 합 구하기 (i)

시간복잡도 : O(500^2 * (4^4 + 4*4)) = O(68,000,000)

소스코드

[ 단순 구현 ]

문제 해결 시간 : 50m 메모리 : 3212 KB 시간 : 60 ms

#include #include #include #include #define MAX 501 using namespace std; /* 테트리스의 모든 모양을 미리 선언을 하여 맞춰보는 구현방법 – 전체 맵을 탐색 (n * m) – k 종류의 도형 매칭 (k) – 도형 4방향 회전 (d) – 1×1 정사각형 4개로 칸의 합 구하기 (i) 시간복잡도 : O(500^2 * 6 * 4 * 4) = O(24,000,000) */ int n,m,ans; int map[MAX][MAX]; // 종류, 방향, 블럭 int tetromino[6][4][4][2] = { // ㅡ 블럭 { // 첫번째 방향 { {0,0},{0,1},{0,2},{0,3} }, // 두번째 방향 { {0,0},{1,0},{2,0},{3,0} }, // 세번째 방향 (X) { {0,0},{0,0},{0,0},{0,0} }, // 네번째 방향 (X) { {0,0},{0,0},{0,0},{0,0} } }, // ㅁ 블럭 { // 첫번째 방향 { {0,0},{0,1},{1,0},{1,1} }, // 두번째 방향 (X) { {0,0},{0,0},{0,0},{0,0} }, // 세번째 방향 (X) { {0,0},{0,0},{0,0},{0,0} }, // 네번째 방향 (X) { {0,0},{0,0},{0,0},{0,0} } }, // ㄴ 블럭 { // 첫번째 방향 { {0,0},{1,0},{2,0},{2,1} }, // 두번째 방향 { {0,0},{0,1},{0,2},{1,0} }, // 세번째 방향 { {0,0},{0,1},{1,1},{2,1} }, // 네번째 방향 { {0,0},{0,1},{0,2},{-1,2} } }, // ㄴ 블럭 (대칭) { // 첫번째 방향 { {0,0},{0,1},{-1,1},{-2,1} }, // 두번째 방향 { {0,0},{1,0},{1,1},{1,2} }, // 세번째 방향 { {0,0},{0,1},{1,0},{2,0} }, // 네번째 방향 { {0,0},{0,1},{0,2},{1,2} } }, // ⨫ 블럭 { // 첫번째 방향 { {0,0},{1,0},{1,1},{2,1} }, // 두번째 방향 { {0,0},{0,1},{-1,1},{-1,2} }, // 세번째 방향 { {0,0},{1,0},{1,-1},{2,-1} }, // 네번째 방향 { {0,0},{0,1},{1,1},{1,2} } }, // ㅗ 블럭 { // 첫번째 방향 { {0,0},{0,-1},{0,1},{-1,0} }, // 두번째 방향 { {0,0},{-1,0},{1,0},{0,1} }, // 세번째 방향 { {0,0},{0,-1},{0,1},{1,0} }, // 네번째 방향 { {0,0},{-1,0},{1,0},{0,-1} } } }; void go_tetris(int row,int col,int kind,int dir){ int sum = 0; for(int i=0; i<4; i++){ int nx = row + tetromino[kind][dir][i][0]; int ny = col + tetromino[kind][dir][i][1]; if(nx<0 || ny<0 || nx>= n || ny>=m) return; sum += map[nx][ny]; } ans = max(ans,sum); } int main(int argc, const char * argv[]) { // cin,cout 속도향상 ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m; for(int i=0; i> map[i][j]; } } ans = 0; for(int i=0; i1) break; if(k == 1 && d>0) break; go_tetris(i,j,k,d); } } } } cout << ans << " "; return 0; } [ DFS 구현 ] 문제 해결 시간 : 50m 메모리 : 3212 KB 시간 : 84 ms #include #include #include #include #define MAX 501 using namespace std; /* 한 노드에서 상하좌우 탐색을 4번 수행했을 때, ‘ㅗ’ 를 제외한 모든 테트로미노 모형이 된다 따라서 ‘ㅗ’ 를 예외처리로 두고 나머지를 DFS 탐색을 통해 수행하면 모든 경우를 탐색할 수 있다 – 전체 맵을 탐색 (n * m) – 각 노드별 DFS 탐색 (4^4) – 에외 경우 탐색 (4*4) 시간복잡도 : O(500^2 * (4^4 + 4*4)) = O(68,000,000) */ int n,m,ans; int map[MAX][MAX]; bool visited[MAX][MAX]; int dx[4] = {0,0,1,-1}; int dy[4] = {1,-1,0,0}; int exception_case[4][4][2] = { {{0,0},{0,-1},{0,1},{-1,0}}, {{0,0},{-1,0},{1,0},{0,1}}, {{0,0},{0,-1},{0,1},{1,0}}, {{0,0},{-1,0},{1,0},{0,-1}} }; void dfs(int x,int y,int cnt,int sum){ // 테트로미노를 만든 경우 if(cnt == 4){ ans = max(ans,sum); return; } for(int i=0; i<4; i++){ int nx = x + dx[i]; int ny = y + dy[i]; if(nx<0 || ny<0 || nx>=n || ny>=m) continue; if(!visited[nx][ny]){ visited[nx][ny] = true; dfs(nx,ny,cnt+1,sum+map[nx][ny]); visited[nx][ny] = false; } } } // ‘ㅗ’ 의 경우 예외처리 // 4방향 x 정사각형 4개 void getExceptionCase(int x,int y){ for(int i=0; i<4; i++){ bool flag = true; int sum = 0; for(int j=0; j<4; j++){ int nx = x + exception_case[i][j][0]; int ny = y + exception_case[i][j][1]; if(nx<0 || ny<0 || nx>=n || ny>=m){ flag = false; break; } sum += map[nx][ny]; } if(flag) ans = max(ans,sum); } } int main(int argc, const char * argv[]) { // cin,cout 속도향상 ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m; for(int i=0; i> map[i][j]; } } memset(visited, false, sizeof(visited)); ans = 0; for(int i=0; i

[백준 14500번] 테트로미노

문제 링크:

https://www.acmicpc.net/problem/14500

백준 14500번 테트로미노 문제는 삼성 SW 역량테스트 기출문제이다.

테트로미노

풀이 유형:

구현, 브루트 포스(완전 탐색) 알고리즘, DFS

풀이 과정 1

<브루트 포스(완전 탐색)로만 이용>

1. 테트로미노 모양은 5가지가 있다. 이 모양에 해당하는 함수들을 모두 만들어 계산한다.

2. 모양에 따라 회전하는 함수와 대칭하는 함수 2개를 모두 만들어야 하기 때문에 코드가 매우 길어진다.

3. 필자는 DFS방식을 이용하지 않고 브루트 포스, 구현 으로 문제를 풀었다. 코드가 약 280줄이 나왔기에 파이썬에는 시간 초과가 뜨고, PyPy3에서는 Pass 되었다.

4. 조금 더 간단하게 푸는 방법은 밑에 있는 DFS 설명을 보자.

참고) 간단한 코드상에서는 Python3가 메모리, 속도 측에서 우세, 복잡한 코드(반복)를 사용하는 경우에서는 PyPy3가 우세한다.

(문제 푸는데 몇 시간이 걸렸다… 하지만 풀어서 행복하다!!

앞으로도 연습 많이 해야겠다)

풀이 코드:

# 14500번 테트로미노 # 방향체크 함수 생성 # 회전, 대칭하는 함수 생성 # 제일 왼쪽에 있는 숫자를 기준으로 모든 숫자 반복문 실행하며 수들의 합 구하기 from sys import stdin # 종이의 세로 크기와 가로 크기 입력받기 n, m = map(int, stdin.readline().rstrip().split()) # 종이에 있는 데이터 리스트 생성 data = [] # 숫자를 한 행씩 입력받기 for _ in range(n): data.append(list(map(int, stdin.readline().split()))) # 현재 가리키고 있는 방향 direction = 0 # 북, 동, 남, 서 방향 정의 dx = [-1, 0, 1, 0] dy = [0, 1, 0, -1] # 오른쪽방향으로 90도 돌기 def turn_right(): global direction direction += 1 if direction == 4: direction = 0 # 테트로미노를 나타내는 함수 # 1. 4×1 모양 def get_tetro_1(nx, ny): global direction cnt1 = 0 # 테트로미노 모양 생성 for _ in range(4): # 종이에 이탈하면 0으로 초기화 if nx < 0 or ny < 0 or nx >= n or ny >= m: cnt1 = 0 return cnt1 cnt1 += data[nx][ny] nx += dx[direction] ny += dy[direction] return cnt1 # 2. 2×2 모양 def get_tetro_2(nx, ny): cnt2 = 0 # 종이를 이탈하면 0을 반환 if nx < 0 or ny < 0 or nx+1 >= n or ny+1 >= m: return cnt2 cnt2 += data[nx][ny] cnt2 += data[nx][ny+1] cnt2 += data[nx+1][ny] cnt2 += data[nx+1][ny+1] return cnt2 # 3. L자모양 def get_tetro_3(nx, ny): global direction cnt3 = 0 # 기존 모양대로 회전 for _ in range(3): # 종이를 이탈하면 0으로 반환 if nx < 0 or ny < 0 or nx >= n or ny >= m: cnt3 = 0 return cnt3 cnt3 += data[nx][ny] nx += dx[direction] ny += dy[direction] # 마지막 이동한 위치로 이동 nx -= dx[direction] ny -= dy[direction] # 이동 방향 설정 if direction != 0: direction -= 1 else: direction = 3 # 이동할 좌표 설정 nx += dx[direction] ny += dy[direction] # 종이를 이탈하면 0을 반환 if nx < 0 or ny < 0 or nx >= n or ny >= m: cnt3 = 0 return cnt3 # 이동하기 cnt3 += data[nx][ny] return cnt3 # 3-1. L자대칭 모양 def sym_tetro_3(sym_nx, sym_ny): global direction sym_cnt3 = 0 # 대칭모양 회전 for _ in range(3): # 종이를 이탈하면 0을 반환 if sym_nx < 0 or sym_ny < 0 or sym_nx >= n or sym_ny >= m: sym_cnt3 = 0 return sym_cnt3 sym_cnt3 += data[sym_nx][sym_ny] sym_nx += dx[direction] sym_ny += dy[direction] # 마지막 이동한 위치로 이동 sym_nx -= dx[direction] sym_ny -= dy[direction] # 이동 방향 설정 if direction != 3: direction += 1 else: direction = 0 # 이동할 좌표 설정 sym_nx += dx[direction] sym_ny += dy[direction] # 이동시 종이를 이탈하면 0을 반환 if sym_nx < 0 or sym_ny < 0 or sym_nx >= n or sym_ny >= m: sym_cnt3 = 0 return sym_cnt3 # 이동하기 sym_cnt3 += data[sym_nx][sym_ny] return sym_cnt3 # 4. 지그재그 모양 def get_tetro_4(nx, ny): global direction cnt4 = 0 # 현재 위치 값 저장 cnt4 += data[nx][ny] # 이동할 좌표 설정 nx += dx[direction] ny += dy[direction] # 종이를 이탈하면 0을 반환 if nx < 0 or ny < 0 or nx >= n or ny >= m: cnt4 = 0 return cnt4 # 이동하기 cnt4 += data[nx][ny] # 방향 바꾸기 if direction != 0: direction -= 1 else: direction = 3 # 이동할 좌표 설정 nx += dx[direction] ny += dy[direction] # 종이를 이탈하면 0을 반환 if nx < 0 or ny < 0 or nx >= n or ny >= m: cnt4 = 0 return cnt4 # 이동하기 cnt4 += data[nx][ny] # 방향 바꾸기 if direction != 3: direction += 1 else: direction = 0 # 이동할 좌표 설정 nx += dx[direction] ny += dy[direction] # 종이를 이탈하면 0을 반환 if nx < 0 or ny < 0 or nx >= n or ny >= m: cnt4 = 0 return cnt4 cnt4 += data[nx][ny] return cnt4 # 4-1 지그재그 대칭 모양 def sym_tetro_4(nx, ny): global direction sym_cnt4 = 0 # 현재 위치 값 저장 sym_cnt4 += data[nx][ny] # 이동할 좌표 설정 nx += dx[direction] ny += dy[direction] # 종이를 이탈하면 0을 반환 if nx < 0 or ny < 0 or nx >= n or ny >= m: sym_cnt4 = 0 return sym_cnt4 # 이동하기 sym_cnt4 += data[nx][ny] # 방향 바꾸기 if direction != 3: direction += 1 else: direction = 0 # 이동할 좌표 설정 nx += dx[direction] ny += dy[direction] # 종이를 이탈하면 0을 반환 if nx < 0 or ny < 0 or nx >= n or ny >= m: sym_cnt4 = 0 return sym_cnt4 # 이동하기 sym_cnt4 += data[nx][ny] # 방향 바꾸기 if direction != 0: direction -= 1 else: direction = 3 # 이동할 좌표 설정 nx += dx[direction] ny += dy[direction] # 종이를 이탈하면 0을 반환 if nx < 0 or ny < 0 or nx >= n or ny >= m: sym_cnt4 = 0 return sym_cnt4 sym_cnt4 += data[nx][ny] return sym_cnt4 # 5. ㅜ, ㅗ, ㅓ, ㅏ 모양 def get_tetro_5(nx,ny): global direction cnt5 = 0 # 이동하기 for _ in range(3): # 종이를 이탈하면 0을 반환 if nx < 0 or ny < 0 or nx >= n or ny >= m: cnt5 = 0 return cnt5 cnt5 += data[nx][ny] nx += dx[direction] ny += dy[direction] # 가운데 위치로 이동 for _ in range(2): nx -= dx[direction] ny -= dy[direction] # 방향 바꾸기 if direction != 3: direction += 1 else: direction = 0 nx += dx[direction] ny += dy[direction] # 종이를 이탈하면 0을 반환 if nx < 0 or ny < 0 or nx >= n or ny >= m: cnt5 = 0 return cnt5 cnt5 += data[nx][ny] return cnt5 # 결과를 출력할 변수 생성 sum = -1e9 # 방향 북쪽으로 설정 direction = 0 # 하나의 숫자를 기준으로 테트로미노인지 확인 for i in range(n): for j in range(m): # 방향별로 돌리면서 수의 합 구하기 for k in range(4): direction = k case1 = get_tetro_1(i, j) direction = k case2 = get_tetro_2(i, j) direction = k case3 = get_tetro_3(i, j) direction = k case3_1 = sym_tetro_3(i, j) direction = k case4 = get_tetro_4(i, j) direction = k case4_1 = sym_tetro_4(i, j) direction = k case5 = get_tetro_5(i, j) direction = k # 계산결과 중 가장 큰 테트로미노 값으로 반환 sum = max(sum, case1, case2, case3, case3_1, case4, case4_1, case5) # 방향 바꾸기 turn_right() # 정답 출력 print(sum)

풀이 과정 2

1. 테트로미노 중 ‘ㅗ’ 모양을 가진 분홍색 테트로미노를 제외한 나머지 모양들은 DFS를 통해 구할 수 있다.

테트로미노

이는 예시로 빨간 점에서 DFS를 수행한다면 나머지 4개 모양들은 방향과 상관없이 만들 수 있다.

2. ‘ㅗ’ 모양은 idx = 1일 때(2개의 블록을 선택했을 때) 새로운 블록에서 다음 블록을 탐색하는 것이 아닌 기존 블록에서 탐색한다면 ‘ㅗ’ 모양을 만들 수 있다.

3. 종이(2차원 배열)에서 최댓값을 찾아 max(map(max, arr)) 선택할 수 있는 남은 블록의 개수만큼 곱하고, 이를 현재 누적 합 total에 더해서 ans와 비교해준다.

풀이 코드:

import sys input = sys.stdin.readline # dfs 정의 def dfs(r, c, idx, total): # 결과값 변수 global ans # 현재의 dfs에서 남은 블록이 모두 최댓값에 해당하더라도 현재 ans를 넘기지 못한다면 조기종료 if ans >= total + max_val * (3 – idx): return # 4개의 블록을 모두 사용했으면 if idx == 3: # 현재 dfs한 값과 이전까지의 최댓값(ans)을 비교해 더 큰 값을 ans로 반환하고 종료 ans = max(ans, total) return # 4개의 블록을 아직 다 사용하지 않았다면 else: # 방향 설정 for i in range(4): nr = r + dr[i] nc = c + dc[i] # 이동할려는 위치가 종이(배열)안에 있고 방문한 적이 없다면 if 0 <= nr < N and 0 <= nc < M and visit[nr][nc] == 0: # 만약 2개의 볼록을 선택했다면 if idx == 1: # 방문도장 찍기 visit[nr][nc] = 1 # 방문도장 찍은 위치에서 dfs 재귀적 호출 dfs(r, c, idx + 1, total + arr[nr][nc]) # 목적지를 풀어주기 visit[nr][nc] = 0 # 방문도장 찍기 visit[nr][nc] = 1 # 방문도장 찍은 위치에서 dfs 재귀적 호출 dfs(nr, nc, idx + 1, total + arr[nr][nc]) # 목적지 풀어주기 visit[nr][nc] = 0 # 입력받기 N, M = map(int, input().split()) arr = [list(map(int, input().split())) for _ in range(N)] visit = [([0] * M) for _ in range(N)] # 좌표 이동거리 행, 열 입력받기 dr = [-1, 0, 1, 0] dc = [0, 1, 0, -1] ans = 0 # 종이 중에 가장 큰 값 max_val = max(map(max, arr)) # 종이에 있는 숫자를 하나씩 입력받아 for r in range(N): for c in range(M): # 방문도장 찍기 visit[r][c] = 1 # dfs 호출하여 ans 최댓값 구하기 dfs(r, c, 0, arr[r][c]) # 목적지 해제 visit[r][c] = 0 # 정답 출력 print(ans) 14500번 테트로미노 728x90 반응형

백준 14500 테트로미노

인생 뭐 될 때까지 하는 거지

문제

DFS를 사용해서 합의 최댓값을 구하는 문제. (ㅜ 모양은 예외처리 합니다)

n 종이의 크기 (4 ≤ N, M ≤ 500) 종이 한칸의 수는 (1<= aij <= 1,000) 5개의 모양을 종이에 놓아서 합의 최대값을 구합니다. (모양은 회전, 대칭이 가능합니다.) 1. 첫인상 귀찮아 각각의 모양을 만들고, 대칭, 회전할 생각에 귀찮아 집니다. 그런데 잘 생각 해보면 (사실, 생각은 잘 안나고 누가 말해주면, 그런가 같더라구요) ㅜ를 제외한 나머지 4개의 모양은 길이가 4인 DFS의 탐색 모양입니다. 아래 그림과 같이 가운데 시작 점으로 부터 파란색으로 색칠된 영역을 탐색합니다. 다만 ㅜ 모양은 최대 길이가 3인 DFS입니다. 그렇기 때문에 따로 만들어 주어야합니다. 2. 접근 과정 문제를 작게 나눠보면 다음과 같습니다. 1. 입력 각각의 모양 검사 ㅜ 를 제외한 4개 DFS 사용 ㅜ 를 검사하는 함수 출력 1, 3번은 일반적인 입력과 출력이기 때문에 2번의 모양 검사를 중심적으로 보겠습니다. 3. ㅜ 를 제외한 4개 DFS 사용 1) 평소의 DFS랑 다르다. 평소에 사용하는 깊이 우선 탐색은 방문한 점을 다시 방문하지 않습니다. 하지만, 모양을 대칭, 회전 시키기 위해서는 한점을 다시 방문해야합니다. 이렇게 모든 경우의 수를 전부 고려하는 알고리즘을 백트래킹 이라고 합니다. 방문한 점을 다시 방문하기 위해서 탐색을 완료하면 그 정점을 방문하기 전 상태로 되돌려 놓아야합니다. 2) BFS는 안돼나요? BFS는 돌아올 수 없습니다. 재귀는 내부적으로 스택을 사용하기 때문에 거꾸로 되돌아가는게 가능합니다. 하지만, BFS는 되돌아갈 수 없습니다. 3) DFS 어떻게 되돌아오나요? for ( int i = 0 ; i < 4 ; i ++ ) { int nx = x + dx [ i ] ; int ny = y + dy [ i ] ; if ( nx < 1 || nx > n || ny < 1 || ny > m ) continue ; if ( ! check [ nx ] [ ny ] ) { check [ nx ] [ ny ] = true ; dfs ( nx , ny , sum_value + a [ nx ] [ ny ] , length + 1 ) ; check [ nx ] [ ny ] = false ; } }

4. ㅜ 를 검사하는 함수

1) 방법

4개의 모양의 왼쪽 상단을 기준 (0, 0) 으로 삼고 검사합니다.

2) 예시

void check_exshape ( int x , int y ) { int sum_value = 0 ; if ( x >= 1 && x + 1 <= n && y >= 1 && y + 2 <= m ) { sum_value = a [ x ] [ y ] + a [ x ] [ y + 1 ] + a [ x ] [ y + 2 ] + a [ x + 1 ] [ y + 1 ] ; result = max ( result , sum_value ) ; } if ( x >= 1 && x + 2 <= n && y >= 1 && y + 1 <= m ) { sum_value = a [ x ] [ y ] + a [ x + 1 ] [ y ] + a [ x + 2 ] [ y ] + a [ x + 1 ] [ y + 1 ] ; result = max ( result , sum_value ) ; } if ( x - 1 >= 1 && x <= n && y >= 1 && y + 2 <= m ) { sum_value = a [ x ] [ y ] + a [ x ] [ y + 1 ] + a [ x ] [ y + 2 ] + a [ x - 1 ] [ y + 1 ] ; result = max ( result , sum_value ) ; } if ( x - 1 >= 1 && x + 1 <= n && y >= 1 && y + 1 <= m ) { sum_value = a [ x ] [ y ] + a [ x ] [ y + 1 ] + a [ x - 1 ] [ y + 1 ] + a [ x + 1 ] [ y + 1 ] ; result = max ( result , sum_value ) ; } } 5. 시간 복잡도 계산 각점에 대해 DFS 수행 각점 = O(n^2) DFS = O(36) 왜냐하면, 첫점에서 갈 수 있는 경우 4, 2번째 점 3, 3번째 점 3 = 4 3 3 = 36 따라서 전체 시간복잡도는 36 * O(n^2) = O(n^2) 상수 제거, n이 500이기 때문에 n^2은 2500, 1억이 1초이기 때문에 시간안에 충분히 풀 수 있습니다. 6. 코드 1) c++ # include # define max_int 501 using namespace std ; int n , m , a [ max_int ] [ max_int ] , result ; bool check [ max_int ] [ max_int ] ; int dx [ ] = { 0 , 0 , 1 , – 1 } ; int dy [ ] = { – 1 , 1 , 0 , 0 } ; int ex [ 4 ] [ 4 ] = { { 0 , 0 , 0 , 1 } , { 0 , 1 , 2 , 1 } , { 0 , 0 , 0 , – 1 } , { 0 , – 1 , 0 , 1 } } ; int ey [ 4 ] [ 4 ] = { { 0 , 1 , 2 , 1 } , { 0 , 0 , 0 , 1 } , { 0 , 1 , 2 , 1 } , { 0 , 1 , 1 , 1 } } ; int max ( int a , int b ) { return a > b ? a : b ; } void dfs ( int x , int y , int sum_value , int length ) { if ( length >= 4 ) { result = max ( result , sum_value ) ; return ; } for ( int i = 0 ; i < 4 ; i ++ ) { int nx = x + dx [ i ] ; int ny = y + dy [ i ] ; if ( nx < 1 || nx > n || ny < 1 || ny > m ) continue ; if ( ! check [ nx ] [ ny ] ) { check [ nx ] [ ny ] = true ; dfs ( nx , ny , sum_value + a [ nx ] [ ny ] , length + 1 ) ; check [ nx ] [ ny ] = false ; } } } void check_exshape ( int x , int y ) { for ( int i = 0 ; i < 4 ; i ++ ) { bool isOut = false ; int sum_value = 0 ; for ( int j = 0 ; j < 4 ; j ++ ) { int nx = x + ex [ i ] [ j ] ; int ny = y + ey [ i ] [ j ] ; if ( nx < 1 || nx > n || ny < 1 || ny > m ) { isOut = true ; break ; } else { sum_value += a [ nx ] [ ny ] ; } } if ( ! isOut ) { result = max ( result , sum_value ) ; } } } int main ( ) { scanf ( “%d %d” , & n , & m ) ; for ( int i = 1 ; i <= n ; i ++ ) { for ( int j = 1 ; j <= m ; j ++ ) { scanf ( "%d" , & a [ i ] [ j ] ) ; } } for ( int i = 1 ; i <= n ; i ++ ) { for ( int j = 1 ; j <= m ; j ++ ) { check [ i ] [ j ] = true ; dfs ( i , j , a [ i ] [ j ] , 1 ) ; check [ i ] [ j ] = false ; check_exshape ( i , j ) ; } } printf ( "%d " , result ) ; } 2) java

So you have finished reading the 테트 로 미노 topic article, if you find this article useful, please share it. Thank you very much. See more: 펜토미노, 폴리오미노, 테트리스, Tetromino, 트리오미노, 백준 폴리오 미노, 헥소 미노 개수

See also  Top 11 클래식 이더 월렛 The 176 Detailed Answer

Leave a Comment