Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8-dhlee777 #35

Merged
merged 1 commit into from
May 8, 2024
Merged

8-dhlee777 #35

merged 1 commit into from
May 8, 2024

Conversation

dhlee777
Copy link
Contributor

πŸ”— 문제 링크

적둝색약

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

2μ‹œκ°„

✨ μˆ˜λ„ μ½”λ“œ

μ²˜μŒμ— 문제λ₯Ό λ΄€μ„λ•Œ dfsλ‚˜ bfs λ₯Ό 톡해 κ·Έλ¦Όμ—μ„œ λ‹¨μˆœνžˆ κ΅¬μ—­μ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμΈμ€„ μ•Œμ•˜μœΌλ‚˜ μ •μƒμΈμΌλ•Œμ˜ 탐색과 μ λ‘μƒ‰μ•½μΌλ•Œμ˜ 탐색 이 λ‘κ°€μ§€κ²½μš° κ°€ μ‘΄μž¬ν–ˆλ‹€. μ λ‘μƒ‰μ•½μ˜ νŠΉμ§•μ€ r(λΉ¨κ°•)κ³Ό g(초둝)을 κ΅¬λΆ„ν•˜μ§€ λͺ»ν•˜λŠ” 것이닀. λ”°λΌμ„œ
그림의 μƒ‰μš”μ†Œλ₯Ό μž…λ ₯λ°›μ„λ•Œ μ λ‘μƒ‰μ•½μ˜ 탐색을 μœ„ν•΄ r(λΉ¨κ°•)을 g(초둝)으둜 λ°”κΏ”μ„œ color2배열에 μ €μž₯ν•΄μ€€λ‹€.

for (int i = 0; i < siz; i++) {          //color,clolor2배열에 그림을 μž…λ ₯λ°›μ•„ μ €μž₯ν•΄μ€€λ‹€.
		cin >> line;
		for (int j = 0; j < siz; j++) {
			color[i][j] = line[j];
			if (line[j] == 'R') color2[i][j] = 'G';     //적둝색약을 μœ„ν•΄ r을 g둜 λ‹€ λ°”κΏ”μ„œ μ €μž₯ν•΄μ€€λ‹€.
			else  color2[i][j] = line[j];
		}
	}

λ³€μˆ˜μ„ μ–Έ

char color[100][100];   //정상인이 λ³΄λŠ” 그림의 색 μš”μ†Œ
char color2[100][100];    //적둝색약이 λ³΄λŠ” 그림의 색 μš”μ†Œ
bool visited[100][100];   //정상인 그림의 λ°©λ¬Έμ—¬λΆ€
bool visited2[100][100];  //적둝색약 그림의 λ°©λ¬Έμ—¬λΆ€
string line;             // ν•œμ€„ μž…λ ₯을 λ°›κΈ°μœ„ν•œ 슀트링
int siz;                 //그림의 ν•œ λ³€μ˜ 길이
int coun = 0;            //정상인이 그림을 νƒμƒ‰ν–ˆμ„λ•Œ(λ΄€μ„λ•Œ) κ΅¬μ—­μ˜κ°œμˆ˜
int coun2 = 0;           //적둝색약이 νƒμƒ‰ν–ˆμ„λ•Œ(λ΄€μ„λ•Œ) κ΅¬μ—­μ˜κ°œμˆ˜
int x[4]={0,0,-1,1};     //μƒν•˜μ’Œμš° 탐색을 μœ„ν•œ xμ’Œν‘œ 이동값
int y[4] = { -1,1,0,0 };  // yμ’Œν‘œ 이동값

dfs

λ§€κ°œλ³€μˆ˜λ‘œλŠ” ν˜„μž¬μœ„μΉ˜μ˜ xμ’Œν‘œ,yμ’Œν‘œ , colorλ°°μ—΄, visited 배열을 μ„€μ •ν•΄μ€€λ‹€.
1. μ •μƒμΈμ˜ 탐색을 μœ„ν•΄μ„œλŠ” dfs(i,j,color,visited )λ₯Ό 톡해 호좜
2. μ λ‘μƒ‰μ•½μ˜ 탐색을 μœ„ν•΄μ„œλŠ” dfs(i,j,color2,visited2)λ₯Ό 톡해 호좜

νƒμƒ‰μ„±κ³΅μ‘°κ±΄μœΌλ‘œλŠ”

