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

3-InSange #9

Merged
merged 1 commit into from
Mar 24, 2024
Merged

3-InSange #9

merged 1 commit into from
Mar 24, 2024

Conversation

InSange
Copy link
Collaborator

@InSange InSange commented Mar 18, 2024

πŸ”— 문제 링크

ν”Œλ‘œμ΄λ“œ

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

30λΆ„

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

문제 μΆ”μ²œ κ²Œμ‹œνŒμ—μ„œ κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€! (κΊΌμ–΅)

ν”Œλ‘œμ΄λ“œ μ›Œμ…œμ€ ν•΄λ‹Ή λ…Έλ“œμ— μ ‘κ·Όν•  수 μžˆλŠ” λͺ¨λ“  경우의 수λ₯Ό 탐색해 μ΅œμ†Œ λΉ„μš©μ„ μ°Ύμ•„λ‚΄λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
2차원 배열을 μ„ μ–Έν•˜μ—¬ λͺ¨λ“  λ…Έλ“œμ—μ„œ 탐색할 수 μžˆλŠ” 기회λ₯Ό μ œκ³΅ν•΄ μ€λ‹ˆλ‹€.

μ΄ˆκΈ°ν™”

const int INF = 99999999;
vector<vector<int>> cities;

cities.assign(n, vector<int>(n, INF));

for (int i = 1; i < n; i++)
{
	cities[i][i] = 0;
}

μ €μ˜ 경우 각 λ…Έλ“œλ“€λΌλ¦¬λŠ” λ°©λ¬Έν•  수 μžˆλŠ” λΉ„μš©μ„ μƒμˆ˜κ°’ INF둜 μ΄ˆκΈ°ν™” μ‹œμΌœμ€λ‹ˆλ‹€.
vector둜 μ„ μ–Έν•΄μ€€ μ΄μœ λŠ” n만큼의 크기만 ν• λ‹Ήν•΄μ£ΌκΈ° μœ„ν•΄μ„œμž…λ‹ˆλ‹€.
INFλŠ” ν•΄λ‹Ή 경둜둜 길이 μ΄μ–΄μ Έμžˆμ§€ μ•Šλ‹€λŠ” 것을 ꡬ뢄해주기 μœ„ν•΄ 큰 λΉ„μš©μ„ μ„ μ–Έ ν•΄μ€ŒμœΌλ‘œμ¨ μ΅œλ‹¨ 경둜λ₯Ό 찾을 λ•Œμ˜ 큰 λΉ„μš©κ³Ό 비ꡐλ₯Ό ν•¨μœΌλ‘œμ¨ μ—…λ°μ΄νŠΈ λ˜λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€.
cities[i][i]의 μ˜λ―ΈλŠ” i번째 λ…Έλ“œλŠ” 자기 μžμ‹  i번째 λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜λŠ”λ° λΉ„μš©μ€ λ“€μ§€μ•ŠκΈ° λ•Œλ¬Έμ— 0κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” ν•΄μ€λ‹ˆλ‹€.

μž…λ ₯

for (int i = 0; i < m; i++)
{
	cin >> a >> b >> c;

	if (cities[a][b] < c) continue;
	cities[a][b] = c;
}

각 λ…Έλ“œa와 bκ°€ μ΄λ™ν•˜λŠ”λ° λ“œλŠ” λΉ„μš© cλ₯Ό cities 배열에 μ΄ˆκΈ°ν™” μ‹œμΌœμ€λ‹ˆλ‹€.

μ›Œμ…œ 처리

for (int k = 1; k < n; k++)
{
	for (int i = 1; i < n; i++)
	{
		for (int j = 1; j < n; j++)
		{
			cities[i][j] = min(cities[i][k] + cities[k][j], cities[i][j]);
		}
	}
}

