백준 10026번: 적록색약

2021. 7. 13. 00:17·IT/BOJ 문제정리

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

 

10026번: 적록색약

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

www.acmicpc.net

 

 

0. 알고리즘 분류

 그래피 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색

 

 

1. 문제

 

 

2. 풀이

 문제 자체는 일반 DFS/BFS 문제이다. 적록색약은 그냥 주어진 입력에서 G를 R로 바꿔주기만 하면 된다. 다만 시간 제한이 1초라서, 반복문을 사용하는데에 생각을 해봐야한다. 

 

 inArea() 함수는 입력으로 들어온 좌표 x, y 가 배열의 범위에 들어있는지 체크하는 함수이다. bfs() 함수는 일반 bfs함수를 살짝 변형한 것이다. 첫 번째 탐색은 정상인, 두 번째 탐색은 적록색약을 가진 사람의 경우이다. 첫 번째 bfs 탐색을 돌릴 때, 현재 위치의 색이 G이면, R로 바꿔주도록 했다. 어차피 이미 해당 좌표는 방문을 완료했기에 색깔을 바꿔도 첫 번째 탐색에는 별 영향이 없기에, 두 번째 탐색의 편의를 위해 해주었다.

 

 쉬운 문제였지만, 과다한 배열 사용으로 메모리 초과와 반복문 중첩으로 시간제한에 꽤나 골머리를 앓았다. 어찌저찌 풀었지만, 뭐가 문제였는지 정확하게 모르겠다. 아마 사소한 메모리 사용과 조건문/반복문이 겹쳐서 그런 것 같다.

 

 

3. 코드

#include <cstring>
#include <iostream>
#include <queue>

using namespace std;

int n;
char a[100][100];
bool visited[100][100];
int dir_x[4] = {1,-1,0,0};
int dir_y[4] = {0,0,1,-1};

bool inArea(int x, int y) {
	if (0 <= x && x < n && 0 <= y && y < n)
		return true;
	
	return false;
}

void bfs(int x, int y) {
	char color = a[x][y];
	
	queue<pair<int,int>> q;
	q.push(make_pair(x, y));
	visited[x][y] = true;
	while (!q.empty()) {
		int cur_x = q.front().first;
		int cur_y = q.front().second;
		q.pop();
		
		if (a[cur_x][cur_y] == 'G') a[cur_x][cur_y] = 'R';
		
		for (int i = 0; i < 4; i++) {
			int next_x = cur_x + dir_x[i];
			int next_y = cur_y + dir_y[i];
			
			if (inArea(cur_x + dir_x[i], cur_y + dir_y[i])) {
				if (!visited[next_x][next_y]) {
					if (color == a[next_x][next_y]) {
						q.push(make_pair(next_x, next_y));
						visited[next_x][next_y] = true;
					}
				}
			}
		}
	}
}

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> a[i][j];
		}
	}
	
	int ans1 = 0;
	int ans2 = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (!visited[i][j]) {
				bfs(i, j);
				ans1++;
			}
		}
	}
	
	memset(visited, false, sizeof(visited));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (!visited[i][j]) {
				bfs(i, j);
				ans2++;
			}
		}
	}
	
	cout << ans1 << ' ' << ans2;
	
	return 0;
}

'IT > BOJ 문제정리' 카테고리의 다른 글

백준 1629번: 곱셈  (0) 2021.07.15
백준 4179번: 불!  (0) 2021.07.14
백준 1932번: 정수 삼각형  (0) 2021.07.10
백준 1149번: RGB 거리  (0) 2021.07.09
백준 1034번: 램프  (0) 2021.07.08
'IT/BOJ 문제정리' 카테고리의 다른 글
  • 백준 1629번: 곱셈
  • 백준 4179번: 불!
  • 백준 1932번: 정수 삼각형
  • 백준 1149번: RGB 거리
KimCookieYa
KimCookieYa
무엇이 나를 살아있게 만드는가
  • KimCookieYa
    쿠키의 주저리
    KimCookieYa
  • 전체
    오늘
    어제
    • 분류 전체보기 (578) N
      • 혼잣말 (88)
      • TIL (3)
      • 커리어 (24)
        • Sendy (21)
        • 외부활동 기록 (2)
      • 프로젝트 (186)
        • 티스토리 API (5)
        • 코드프레소 체험단 (89)
        • Web3 (3)
        • Pint OS (16)
        • 나만무 (14)
        • 대회 (6)
        • 정글 FE 스터디 (16)
        • MailBadara (12)
        • github.io (1)
        • 인공지능 동아리, AID (5)
        • 졸업과제 (18)
        • OSSCA 2024 (1)
      • 크래프톤 정글 2기 (80)
      • IT (171) N
        • 코딩 (4)
        • CS (18)
        • 에러 (5)
        • 블록체인 (23)
        • Front-End (42) N
        • 알고리즘&자료구조 정리 (3)
        • 코딩테스트 (3)
        • BOJ 문제정리 (41)
        • WILT (12)
        • ML-Agents (4)
        • 강화학습 (1)
        • Android (0)
        • LLM (2)
      • 전공 (1)
        • 머신러닝 (1)
      • 자기계발 (20)
        • 빡공단X베어유 (2)
        • 독서 (15)
  • 블로그 메뉴

    • 홈
    • 방명록
    • Github
    • Velog
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로그래머스
    졸업과제
    코드프레소
    OS
    pintos
    NEAR Protocol
    리액트
    크래프톤정글
    numpy
    딥러닝
    핀토스
    블록체인
    글리치해커톤
    Flutter
    니어프로토콜
    MailBadara
    파이썬
    머신러닝
    나만무
    docker
    RNN
    자바스크립트
    부산대
    react
    Pint OS
    해커톤
    JavaScript
    사이드프로젝트
    센디
    알고리즘
  • hELLO· Designed By정상우.v4.10.3
KimCookieYa
백준 10026번: 적록색약
상단으로

티스토리툴바