π•ƒπ•¦π•„π•šπ•£

γ€ŒβŒ¨οΈα΄„s」PS/λ°±μ€€_브루트포슀

[Baekjoon/λ°±μ€€][2798][C/C++] λΈ”λž™μž­

by λ£¨λ°€π•ƒπ•¦π•„π•šπ•£2023. 1. 30.
728x90
λ°˜μ‘ν˜•
γ€Žλͺ©μ°¨γ€
0. κ°œμš”

1. 문제
2. 풀이
3. μ½”λ“œ

0. κ°œμš”

브루트포슀 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν‘ΈλŠ” λ¬Έμ œμ΄λ‹€. λͺ¨λ“  경우의 수λ₯Ό 따지면 닡이 λ„μΆœλœλ‹€.

1. 문제

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

 

2798번: λΈ”λž™μž­

첫째 쀄에 μΉ΄λ“œμ˜ 개수 N(3 ≤ N ≤ 100)κ³Ό M(10 ≤ M ≤ 300,000)이 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” μΉ΄λ“œμ— μ“°μ—¬ μžˆλŠ” μˆ˜κ°€ 주어지며, 이 값은 100,000을 λ„˜μ§€ μ•ŠλŠ” μ–‘μ˜ μ •μˆ˜μ΄λ‹€. 합이 M을 λ„˜μ§€ μ•ŠλŠ” μΉ΄λ“œ 3μž₯

www.acmicpc.net

[문제]

μΉ΄μ§€λ…Έμ—μ„œ 제일 인기 μžˆλŠ” κ²Œμž„ λΈ”λž™μž­μ˜ κ·œμΉ™μ€ μƒλ‹Ήνžˆ 쉽닀. μΉ΄λ“œμ˜ 합이 21을 λ„˜μ§€ μ•ŠλŠ” ν•œλ„ λ‚΄μ—μ„œ, μΉ΄λ“œμ˜ 합을 μ΅œλŒ€ν•œ 크게 λ§Œλ“œλŠ” κ²Œμž„μ΄λ‹€. λΈ”λž™μž­μ€ μΉ΄μ§€λ…Έλ§ˆλ‹€ λ‹€μ–‘ν•œ κ·œμ •μ΄ μžˆλ‹€.

ν•œκ΅­ 졜고의 λΈ”λž™μž­ 고수 김정인은 μƒˆλ‘œμš΄ λΈ”λž™μž­ κ·œμΉ™μ„ λ§Œλ“€μ–΄ 상근, μ°½μ˜μ΄μ™€ κ²Œμž„ν•˜λ €κ³  ν•œλ‹€.

김정인 λ²„μ „μ˜ λΈ”λž™μž­μ—μ„œ 각 μΉ΄λ“œμ—λŠ” μ–‘μ˜ μ •μˆ˜κ°€ μ“°μ—¬ μžˆλ‹€. κ·Έ λ‹€μŒ, λ”œλŸ¬λŠ” Nμž₯의 μΉ΄λ“œλ₯Ό λͺ¨λ‘ μˆ«μžκ°€ 보이도둝 λ°”λ‹₯에 λ†“λŠ”λ‹€. 그런 후에 λ”œλŸ¬λŠ” 숫자 M을 크게 μ™ΈμΉœλ‹€.

이제 ν”Œλ ˆμ΄μ–΄λŠ” μ œν•œλœ μ‹œκ°„ μ•ˆμ— Nμž₯의 μΉ΄λ“œ μ€‘μ—μ„œ 3μž₯의 μΉ΄λ“œλ₯Ό 골라야 ν•œλ‹€. λΈ”λž™μž­ λ³€ν˜• κ²Œμž„μ΄κΈ° λ•Œλ¬Έμ—, ν”Œλ ˆμ΄μ–΄κ°€ κ³ λ₯Έ μΉ΄λ“œμ˜ 합은 M을 λ„˜μ§€ μ•ŠμœΌλ©΄μ„œ Mκ³Ό μ΅œλŒ€ν•œ κ°€κΉκ²Œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

