일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
- problemsolving
- FactoryMethod
- C
- 알고리즘
- UML
- 어댑터패턴
- 빌더패턴
- 클래스다이어그램
- 옵저버
- 팩토리메소드
- 회전하는큐
- bfs
- 백준
- 완전탐색
- 데코레이터패턴
- AbstractFactory
- 테트로미노
- 행위패턴
- C언어
- 구조패턴
- 재귀
- 다이어그램
- ps
- 14500
- 디자인패턴
- 반복자
- 이터레이터
- 생성패턴
- c++
- 추상팩토리
- Today
- Total
salsa source
[BOJ] 14500 : 테트로미노 (DFS 만으로 풀기/C C++) 본문
문제 풀이 POINT!
1. 테트로미노의 블록은 모두 4개로 구성되어있다.
2. 회전이나 대칭이 가능하다.
4개로만 구성되어있기 때문에 모든 경우의 수를 배열에 담아 확인하는 방법도 있겠지만(실제로 BOJ 소스에 많다!)
회전이나 대칭이 가능하기 때문에 만들어야 하는 배열의 경우의 수가 너무 많아 귀찮아서 탐색으로 풀이를 하였다.
회전이나 대칭이 가능하다 라는 조건이 문제를 더 까다롭게 만드는 것 처럼 보이지만 탐색으로 풀이를 한다면 더욱 쉽게 만드는 조건이다.
BFS와 DFS 모두 풀이가 가능하겠지만 나는 DFS로 문제를 풀었다.
DFS로 문제를 푼다면 입력받은 배열에서 시작점을 정하여 각 시작점에서 4칸을 탐색하여 블록을 만들어볼 수 있겠다.
여기까지는 많은 사람들이 쉽게 생각한다. 하지만 예외가 생긴다.
바로 'ㅗ' 'ㅏ' 'ㅓ' 'ㅜ' 모양이다.
1. 출발지점에서 DFS시작(한 칸) 2. DFS 두 칸 탐색
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3. DFS 세 칸 탐색 4. 여기서 노란색은 어떻게 탐색해야 할까?!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
그냥 DFS로 4칸을 탐색한다면, 위와 같이 'ㅗ' 모양은 가운데에서 분기가 생기기 때문에 탐색할 수가 없다. 따라서 아이디어가 필요하다.
내가 생각한 아이디어는 갈라지는 분기에서 DFS를 한 번 더 하는 것이다.
'STUDY > 알고리즘' 카테고리의 다른 글
[BOJ] 1021번 : 회전하는 큐 (C/C++) (0) | 2018.04.03 |
---|