1.색 μš”μ†Œμ˜ x,yμ’Œν‘œκ°€ 0보닀 ν¬κ±°λ‚˜κ°™κ³  그림의 ν•œλ³€μ˜κΈΈμ΄ siz보닀 μž‘μ•„μ•Όν•œλ‹€.
2.ν˜„μž¬μœ„μΉ˜μ˜ μƒ‰μš”μ†Œμ™€ νƒμƒ‰ν•˜λ €λŠ” μƒ‰μš”μ†Œκ°€ κ°™μ•„μ•Όν•œλ‹€.
3.κ·Έ μƒ‰μš”μ†Œλ₯Ό λ°©λ¬Έν•˜μ§€ μ•Šμ•˜μ–΄μ•Όν•œλ‹€.

void dfs(int a,int b,char color[][100], bool visited[][100]) {   //x:ν˜„μž¬μœ„μΉ˜μ˜ x μ’Œν‘œ,y: ν˜„μž¬μœ„μΉ˜μ˜ yμ’Œν‘œ color:μ •μƒμΈμ˜ 탐색인지 μ λ‘μƒ‰μ•½μ˜ 탐색인지
	for (int i = 0; i < 4; i++) {
		int a2 = a + x[i];
		int b2 = b + y[i];
		if (a2 >= 0 && a2 < siz && b2 >= 0 && b2 < siz && !visited[a2][b2]&&color[a][b]==color[a2][b2]) {
			visited[a2][b2] = true;
			dfs(a2, b2,color,visited);
		}
	}
}

μ „μ²΄μ½”λ“œ

#include<iostream>
using namespace std;
char color[100][100];   //정상인이 λ³΄λŠ” κ·Έλ¦Ό
char color2[100][100];    //적둝색약이 λ³΄λŠ” κ·Έλ¦Ό
bool visited[100][100];   //정상인 그림의 λ°©λ¬Έμ—¬λΆ€
bool visited2[100][100];  //적둝색약 그림의 λ°©λ¬Έμ—¬λΆ€
string line;             // ν•œμ€„ μž…λ ₯을 λ°›κΈ°μœ„ν•œ 슀트링
int siz;                 //그림의 ν•œ λ³€μ˜ 길이
int coun = 0;            //정상인이 κ·Έλ¦Όμ„λ΄€μ„λ•Œ κ΅¬μ—­μ˜κ°œμˆ˜
int coun2 = 0;           //적둝색약이 λ΄€μ„λ•Œ κ΅¬μ—­μ˜κ°œμˆ˜
int x[4]={0,0,-1,1};     //μƒν•˜μ’Œμš° 탐색을 μœ„ν•œ xμ’Œν‘œ 이동값
int y[4] = { -1,1,0,0 };  // yμ’Œν‘œ 이동값

void dfs(int a,int b,char color[][100], bool visited[][100]) {   //x:ν˜„μž¬μœ„μΉ˜μ˜ x μ’Œν‘œ,y: ν˜„μž¬μœ„μΉ˜μ˜ yμ’Œν‘œ color:μ •μƒμΈμ˜ 탐색인지 μ λ‘μƒ‰μ•½μ˜ 탐색인지
	for (int i = 0; i < 4; i++) {
		int a2 = a + x[i];
		int b2 = b + y[i];
		if (a2 >= 0 && a2 < siz && b2 >= 0 && b2 < siz && !visited[a2][b2]&&color[a][b]==color[a2][b2]) {
			visited[a2][b2] = true;
			dfs(a2, b2,color,visited);
		}
	}
}
int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> siz;
	for (int i = 0; i < siz; i++) {          //color,clolor2배열에 그림을 μž…λ ₯λ°›μ•„ μ €μž₯ν•΄μ€€λ‹€.
		cin >> line;
		for (int j = 0; j < siz; j++) {
			color[i][j] = line[j];
			if (line[j] == 'R') color2[i][j] = 'G';     //적둝색약을 μœ„ν•΄ r을 g둜 λ‹€ λ°”κΏ”μ„œ μ €μž₯ν•΄μ€€λ‹€.
			else  color2[i][j] = line[j];
		}
	}

	for (int i = 0; i < siz; i++) {         //μ •μƒμΈμ˜ 탐색
		for (int j = 0; j < siz; j++) {
			if (!visited[i][j]) {
				dfs(i,j,color,visited);
				coun++;
			}
		}
	}
	for (int i = 0; i < siz; i++) {      //μ λ‘μƒ‰μ•½μ˜ 탐색
		for (int j = 0; j < siz; j++) {
			if (!visited2[i][j]) {
				dfs(i, j, color2,visited2);
				coun2++;
			}
		}
	}
	cout << coun <<" "<< coun2;
	return 0;
}

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