자 μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 μ™œ i, jκ°€ 밖이 μ•„λ‹ˆκ³  μ•ˆμͺ½μ— 있으며 kλŠ” 밖에 μ‘΄μž¬ν•˜λŠ”κ°€?
image
μœ„ 그림처럼 i, jλŠ” 각각 ν–‰κ³Ό 열을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. k의 값은 κ°€μž₯ λ‚˜μ€‘μ— μ²˜λ¦¬λ˜λŠ” λ°”κΉ₯에 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— i와 jκ°€ λ°°μ—΄μ•ˆμ— μžˆλŠ” λͺ¨λ“  μš”μ†Œλ“€μ„ λ‹€ λŒλ•Œ k의 값이 λ²”μœ„λŠ” ν•˜λ‚˜μ˜ μ—΄κ³Ό 행을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. 즉 cities[i][j]λŠ” 자기 μžμ‹ κ³Ό cities[i][k]와 cities[k][j]에 ν•΄λ‹Ήν•˜λŠ” 같은 ν–‰κ³Ό μ—΄μ˜ 값을 λ”ν•œ κ°’κ³Ό λΉ„κ΅ν•˜λ©΄ k번째 λ…Έλ“œλ₯Ό 톡해 갈 수 μžˆλŠ” λΉ„μš©κ³Ό 비ꡐ할 수 있게 λ©λ‹ˆλ‹€. k에 ν•΄λ‹Ήν•˜λŠ” 값듀을 λ¨Όμ € λͺ¨λ“  λ…Έλ“œμ—μ„œ 계산해주고 λ‹€μŒ k+1λ²ˆμ§Έμ— ν•΄λ‹Ήν•˜λŠ” κ°’λ“€κ³Ό 비ꡐλ₯Ό ν•˜λ©΄μ„œ 순차적으둜 값듀을 μ—…λ°μ΄νŠΈ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
반면 kκ°€ λ°”κΉ₯에 κ°€μž₯ μ•ˆμͺ½μ΄κ±°λ‚˜ λ‘λ²ˆμ§Έμ— μ‘΄μž¬ν• μ‹œμ— cities[i][j]λŠ” kκ°€ λ°°μ—΄ μ•ˆμ˜ λͺ¨λ“  λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜κ²Œλ˜λ©΄μ„œ INF값이 λ“€μ–΄μžˆλŠ” λ…Έλ“œλ₯Ό 계속 μ ‘κ·Όν•˜κ²Œλ©λ‹ˆλ‹€. λ¬΄ν•œλŒ€μΈ INFλ₯Ό 계속해저 μ°Έμ‘°ν•˜λ‹€λ³΄λ‹ˆ μ—°κ²°λœ 길을 ν†΅ν•΄μ„œ λͺ»κ°€λŠ”(μ—…λ°μ΄νŠΈκ°€ μ•ˆλœ) 경우 ν˜Ήμ€ λ‹€λ₯Έ κ°’μœΌλ‘œ μ—…λ°μ΄νŠΈ λ˜λŠ” κ²½μš°κ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

for (int i = 1; i < n; i++)
{
	for (int j = 1; j < n; j++)
	{
		for (int k = 1; k < n; k++)
		{
			cities[i][j] = min(cities[i][k] + cities[k][j], cities[i][j]);
		}
	}
}

μœ„μ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό 보면
image
와 같이 cities[2][3]은 2β†’4β†’5β†’1β†’3으둜 각 이동 λΉ„μš©μ€ 2 + 3 + 7 + 3으둜 15κ°€ λ‚˜μ™€μ•Ό λ˜λŠ”λ° INF = 0으둜 λ‚˜μ˜€κ²Œ λœλ‹€.

for (int k = 1; k < n; k++)
{
	for (int i = 1; i < n; i++)
	{
		for (int j = 1; j < n; j++)
		{
			cities[i][j] = min(cities[i][k] + cities[k][j], cities[i][j]);
		}
	}
}