Nμž₯의 μΉ΄λ“œμ— 써져 μžˆλŠ” μˆ«μžκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, M을 λ„˜μ§€ μ•ŠμœΌλ©΄μ„œ M에 μ΅œλŒ€ν•œ κ°€κΉŒμš΄ μΉ΄λ“œ 3μž₯의 합을 ꡬ해 좜λ ₯ν•˜μ‹œμ˜€.

[μž…λ ₯]

첫째 쀄에 μΉ΄λ“œμ˜ 개수 N(3 ≤ N ≤ 100)κ³Ό M(10 ≤ M ≤ 300,000)이 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” μΉ΄λ“œμ— μ“°μ—¬ μžˆλŠ” μˆ˜κ°€ 주어지며, 이 값은 100,000을 λ„˜μ§€ μ•ŠλŠ” μ–‘μ˜ μ •μˆ˜μ΄λ‹€.

합이 M을 λ„˜μ§€ μ•ŠλŠ” μΉ΄λ“œ 3μž₯을 찾을 수 μžˆλŠ” 경우만 μž…λ ₯으둜 주어진닀.

[좜λ ₯]

첫째 쀄에 M을 λ„˜μ§€ μ•ŠμœΌλ©΄μ„œ M에 μ΅œλŒ€ν•œ κ°€κΉŒμš΄ μΉ΄λ“œ 3μž₯의 합을 좜λ ₯ν•œλ‹€.

[예제 μž…λ ₯ 1]

5 21
5 6 7 8 9

[예제 좜λ ₯ 1]

21

[예제 μž…λ ₯ 2]

10 500
93 181 245 214 315 36 185 138 216 295

[예제 좜λ ₯ 2]

497

2. 풀이

M을 λ„˜μ§€ μ•ŠμœΌλ©΄μ„œ M에 μ΅œλŒ€ν•œ κ°€κΉŒμš΄ μΉ΄λ“œ 3μž₯을 κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ”, 3쀑 for문이 ν•„μš”ν•˜λ‹€. μ΄λ•Œ, 3쀑 for문의 μ›λ¦¬λŠ” μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™λ‹€.

 

[Baekjoon/λ°±μ€€][2798][C/C++] λΈ”λž™μž­
[Baekjoon/λ°±μ€€][2798][C/C++] λΈ”λž™μž­

 

각각의 forλ¬Έ λ‚΄μ—μ„œ λ°˜λ³΅λ³€μˆ˜μ˜ λ²”μœ„λ₯Ό 잘 μ‚΄νŽ΄λ³΄μž. μœ„ κ·Έλ¦Όκ³Ό 같이 λ³€μˆ˜μ˜ 값이 μ μ§„μ μœΌλ‘œ 증가해 κ°„λ‹€λŠ” 사싀을 μ•Œ 수 μžˆλ‹€.

이후, continue와 MAX ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ M을 λ„˜μ§€ μ•ŠμœΌλ©΄μ„œ M에 μ΅œλŒ€ν•œ κ°€κΉŒμš΄ μΉ΄λ“œ 3μž₯의 합을 좜λ ₯ν•˜λ©΄ λœλ‹€.

3. μ½”λ“œ

#pragma warning (disable:4996)
#include <stdio.h>
#include <stdlib.h>

#define max(a, b) (((a) > (b)) ? (a) : (b))

int main(int argc, char* argv[]) {
	/* μž…λ ₯ */
	int N, M; scanf("%d %d", &N, &M);

	int* arr = (int*)calloc(N, sizeof(int));
	for (int i = 0; i < N; i++)
		scanf("%d", &arr[i]);

	/* μ΅œλŒ€ν•œ κ°€κΉŒμš΄ μΉ΄λ“œ 3μž₯ μ°ΎκΈ° */
	int max_num = 0;
	for (int i = 0; i < N - 2; i++) {
		for (int j = i + 1; j < N - 1; j++) {
			for (int k = j + 1; k < N; k++) {
				/* 합이 M을 λ„˜μ„ 경우 */
				if (arr[i] + arr[j] + arr[k] > M)
					continue;
				max_num = max(max_num, arr[i] + arr[j] + arr[k]);
			}
		}
	}

	/* 좜λ ₯ */
	printf("%d", max_num);

	/* 마무리 */
	free(arr);
	return 0;
}
728x90
λ°˜μ‘ν˜•