λ°°μ—΄ 선언을 λ„ˆλ¬΄ λ§Žμ΄ν•΄μ€˜μ„œ λ©”λͺ¨λ¦¬ μ΄ˆκ³Όκ°€ 뜰까 κ±±μ •ν–ˆλŠ”λ° λœ¨μ§€μ•Šμ•˜λ‹€. μ•„λ§ˆ μ΅œλŒ€κ°€ 100*100 밖에 μ•ˆλΌμ„œ 그런거 κ°™λ‹€.
λ©”λͺ¨λ¦¬λ₯Ό μ κ²Œμ‚¬μš©ν•˜λŠ” λ‹€λ₯Έλ°©λ²•μ΄ μ—†λŠ”μ§€ λ‹€μŒμ— ν•œλ²ˆ 생각해봐야겠닀.

Copy link
Collaborator

@yuyu0830 yuyu0830 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

문제λ₯Ό 보자 마자 2번 νƒμƒ‰ν•˜λ©΄ λ˜κ² λ„€! λΌλŠ” 방법이 μš°μ„  λ– μ˜¬λžμŠ΅λ‹ˆλ‹€. λ¬Έμ œκ°€ μ˜λ„ν•œ λŒ€λ‘œ 잘 ν•΄κ²°ν•˜μ‹  것 κ°™λ„€μš”! DFS ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜λ‘œ 두 탐색을 λ‹€λ₯΄κ²Œ μ²˜λ¦¬ν•œ 뢀뢄이 인상 κΉŠμ—ˆμŠ΅λ‹ˆλ‹€!
그런데 ν˜Ήμ‹œ ν•œ 번 νƒμƒ‰ν•˜λ©΄μ„œ ν•  수 μžˆλŠ” 방법은 μ—†μ„κΉŒμš”? 아이디어가 μžˆλŠ”κ±΄ μ•„λ‹Œλ° λ­”κ°€ ν•œ 번만 νƒμƒ‰ν•˜λ©΄μ„œ 두 κ²½μš°μ— λŒ€ν•΄ λ‹€ 처리 κ°€λŠ₯ν•œ 방법이 μžˆμ„κΉŒ..? μ‹Άμ–΄μ„œ ν•œλ²ˆ λ„Œμ§€μ‹œ λ˜μ Έλ΄…λ‹ˆλ‹€..γ…Ž

Copy link
Collaborator

@InSange InSange left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ € 같은 κ²½μš°λŠ” 2쀑 for문으둜 i, j번째 μ›μ†Œλ“€μ„ λ°©λ¬Έν•΄κ°€λ©° BFSλ°©μ‹μœΌλ‘œ νƒμƒ‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

void Solve()
{
	cin >> N;
	visited1.assign(N, vector<bool>(N, false));
	visited2.assign(N, vector<bool>(N, false));
	answer1 = 0, answer2 = 0;

	string line;
	for (int i = 0; i < N; i++)
	{
		cin >> line;
		section.push_back(line);
	}

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (visited1[i][j]) continue;
			answer1++;
			q1.push({ i, j });
			visited1[i][j] = true;

			char curColor;
			int y, x;
			while (!q1.empty())
			{
				y = q1.front().first;
				x = q1.front().second;
				q1.pop();
				curColor = section[y][x];

				for (int k = 0; k < 4; k++)
				{
					int ny = y + dy[k];
					int nx = x + dx[k];

					if (OutOfBounds(ny, nx)) continue;
					if (visited1[ny][nx]) continue;
					if (curColor != section[ny][nx]) continue;

					q1.push({ ny, nx });
					visited1[ny][nx] = true;
				}
			}

			if (visited2[i][j]) continue;
			answer2++;
			q2.push({ i, j });
			visited2[i][j] = true;

			while (!q2.empty())
			{
				y = q2.front().first;
				x = q2.front().second;

				q2.pop();
				curColor = section[y][x];

				for (int k = 0; k < 4; k++)
				{
					int ny = y + dy[k];
					int nx = x + dx[k];

					if (OutOfBounds(ny, nx)) continue;
					if (visited2[ny][nx]) continue;
					if (curColor == 'B' && curColor != section[ny][nx]) continue;
					if (curColor != 'B' && section[ny][nx] == 'B') continue;
					q2.push({ ny, nx });
					visited2[ny][nx] = true;
				}
			}
		}
	}

	cout << answer1 << " " << answer2;
}

