250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 막내의막무가내 알고리즘
- 막내의막무가내 rxjava
- 막내의막무가내 안드로이드 코틀린
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내 목표 및 회고
- 막내의막무가내 코틀린
- 안드로이드 Sunflower 스터디
- 막내의막무가내 프로그래밍
- Fragment
- 프로그래머스 알고리즘
- 막내의막무가내 안드로이드 에러 해결
- 막내의 막무가내
- 막내의막무가내 코볼 COBOL
- flutter network call
- 막내의막무가내 플러터
- 안드로이드 sunflower
- 주택가 잠실새내
- 막내의 막무가내 알고리즘
- 2022년 6월 일상
- 안드로이드
- 막내의막무가내 안드로이드
- 막내의막무가내 플러터 flutter
- 주엽역 생활맥주
- 부스트코스에이스
- 막내의막무가내 일상
- 막내의막무가내 SQL
- 막무가내
- 프래그먼트
- 막내의막무가내
- 부스트코스
Archives
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[알고리즘] 백준 10026 적록색약 -dfs, bfs- 자바 본문
728x90
백준 10026 적록색약 문제입니다.
일반인이 보았을때의 구분되있는 색의 개수
초록색과 빨간색이 같은색으로 취급하는 적록색약인이 보았을때 구분되는 색의 개수를 각각 구해야합니다.
적록색약인은 R과 G를 같은색 취급하므로 map에서 G를 R로 치환한뒤 일반인과 똑같이 bfs()를 돌려주었습니다.
풀이는 다음과 같습니다.
[Java]
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
private static char[][] map;
private static char[][] map2;
private static boolean[][] isVisited;
private static boolean[][] isVisited2;
private static int[] dx = {-1, 0, 1, 0};
private static int[] dy = {0, -1, 0, 1};
private static int size;
private static int answer1 = 0; // 정상인
private static int answer2 = 0; // 적록색약인
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
size = sc.nextInt();
map = new char[size + 2][size + 2];
map2 = new char[size + 2][size + 2];
isVisited = new boolean[size + 2][size + 2];
isVisited2 = new boolean[size + 2][size + 2];
for (int i = 1; i <= size; i++) {
String line = sc.next();
for (int j = 1; j <= size; j++) {
map[i][j] = line.charAt(j - 1);
map2[i][j] = line.charAt(j - 1);
if (line.charAt(j - 1) == 'G') {
map2[i][j] = 'R';
}
}
}
for (int i = 1; i <= size; i++) {
for (int j = 1; j <= size; j++) {
if (!isVisited[i][j]) {
bfs(new Point(i, j));
answer1++;
}
}
}
for (int i = 1; i <= size; i++) {
for (int j = 1; j <= size; j++) {
if (!isVisited2[i][j]) {
bfs2(new Point(i, j));
answer2++;
}
}
}
System.out.println(answer1 + " " + answer2);
}
private static void bfs(Point point) {
Queue<Point> queue = new LinkedList<>();
queue.offer(point);
isVisited[point.x][point.y] = true;
while (!queue.isEmpty()) {
Point point2 = queue.poll();
for (int i = 0; i < 4; i++) {
int x2 = point2.x + dx[i];
int y2 = point2.y + dy[i];
if (map[point2.x][point2.y] == map[x2][y2] && !isVisited[x2][y2]) {
queue.offer(new Point(x2, y2));
isVisited[x2][y2] = true;
}
}
}
}
private static void bfs2(Point point) {
Queue<Point> queue = new LinkedList<>();
queue.offer(point);
isVisited2[point.x][point.y] = true;
while (!queue.isEmpty()) {
Point point2 = queue.poll();
for (int i = 0; i < 4; i++) {
int x2 = point2.x + dx[i];
int y2 = point2.y + dy[i];
if (map2[point2.x][point2.y] == map2[x2][y2] && !isVisited2[x2][y2]) {
queue.offer(new Point(x2, y2));
isVisited2[x2][y2] = true;
}
}
}
}
static class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
}
728x90
'알고리즘 > DFS, BFS, 시뮬, 백트래킹' 카테고리의 다른 글
[알고리즘] 백준 15654 N과 M(5) -백트랙킹- 자바 (0) | 2020.10.28 |
---|---|
[알고리즘] 백준 7562 나이트의 이동, 4693 섬의개수 -dfs, bfs- 자바 (0) | 2020.10.23 |
[알고리즘] 백준 14502 연구소 -dfs, bfs- 자바 코틀린 (0) | 2020.10.22 |
[알고리즘] 프로그래머스 N으로 표현 -dfs - 자바 코틀린 (0) | 2020.10.09 |
[알고리즘] 백준 14889 스타트와 링크 -백트랙킹- 자바 코틀린 (0) | 2020.10.02 |
Comments