제일 λ°”κΉ₯에 λ‘ μœΌλ‘œμ¨ ν•˜λ‚˜μ˜ μ—΄κ³Ό 행을 λΉ„κ΅ν•˜λ©΄μ„œ 전체λ₯Ό μ—…λ°μ΄νŠΈ μ‹œν‚€κ²Œ 되면
image
μš°λ¦¬κ°€ κ³„μ‚°ν–ˆλ˜ μœ„μ˜ 닡이 cities[2][3]에 λ“€μ–΄κ°„ 것을 확인할 수 μžˆλ‹€!

전체 μ½”λ“œ

const int INF = 99999999;
int n, m, a, b, c;
vector<vector<int>> cities;

void Solve()
{
	cin >> n >> m;
	n++;
	cities.assign(n, vector<int>(n, INF));
	// cities[i][i] -> (0, 0), (1, 1) ... (n, n) 뢀뢄듀은 λ‹€ 0으둜 μ΄ˆκΈ°ν™”
	// 자기 μžμ‹ μ—μ„œ 자기 μžμ‹ μœΌλ‘œ λ°©λ¬Έ λΉ„μš©μ€ 0
	for (int i = 1; i < n; i++)
	{
		cities[i][i] = 0;
	}

	for (int i = 0; i < m; i++)
	{
		cin >> a >> b >> c;

		if (cities[a][b] < c) continue;
		cities[a][b] = c;
	}
	// 3쀑 for문은 밖에 μžˆλŠ” 측은 κ³ μ •λœ κ°’μœΌλ‘œ λ³€ν™”λ₯Ό μ°ΎλŠ”λ‹€.
	// 즉 i, jκ°€ k에 μžˆλŠ” 값듀을 λͺ¨λ‘ λ°©λ¬Έν•  λ•Œ κΉŒμ§€ fixλœλ‹€.
	// λ§Œμ•½ kκ°€ λ‘λ²ˆμ§Έ ν˜Ήμ€ 첫번째(μ•ˆμͺ½)에 μžˆλŠ” forλ¬Έμ—μ„œ 돌게되면
	// i, j κ°€ μœ„μΉ˜ν•œ 값은 kκ°€ λ°°μ—΄ μ•ˆμ˜ λͺ¨λ“  경우의 수λ₯Ό λŒμ•„λ³΄κΈ° λ•Œλ¬Έμ—
	// λ§Œμ•½ λŒμ•„λ³΄λŠ” 곳에 ν•˜λ‚˜λΌλ„ INF값이 있게되면 μž‘μ€ κ°’μœΌλ‘œ μ΅œμ‹ ν™”κ°€ μ•ˆλœλ‹€.
	for (int k = 1; k < n; k++)
	{
		for (int i = 1; i < n; i++)
		{
			for (int j = 1; j < n; j++)
			{
				cities[i][j] = min(cities[i][k] + cities[k][j], cities[i][j]);
			}
		}
	}

	for (int i = 1; i < n; i++)
	{
		for (int j = 1; j < n; j++)
		{
			cout << (cities[i][j] == INF ? 0 : cities[i][j]) << " ";
		}
		cout << "\n";
	}
}

image
문제λ₯Ό 꼼꼼히 읽어야 λ©λ‹ˆλ‹€..!
갈 수 μ—†μ„λ•ŒλŠ” 0으둜 처리λ₯Ό ν•΄μ€˜μ•Όν•˜λŠ”λ° κ·ΈλŒ€λ‘œ INF둜 좜λ ₯ν•΄λ²„λ €μ„œ ν‹€λ ΈμŠ΅λ‹ˆλ‹€.. μ•„κΉŒμš΄ λ‚˜μ˜ μ‹€νŒ¨ 1μŠ€νƒ μ—¬λŸ¬λΆ„λ“€μ€ 꼼꼼히 문제λ₯Ό μ½μœΌμ‹œκΈΈ..

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

문제λ₯Ό 꼼꼼히 읽자 ^^;