###첫 번째 방식
ν•˜λ‚˜μ˜ νμ—μ„œ 두 개λ₯Ό ν•œλ²ˆμ— μ²˜λ¦¬ν•  수 μ—†μ„κΉŒ?
색약인과 정상인은 λ¨Όμ € ν•˜λ‚˜μ˜ 색은 무쑰건 νŒλ³„ν•˜λŠ” 방식은 λ˜‘κ°™κΈ°μ— λ°©λ¬Έν•˜λŠ” 지점은 정상인과 색약인 κ³΅ν†΅λ˜λŠ” 뢀뢄이 μžˆμ„ 것이닀.
단 μƒ‰μ•½μΈμ˜ 경우 λΉ¨κ°•κ³Ό μ΄ˆλ‘μ€ ν•˜λ‚˜μ˜ μƒ‰μœΌλ‘œ 보기 λ•Œλ¬Έμ— 정상인보닀 λ¨Όμ € visited 배열을 λ¨Όμ € λΉ λ₯΄κ²Œ μ±„μšΈ 것이닀.
(정상인은 λΉ¨κ°•, μ΄ˆλ‘μƒ‰μ„ κ΅¬λΆ„ν•˜λŠ” 반면 색약인은 λΉ¨κ°•, μ΄ˆλ‘μƒ‰μ„ ν•˜λ‚˜μ˜ μƒ‰μœΌλ‘œ κ΅¬λ³„ν•˜κΈ° λ•Œλ¬Έμ— 색이 μ΄μ–΄μ Έμžˆλ‹€λ©΄ νƒμƒ‰ν•˜λŠ” λ²”μœ„λŠ” 색약인이 더 λ§Žμ•„μ§ˆ 것이기 λ•Œλ¬Έμ—.)
bool둜 뢄기점을 잘 μž‘μ•„μ€€λ‹€λ©΄ κ°€λŠ₯ν•  것 κ°™μ•˜μœΌλ‚˜ 가독성이 λ–¨μ–΄μ§„λ‹€λŠ” μ μ—μ„œ μ„ ν˜Έλ˜μ§„ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

###두 번째 방식
λ‘λ²ˆμ§Έ 방식은 λ°”λ‘œ μœ„μ˜ μ½”λ“œλ‘œ 지점을 돌 λ•Œ λ”°λ‘œ λ”°λ‘œ λ°©λ¬Έν•˜λŠ” κ²ƒμ΄μ˜€μŠ΅λ‹ˆλ‹€.
μ΄λ ‡κ²Œ 되면 배열은 정상인, 색약인 κ΅¬λ³„ν•΄μ€˜μ•Όν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬κ°€ 두 λ°° 더 μ°¨μ§€ν•˜κΈ΄ ν•˜μ§€λ§Œ μ΅œλŒ€ 크기 100*100을 κ°μ•ˆν•œλ‹€λ©΄ λΆ€μ‘±ν•œ 뢀뢄은 없기에 금방 ν’€ 수 μžˆμ—ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€.

Copy link
Collaborator

@seongwon030 seongwon030 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dfsλŠ” λ˜‘κ°™μ΄ ν•˜λ˜ μ λ‘μƒ‰μ•½μ˜ 경우 두 가지 색을 λ™μΌν•˜κ²Œ ν•΄μ„œ νƒμƒ‰ν•œκ±°κ΅°μš”,, 정상인과 μ λ‘μƒ‰μ•½μ˜ 배열을 λ”°λ‘œ 두어 μ§„ν–‰ν•˜λ‹ˆκΉŒ μ½”λ“œλ„ 보기 μ‰¬μ› λ˜ 것 κ°™μ•„μš”. 잘 λ΄€μŠ΅λ‹ˆλ‹€ γ…Žγ…Ž

@dhlee777 dhlee777 merged commit ab8d008 into main May 8, 2024
1 check passed
@dhlee777 dhlee777 deleted the 8-dhlee777 branch May 8, 2024 16:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants