Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 삼성 기출
- 그리디
- PS
- SWEA
- dfs
- 백트래킹
- koitp
- dynamic programming
- hackerrank
- 맛집
- 다이나믹 프로그래밍
- 삼성 SDS 대학생 알고리즘 특강
- C++
- 동적 계획법
- 스택
- 브루트포스
- 에라토스테네스의 체
- DP
- 알고리즘
- 구현
- Algorithm
- sw expert academy
- BOJ
- 완전탐색
- 해커랭크
- BFS
- 백준
- 소수
- 잠실
- 시뮬레이션
Archives
- Today
- Total
펭로그
[C++] 백준 BOJ 10026 적록색약 본문
문제링크 : https://boj.kr/10026
현재 위치를 기준으로 상, 하, 좌, 우의 4방향을 DFS로 탐색해서 같은 영역인지 여부를 확인한다.
같은 영역이 아닐 경우 빠져나오며 단 한번이라도 같은 영역이 나오면 true를 반환한다.
시간 복잡도에는 크게 영향이 없을 것 같으나 편의를 위해서 한번 탐색한 'R'은 'G'로 바꿔주도록 했다.
dfs 탐색 도중 중간에서 반환하는 false의 경우는 최초 dfs 실행 후 담을 chk 변수가 아닌 이상 딱히 의미는 없다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | // BOJ 10026 적록색약 #include <bits/stdc++.h> using namespace std; #define MAXN 101 int num; char mat[MAXN][MAXN]; bool visited[MAXN][MAXN]; // 방문 체크 const int dir[4][2] = {{0, -1}, {-1, 0}, {1, 0}, {0, 1}}; // 4방향 bool dfs(int x, int y, char input) { if (!visited[x][y] && mat[x][y] == input) { visited[x][y] = true; if(mat[x][y] == 'R') mat[x][y] = 'G'; // 다음 탐색(적록색맹)에서 활용하기 위해 for (int i = 0; i < 4; i++)// 상하좌우 dfs dfs(x + dir[i][0], y + dir[i][1], input); return true; // 단 한번이라도 input의 색상이 나왔다면 반환 } else return false; // 영역이 존재하지 않음 } int calc(char input){ int result = 0; for(int i = 1; i <= num; i++) { for (int j = 1; j <= num; j++) { bool chk = false; chk = dfs(i, j, input); if(chk) // 영역이 존재하면 result++; } } return result; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); // freopen("../input.txt", "r", stdin); cin >> num; for (int i = 1; i <= num; i++) cin >> mat[i] + 1; int res1 = 0, res2 = 0; // 1. 안적록색약 실행 memset(visited, false, sizeof(visited)); res1 += calc('R'); res1 += calc('G'); res1 += calc('B'); // 2. 적록색약 실행 (1 연산시 R->G로 이미 바꿔줬음) memset(visited, false, sizeof(visited)); res2 += calc('G'); res2 += calc('B'); cout << res1 << " " << res2; return 0; } | cs |
'Study > PS(Algorithm)' 카테고리의 다른 글
[C++] 백준 BOJ 2309 일곱 난쟁이 (0) | 2018.08.07 |
---|---|
[C++] 백준 BOJ 7576 토마토 (0) | 2018.08.07 |
[C++] 백준 BOJ 11653 소인수분해 (0) | 2018.08.02 |
1753 (0) | 2018.08.01 |
[C++] 백준 BOJ 1260 DFS와 BFS (0) | 2018.07.31 |
Comments