발효홍삼
코딩하는 홍삼
발효홍삼
전체 방문자
오늘
어제
  • 분류 전체보기 (142)
    • PS (63)
      • 프로그래머스 (9)
      • 코드업 (10)
      • 백준 (43)
      • 알고스팟 (1)
    • Programming Language (11)
      • html_css (2)
      • java (0)
      • c,c++ (2)
      • vanillajs (2)
      • react (0)
      • vue.js (0)
      • angular.js (0)
      • electron (3)
      • 엄랭(Umjunsik-lang) (1)
      • F# (1)
      • Node.js (0)
      • Go (0)
    • knowledge (41)
      • algorithm (3)
      • data structure (1)
      • os (1)
      • ML (1)
      • math (31)
      • paper review (0)
      • IT-license (4)
    • Programming Guide (27)
      • React (1)
      • Electron (2)
      • CSS , SASS ( SCSS ) , Tailw.. (3)
      • Node.js (1)
      • Go (1)
      • Ruby on Rails (2)
      • R (1)
      • PHP (1)
      • Docker (1)
      • JSP (1)
      • C# (1)
      • Django (1)
      • Flask (1)
      • Dart (1)
      • Next.js (1)
      • Vue.js (1)
      • Unity (1)
      • React Native (0)
      • Flutter (3)
      • GraphQL (1)
      • MongoDB (1)
      • .NET (1)
      • RUST (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 기초100제
  • C
  • JavaScript
  • 수학
  • nodejs
  • 기초백제
  • 프로그래머스
  • 미적분학
  • codeup
  • 알고리즘
  • 코드업
  • js
  • 파이썬
  • electron
  • cpp
  • Python
  • java
  • 출력
  • 구현
  • HTML
  • 적분
  • 자바
  • 이산수학
  • c++
  • CSS
  • 미분
  • 백준
  • LV1
  • 정보처리기능사 필기
  • 정보처리기능사

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
발효홍삼

코딩하는 홍삼

[ 백준 ] 10026번 : 적록색약 - ( C++/C )
PS/백준

[ 백준 ] 10026번 : 적록색약 - ( C++/C )

2022. 3. 5. 15:48
728x90
  • 문제

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

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net


  • 풀이법 ( 알고리즘 )

dfs로 풀었다. 우선 적록색약이 아닌 사람이 봤을 때의 구역의 수를 구한 후, 초록색 부분을 빨간색으로 바꾸어 적록색약인 사람이 봤을 때의 구역의 수를 구하였다.

 

dfs를 돌 땐 다음 이동하는 좌표와 현재 좌표의 색이 같고 방문한 적이 없을 때만 재귀 함수를 실행해주었다.


  • 풀이 - C++ ( C ) 
#include <iostream>
#include <cstring> //memset

using namespace std;

int n, cnt; // n : 그리드의 크기 n * n , cnt : 구역의 개수
char grid[101][101]; // grid[x][y] : 탐색을 할 이차원 배열
string input; // input : 입력되는 그림은 공백이 없기 때문에 문자열로 우선 입력받은 후 처리
bool visited[101][101]; // visited[101][101] : 이미 탐색한 좌표 저장

int dx[] = { 1,-1,0,0 }; // 상하좌우 탐색
int dy[] = { 0,0,1,-1 };

void dfs(int nowx, int nowy)
{
	if (visited[nowx][nowy]) return;  // 현재 좌표를 방문했다면 return

	visited[nowx][nowy] = true; // 좌표 방문 처리

	for (int i = 0; i < 4; i++) // 상하좌우
	{
		int X = dx[i] + nowx; 
		int Y = dy[i] + nowy;
		
		if ((grid[nowx][nowy] == grid[X][Y]) && !visited[X][Y]) // 다음 탐색하는 좌표가 현재 좌표와 색이 같고 방문하지 않았다면 
		{
			dfs(X, Y);
		}
	}
}

int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	//input
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> input; //공백이 없기 때문에 문자열로 입력받은 후
		for (int j = 0; j < n; j++) // 한 글자씩 이차원 배열에 넣어준다
			grid[i][j] = input[j];
	}
	
	//solve
 //적록색약이 아닌 사람이 보았을 때의 구역 수
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (!visited[i][j]) // 방문하지 않았다면
			{
				dfs(i, j);
				cnt++; //dfs가 끝났다면 한 구역을 다 돈 것이 되기에 구역의 수 1 증가
			}
		}
	}
		
	cout << cnt << " "; // 출력
	cnt = 0; // 구역의 수 초기화
	memset(visited, false, sizeof(visited)); // 방문 배열 초기화

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (grid[i][j] == 'G') grid[i][j] = 'R'; // 초록색 글자를 빨간색으로 바꿈
		}
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (!visited[i][j]) // 방문하지 않았다면
			{
				dfs(i, j); 
				cnt++;//dfs가 끝났다면 한 구역을 다 돈 것이 되기에 구역의 수 1 증가
			}
		}
	}

	cout << cnt; // 출력

	return 0;
}

 

 

 

 

 

 

 

 

 

 

728x90
저작자표시 비영리 (새창열림)

'PS > 백준' 카테고리의 다른 글

[ 백준 ] 2660번 : 회장뽑기 ( C++/C )  (0) 2022.03.10
[ 백준 ] 11723번 : 집합 - ( C++ / C )  (0) 2022.03.05
[ 백준 ] 1010번 : 다리놓기 - (C++/C , JAVA/자바 , PYTHON/파이썬 , Node.JS/자바스크립트 )  (0) 2022.03.03
[ 백준 ] 5585번 : 거스름돈 - ( C++/C , JAVA/자바, PYTHON/파이썬, NODE.JS/자바스크립트 )  (0) 2022.03.01
[ 백준 ] 1026번 : 보물 - (C++/C, JAVA/자바, PYTHON/파이썬)  (0) 2022.02.28
    'PS/백준' 카테고리의 다른 글
    • [ 백준 ] 2660번 : 회장뽑기 ( C++/C )
    • [ 백준 ] 11723번 : 집합 - ( C++ / C )
    • [ 백준 ] 1010번 : 다리놓기 - (C++/C , JAVA/자바 , PYTHON/파이썬 , Node.JS/자바스크립트 )
    • [ 백준 ] 5585번 : 거스름돈 - ( C++/C , JAVA/자바, PYTHON/파이썬, NODE.JS/자바스크립트 )
    발효홍삼
    발효홍삼
    코딩하는 홍삼

    티스토리툴바