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://chewathai27.com/to team, along with other related topics such as: 테트 로 미노 알고리즘 펜토미노, 분류 알고리즘, 백준 아이디, 폴리오미노, 백준 학원, Tetromino, 트리오미노
14500번: 테트로미노
- Article author: www.acmicpc.net
- Reviews from users: 15708
Ratings
- Top rated: 4.7
- Lowest rated: 1
- Summary of article content: Articles about 14500번: 테트로미노 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. …
- Most searched keywords: Whether you are looking for 14500번: 테트로미노 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. ACM-ICPC, ICPC, 프로그래밍, 온라인 저지, 정보올림피아드, 코딩, 알고리즘, 대회, 올림피아드, 자료구조
- Table of Contents:
문제
입력
출력
제한
예제 입력 1
복사
예제 출력 1
복사
예제 입력 2
복사
예제 출력 2
복사
예제 입력 3
복사
예제 출력 3
복사
힌트
출처
Baekjoon Online Judge
채점 현황
문제
유저 대회 고등학교 대회
출처
대학교 대회
도움말
![14500번: 테트로미노](https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/images/boj-og.png)
백준 14500 테트로미노
- Article author: velog.io
- Reviews from users: 42906
Ratings
- Top rated: 3.6
- Lowest rated: 1
- Summary of article content: Articles about 백준 14500 테트로미노 이렇게 모든 경우의 수를 전부 고려하는 알고리즘을 백트래킹 이라고 합니다. 방문한 점을 다시 방문하기 위해서 탐색을 완료하면 그 정점을 방문하기 … …
- Most searched keywords: Whether you are looking for 백준 14500 테트로미노 이렇게 모든 경우의 수를 전부 고려하는 알고리즘을 백트래킹 이라고 합니다. 방문한 점을 다시 방문하기 위해서 탐색을 완료하면 그 정점을 방문하기 … # 문제
### DFS를 사용해서 합의 최댓값을 구하는 문제. (ㅜ 모양은 예외처리 합니다)1. n 종이의 크기 (4 ≤ N, M ≤ 500)
2. 종이 한칸의 수는 (1<= aij <= 1,000) 3. 5개의 모양을 종이에 놓아서 합의 최대값을 구합니다.
- Table of Contents:
![백준 14500 테트로미노](https://velog.velcdn.com/images/skyepodium/post/14dc5243-55a8-43c1-b522-2a35834113eb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-05-01%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.19.25.png)
백준 14500 테트로미노 c++ (dfs)
- Article author: ongveloper.tistory.com
- Reviews from users: 36035
Ratings
- Top rated: 3.7
- Lowest rated: 1
- Summary of article content: Articles about 백준 14500 테트로미노 c++ (dfs) 테트로미노는 반드시 한 정사각형이 정확히 하나의 칸을 포함하도록 … 다시 부모 노드로 돌아가는 dfs에 속하는 백트래킹 알고리즘이라 할 수 있다. …
- Most searched keywords: Whether you are looking for 백준 14500 테트로미노 c++ (dfs) 테트로미노는 반드시 한 정사각형이 정확히 하나의 칸을 포함하도록 … 다시 부모 노드로 돌아가는 dfs에 속하는 백트래킹 알고리즘이라 할 수 있다. 문제 출처 : https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안..
- Table of Contents:
문제
입력
출력
알고리즘 분류
풀이
코드
태그
관련글
댓글0
공지사항
최근글
인기글
최근댓글
태그
전체 방문자
티스토리툴바
![백준 14500 테트로미노 c++ (dfs)](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsWI0H%2FbtrjJzbXXqr%2FFZkKsNrpAKzUKetPHdZ4EK%2Fimg.png)
[DFS] 백준#14500: 테트로미노/Python
- Article author: heytech.tistory.com
- Reviews from users: 40958
Ratings
- Top rated: 4.9
- Lowest rated: 1
- Summary of article content: Articles about [DFS] 백준#14500: 테트로미노/Python 접근법. DFS 알고리즘을 활용하여 문제를 해결하였습니다. DFS를 통해 특정 좌표에 상하좌우 방면으로 3개의 블록을 이어 붙이면 ‘ㅏ … …
- Most searched keywords: Whether you are looking for [DFS] 백준#14500: 테트로미노/Python 접근법. DFS 알고리즘을 활용하여 문제를 해결하였습니다. DFS를 통해 특정 좌표에 상하좌우 방면으로 3개의 블록을 이어 붙이면 ‘ㅏ … 📝 문제 https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다..
- Table of Contents:
Hey Tech
[DFS] 백준#14500 테트로미노Python 본문📝 문제
💡 접근법
💻 코드
✅ 채점결과
💾 Github
📚 참고할 만한 포스팅
티스토리툴바
![[DFS] 백준#14500: 테트로미노/Python](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeSdixv%2Fbtrz1ikvyQT%2Fk04wruAPKDTdtVkkjcVjz1%2Fimg.png)
[백준/C++] 14500 번 : 테트로미노 풀이
- Article author: silver-g-0114.tistory.com
- Reviews from users: 18825
Ratings
- Top rated: 3.2
- Lowest rated: 1
- Summary of article content: Articles about [백준/C++] 14500 번 : 테트로미노 풀이 알고리즘 풀이/백준. [백준/C++] 14500 번 : 테트로미노 풀이. …
- Most searched keywords: Whether you are looking for [백준/C++] 14500 번 : 테트로미노 풀이 알고리즘 풀이/백준. [백준/C++] 14500 번 : 테트로미노 풀이. 백준 14500 번 : 테트로미노 문제 링크 : www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각..
- Table of Contents:
개발아 담하자
[백준C++] 14500 번 테트로미노 풀이 본문![[백준/C++] 14500 번 : 테트로미노 풀이](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3T7c2%2FbtqVh7dZYLY%2FXfztun1HLMkZ96Zpbd6MG0%2Fimg.png)
[백준 14500번] 테트로미노 – 파이썬
- Article author: data-flower.tistory.com
- Reviews from users: 6047
Ratings
- Top rated: 4.9
- Lowest rated: 1
- Summary of article content: Articles about [백준 14500번] 테트로미노 – 파이썬 백준 14500번 테트로미노 문제는 삼성 SW 역량테스트 기출문제이다. 테트로미노. 풀이 유형: 구현, 브루트 포스(완전 탐색) 알고리즘, DFS … …
- Most searched keywords: Whether you are looking for [백준 14500번] 테트로미노 – 파이썬 백준 14500번 테트로미노 문제는 삼성 SW 역량테스트 기출문제이다. 테트로미노. 풀이 유형: 구현, 브루트 포스(완전 탐색) 알고리즘, DFS … 문제 링크: https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안..
- Table of Contents:
세상을 바꾸는 데이터
[백준 14500번] 테트로미노 – 파이썬 본문티스토리툴바
![[백준 14500번] 테트로미노 - 파이썬](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAx17g%2Fbtrs22JbpHg%2Fy7U2ps3xMLSKoJuexobAvK%2Fimg.png)
[BOJ] 14500번 – 테트로미노
- Article author: techblog-history-younghunjo1.tistory.com
- Reviews from users: 22738
Ratings
- Top rated: 4.9
- Lowest rated: 1
- Summary of article content: Articles about [BOJ] 14500번 – 테트로미노 문제설명 https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, … …
- Most searched keywords: Whether you are looking for [BOJ] 14500번 – 테트로미노 문제설명 https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, … 문제설명 https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된..
- Table of Contents:
문제설명
사고과정
풀이(스스로 못 푼 풀이)
‘알고리즘 삽질장’ Related Articles
티스토리툴바
![[BOJ] 14500번 - 테트로미노](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsgpex%2FbtrjVNBPODT%2FKaFkajrd4a9cc0qCMGXxK1%2Fimg.png)
백준 14500번 테트로미노 완전탐색(brute-force) 알고리즘 문제 :: 코드자몽
- Article author: myjamong.tistory.com
- Reviews from users: 34615
Ratings
- Top rated: 3.7
- Lowest rated: 1
- Summary of article content: Articles about 백준 14500번 테트로미노 완전탐색(brute-force) 알고리즘 문제 :: 코드자몽 [백준] 14500번 테트로미노 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 … …
- Most searched keywords: Whether you are looking for 백준 14500번 테트로미노 완전탐색(brute-force) 알고리즘 문제 :: 코드자몽 [백준] 14500번 테트로미노 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 … [백준] 14500번 테트로미노 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되..
- Table of Contents:
태그
관련글
댓글0
최근글
인기글
티스토리툴바
![백준 14500번 테트로미노 완전탐색(brute-force) 알고리즘 문제 :: 코드자몽](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPLB2Y%2FbtqADjk2kKe%2FKxl3qOELmacK2K7zbZjvz0%2Fimg.png)
백준 14500번 테트로미노
- Article author: jaimemin.tistory.com
- Reviews from users: 42595
Ratings
- Top rated: 3.7
- Lowest rated: 1
- Summary of article content: Articles about 백준 14500번 테트로미노 문제 링크입니다: https://www.acmicpc.net/problem/14500 테트로미노를 회전이나 대칭을 … 알고리즘/BOJ … //DFS로 판별할 수 없는 테트로미노. …
- Most searched keywords: Whether you are looking for 백준 14500번 테트로미노 문제 링크입니다: https://www.acmicpc.net/problem/14500 테트로미노를 회전이나 대칭을 … 알고리즘/BOJ … //DFS로 판별할 수 없는 테트로미노. 문제 링크입니다: https://www.acmicpc.net/problem/14500 테트로미노를 회전이나 대칭을 시켜도 되기 때문에 ‘ㅗ’ 모양을 빼고는 모두 DFS(Depth First Search)로 표현할 수 있습니다. 연구소 문제(http://jaime..소소한 프로그래밍과 약간의 게임
- Table of Contents:
백준 14500번 테트로미노
티스토리툴바
SuperM :: [DFS] 14500번 테트로미노
- Article author: hibee.tistory.com
- Reviews from users: 19825
Ratings
- Top rated: 4.2
- 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번 테트로미노
문제
입력
출력
예제 입력
예제 출력
해결방법
소스코드
티스토리툴바
사이드바
검색
See more articles in the same category here: Top 455 tips update new.
백준 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
백준 14500 테트로미노 c++ (dfs)
반응형
문제 출처 : https://www.acmicpc.net/problem/14500
문제
폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다.
정사각형은 서로 겹치면 안 된다.
도형은 모두 연결되어 있어야 한다.
정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다.
정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다.
아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누어져 있으며, 각각의 칸에는 정수가 하나 쓰여 있다.
테트로미노 하나를 적절히 놓아서 테트로미노가 놓인 칸에 쓰여 있는 수들의 합을 최대로 하는 프로그램을 작성하시오.
테트로미노는 반드시 한 정사각형이 정확히 하나의 칸을 포함하도록 놓아야 하며, 회전이나 대칭을 시켜도 된다.
입력
첫째 줄에 종이의 세로 크기 N과 가로 크기 M이 주어진다. (4 ≤ N, M ≤ 500)
둘째 줄부터 N개의 줄에 종이에 쓰여 있는 수가 주어진다. i번째 줄의 j번째 수는 위에서부터 i번째 칸, 왼쪽에서부터 j번째 칸에 쓰여 있는 수이다. 입력으로 주어지는 수는 1,000을 넘지 않는 자연수이다.
출력
첫째 줄에 테트로미노가 놓인 칸에 쓰인 수들의 합의 최댓값을 출력한다.
알고리즘 분류
풀이
완전 탐색 기반 dfs 문제이다.
우선 문제를 보면 주어진 테트로미노들을 회전하고 뒤집고 할 생각에 좀 스트레스 받지만,
이젠 이런 문제의 대처법을 안다.
간혹가다, 모든 경우를 구현해야 하는 문제도 있지만, 보통은 이렇게 구현해야 할 것이 많으면, 이들의 공통된 규칙이 발견된다.
테트로미노들을 보면 모두 4칸인 걸 알 수 있고, ㅗ 모양을 제외하면, 한 점에서 뎁스4인 깊이 우선 탐색으로 구할 수 있는 것을 알 수 있다.
처음엔 대칭이란 단어를 못 보고, 회전만 시킬 수 있는 줄 알아서 한 점에서 탐색을 시작하되 가지치기를 통해 주어진 테트로미노들의 회전된 모양들만 탐색하는 방법을 찾으려 했지만, 답이 없었고, 문제를 다시 보니 대칭이란 말이 있었다.
회전과 대칭이 가능한 이 테트로미노 모양들은 한 점에서 dfs를 통해 뎁스 4까지 탐색하는 모든 경로들과 같다.
즉, 모든 칸에 대해 ㅗ를 제외한 모양들을 dfs로 4뎁스까지 탐색하고, ㅗ모양은 따로 확인해 주는 것으로 구현을 최소화할 수 있다.
dfs의 구현은, 매번 한 칸에 대해 dfs를 시작할 때마다 visited배열을 초기화하는 것이 아닌, dfs의 특징을 살려 다음 뎁스로 넘어가기 전 visited[nextR][nextC]를 체크하고, 다시 돌아올 때 visited[nextR][nextC]를 해제하는 방법을 사용할 수 있다. 뎁스가 깊어질 때마다 방문한 칸은 체크해야 하지만, 하나의 테트로미노(한 번의 뎁스4까지 탐색)이 끝나면 다시 방문했던 칸을 방문해야 하는 일이 일어나기 때문에 다시 체크를 해제해야 하는 것이다.
이렇게 dfs는 방문했던 칸을 쉽게 되돌아갈 수 있기 때문에, bfs로는 구현이 힘들고 dfs로 하는 것이 알맞다.
즉, 어떤 노드의 유망성을 점검한 후, 유망하지 않으면 다시 부모 노드로 돌아가는 dfs에 속하는 백트래킹 알고리즘이라 할 수 있다.
코드
#include
#include #include using namespace std; //4<=n,m<=400 int n, m; int graph[500][500]; int dir[4][2] = { {0,1} ,{0,-1},{1,0},{-1,0} }; bool visited[500][500]; int answer; bool isInside(int r, int c) { if (r < 0 || r >= n || c < 0 || c >= m) return false; return true; } void reset() { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { visited[i][j] = false; } } } void dfs(int r, int c, int depth, int sum) { if (depth == 3) { answer = max(answer, sum); return; } for (int i = 0; i < 4; i++) { int nR = r + dir[i][0]; int nC = c + dir[i][1]; if (!isInside(nR, nC))continue; if (visited[nR][nC])continue; visited[nR][nC] = true; dfs(nR, nC, depth + 1, sum + graph[nR][nC]); visited[nR][nC] = false; } } void shape1(int r, int c) { int sum = 0; sum = graph[r][c] + graph[r][c + 1] + graph[r][c + 2] + graph[r - 1][c + 1]; answer = max(answer, sum); } void shape2(int r, int c) { int sum = 0; sum = graph[r][c] + graph[r][c + 1] + graph[r][c + 2] + graph[r + 1][c + 1]; answer = max(answer, sum); } void shape3(int r, int c) { int sum = 0; sum = graph[r][c] + graph[r + 1][c] + graph[r + 2][c] + graph[r + 1][c + 1]; answer = max(answer, sum); } void shape4(int r, int c) { int sum = 0; sum = graph[r][c] + graph[r - 1][c + 1] + graph[r][c + 1] + graph[r + 1][c + 1]; answer = max(answer, sum); } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); answer = 0; cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> graph[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { visited[i][j] = true; dfs(i, j, 0, graph[i][j]); visited[i][j] = false; if (i - 1 >= 0 && j + 2 < m) shape1(i, j); if (j + 2 < m && i + 1 < n) shape2(i, j); if (i + 2 < n && j + 1 < m) shape3(i, j); if (i + 1 < n && i - 1 >= 0 && j + 1 < m) shape4(i, j); } } cout << answer; return 0; } 반응형
[DFS] 백준#14500: 테트로미노
728×90
반응형
📝 문제
https://www.acmicpc.net/problem/14500
💡 접근법
DFS 알고리즘을 활용하여 문제를 해결하였습니다. DFS를 통해 특정 좌표에 상하좌우 방면으로 3개의 블록을 이어 붙이면 ‘ㅏ’, ‘ㅓ’, ‘ㅗ’, ‘ㅜ’ 모양을 제외한 모든 테트로미노를 만들 수 있습니다. ‘ㅏ’, ‘ㅓ’, ‘ㅗ’, ‘ㅜ’ 모양의 테트로미노는 2번째 블록까지 붙였을 때 새로운 블록에서 이어붙일 다음 블록을 탐색하지 않고 다시 기존 블록 위치에서 탐색하도록 로직을 작성하면 만들 수 있습니다.
💻 코드
1) 전체 코드
import sys; input = sys.stdin.readline def dfs(x, y, step, total): global answer # 종료조건1) 탐색을 계속 진행하여도 최댓값에 못 미치는 경우 if total + max_val*(4-step) <= answer: return # 종료조건2) 블록 4개를 모두 활용한 경우 if step == 4: answer = max(answer, total) return # 상하좌우 방향으로 블록 이어 붙여 나가기 for dx, dy in d: nx = x + dx # 새로운 x 좌표 ny = y + dy # 새로운 y 좌표 # 새로운 좌표가 유효한 범위 내 있고 탐색이력이 없는 경우 if 0 <= nx < N and 0 <= ny < M and not visited[nx][ny]: # 2번째 블록 연결 후 'ㅏ','ㅓ','ㅗ','ㅜ' 만들기 if step == 2: visited[nx][ny] = True # 탐색기록 # 새로운 좌표에서 탐색하지 않고 기존 좌표로 돌아와 탐색재개 dfs(x, y, step+1, total+board[nx][ny]) visited[nx][ny] = False # 탐색기록 제거 visited[nx][ny] = True dfs(nx, ny, step+1, total+board[nx][ny]) visited[nx][ny] = False if __name__ == "__main__": N, M = map(int, input().split()) # 좌표의 행, 열 개수 board = [list(map(int, input().split())) for _ in range(N)] # 좌표별 값 max_val = max(map(max, board)) # 모든 좌표 중 최댓값 d = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 좌표 내 상하좌우 visited = [[False] * M for _ in range(N)] # 탐색여부 확인용 answer = 0 for i in range(N): for j in range(M): visited[i][j] = True # 탐색기록 dfs(i, j, 1, board[i][j]) visited[i][j] = False # 탐색기록 제거 print(answer) 2) 해설 (1) 데이터 입력 속도 개선 import sys; input = sys.stdin.readline 파이썬 내장함수인 input보다 빠르게 값을 입력받기 위해 sys.stdin.readline을 사용하였습니다. (2) DFS 함수 def dfs(x, y, step, total): global answer # 종료조건1) 탐색을 계속 진행하여도 최댓값에 못 미치는 경우 if total + max_val*(4-step) <= answer: return # 종료조건2) 블록 4개를 모두 활용한 경우 if step == 4: answer = max(answer, total) return # 상하좌우 방향으로 블록 이어 붙여 나가기 for dx, dy in d: nx = x + dx # 새로운 x 좌표 ny = y + dy # 새로운 y 좌표 # 새로운 좌표가 유효한 범위 내 있고 탐색이력이 없는 경우 if 0 <= nx < N and 0 <= ny < M and not visited[nx][ny]: # 2번째 블록 연결 후 'ㅏ','ㅓ','ㅗ','ㅜ' 만들기 if step == 2: visited[nx][ny] = True # 탐색기록 # 새로운 좌표에서 탐색하지 않고 기존 좌표로 돌아와 탐색재개 dfs(x, y, step+1, total+board[nx][ny]) visited[nx][ny] = False # 탐색기록 제거 visited[nx][ny] = True dfs(nx, ny, step+1, total+board[nx][ny]) visited[nx][ny] = False 시간 복잡도를 고려하여 2가지 종료 조건을 추가하였습니다. 첫째, 블록을 더 붙이더라도 이전에 구한 좌표값들의 총합 중 최댓값(answer)을 넘지 못하는 경우 둘째, 블록은 총 4개이므로 4개의 블록을 모두 조합한 경우 위의 종료 조건을 만족하지 않으면, 반복문을 통해 특정 좌표에서 상하좌우 방향으로 이어 붙일 블록을 탐색합니다. 2번째 블록까지 이어 붙였다면 'ㅏ', 'ㅓ', 'ㅗ', 'ㅜ' 블록도 만들 수 있도록 로직을 작성해야 합니다. 이때 사용한 방법이 3개의 연이은 블록(i.e., ㅁㅁㅁ) 중간에 블록 1개를 추가로 붙이되 탐색하는 좌표는 실제로 변화시키지 않는 것입니다. 즉, 중간에 블록을 추가로 붙였다면 해당 블록에서 탐색을 재개하지 않고, 해당 블록을 붙인 기존의 블록에서 탐색을 재개하도록 로직을 작성하면 됩니다. 이외 다른 모양의 테트로미노는 상하좌우 방향으로 탐색하고 블록을 이어붙이면 만들 수 있습니다. 따라서, 일반적인 재귀 함수를 활용하는 DFS처럼 새로운 좌표를 함수에 재귀적으로 전달하여 로직을 완성하였습니다. (3) 메인함수 if __name__ == "__main__": N, M = map(int, input().split()) # 좌표의 행, 열 개수 board = [list(map(int, input().split())) for _ in range(N)] # 좌표별 값 max_val = max(map(max, board)) # 모든 좌표 중 최댓값 d = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 좌표 내 상하좌우 visited = [[False] * M for _ in range(N)] # 탐색여부 확인용 answer = 0 for i in range(N): for j in range(M): visited[i][j] = True # 탐색기록 dfs(i, j, 1, board[i][j]) visited[i][j] = False # 탐색기록 제거 print(answer) ✅ 채점결과 정답 확인 💾 Github https://github.com/park-gb/algorithm-problem-solving/blob/main/dfs-bfs/boj_14500.py 📚 참고할 만한 포스팅 문제 풀이에 사용한 DFS 알고리즘에 대한 자세한 내용은 아래의 포스팅을 참고해 주세요! https://heytech.tistory.com/55 포스팅 내용에 오류가 있거나 접근법 및 코드 관련 피드백 환영합니다!😄 아래에 👇👇👇 댓글 남겨주시면 감사드리겠습니다. 그럼 오늘도 즐겁고 건강한 하루 보내시길 바랍니다 🙂 고맙습니다. 728x90 반응형
So you have finished reading the 테트 로 미노 알고리즘 topic article, if you find this article useful, please share it. Thank you very much. See more: 펜토미노, 분류 알고리즘, 백준 아이디, 폴리오미노, 백준 학원, Tetromino, 트리오미노