@InSange InSange self-assigned this Mar 18, 2024
@InSange InSange changed the title 2024-03-19 ν”Œλ‘œμ΄λ“œ 3-InSange Mar 18, 2024
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.

μ–Όλ§ˆ 전에 ν‘Ό 문제라 κ°νšŒκ°€ 또 μƒˆλ‘­λ„€μš”.. λ§λ”ν•œ μ½”λ“œμ™€ κΉ”λ”ν•œ μ„€λͺ… 덕에 λ‹€μ‹œκΈˆ ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ κ°œλ… 작고 κ°‘λ‹ˆλ‹€ :)

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.

kλ₯Ό κ°€μž₯ λ°”κΉ₯을 두어 inf 에 μ ‘κ·Όν•˜μ§€ μ•Šλ„λ‘ ν•œκ±°κ΅°μš” λ„ˆλ¬΄ μž¬λ°Œλ„€μš” .. ν”Œλ‘œμ΄λ“œ μ›Œμ…œ 잘 λ°°μ›Œ κ°€κ² μŠ΅λ‹ˆλ‹Ή

Copy link
Contributor

@dhlee777 dhlee777 left a comment

Choose a reason for hiding this comment

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

κ²½μœ μ μ„ ν†΅ν•œ 3쀑 forλ¬Έλ°©μ‹μœΌλ‘œ 전체 경우λ₯Ό λ‹€ νƒμƒ‰ν•˜λŠ” λ°©λ²•μ΄κ΅°μš”.. ν”Œλ‘œμ΄λ“œ 저도 ν’€μ–΄λ΄μ•Όκ² μŠ΅λ‹ˆλ‹€ 쒋은 μ½”λ“œ 잘 λ³΄κ³ κ°‘λ‹ˆλ‹€

@tgyuuAn
Copy link
Member

tgyuuAn commented Mar 23, 2024

κ²½μœ μ μ„ ν†΅ν•œ 3쀑 forλ¬Έλ°©μ‹μœΌλ‘œ 전체 경우λ₯Ό λ‹€ νƒμƒ‰ν•˜λŠ” λ°©λ²•μ΄κ΅°μš”.. ν”Œλ‘œμ΄λ“œ 저도 ν’€μ–΄λ΄μ•Όκ² μŠ΅λ‹ˆλ‹€ 쒋은 μ½”λ“œ 잘 λ³΄κ³ κ°‘λ‹ˆλ‹€

kλ₯Ό κ°€μž₯ λ°”κΉ₯을 두어 inf 에 μ ‘κ·Όν•˜μ§€ μ•Šλ„λ‘ ν•œκ±°κ΅°μš” λ„ˆλ¬΄ μž¬λ°Œλ„€μš” .. ν”Œλ‘œμ΄λ“œ μ›Œμ…œ 잘 λ°°μ›Œ κ°€κ² μŠ΅λ‹ˆλ‹Ή

μ–Όλ§ˆ 전에 ν‘Ό 문제라 κ°νšŒκ°€ 또 μƒˆλ‘­λ„€μš”.. λ§λ”ν•œ μ½”λ“œμ™€ κΉ”λ”ν•œ μ„€λͺ… 덕에 λ‹€μ‹œκΈˆ ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ κ°œλ… 작고 κ°‘λ‹ˆλ‹€ :)

직접 풀어보고 μ½”λ“œλ₯Ό μ˜¬λ¦¬λŠ” 것도 쒋을지도 ...?!

λͺ¨λ₯΄λŠ” κ°œλ…μ΄λ©΄ PRλ³΄λ©΄μ„œ λ°°μš΄λ‹€λŠ” κ°œλ…μœΌλ‘œ ?!

@InSange InSange merged commit ef8b053 into main Mar 24, 2024
1 check passed
@InSange InSange deleted the 3-InSange branch March 24, 2024 15:35
@InSange InSange mentioned this pull request Mar 25, 2024
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.

5 participants