πŸ“ Coding Test Study/Algorithm Problem

[Baekjoon][C++] 2309번 μΌκ³±λ‚œμŸμ΄ λ¬Έμ œμ„€λͺ… 및 μ½”λ“œ

ibelieveinme 2021. 3. 3. 00:37
728x90
 

2309번: 일곱 λ‚œμŸμ΄

아홉 개의 쀄에 걸쳐 λ‚œμŸμ΄λ“€μ˜ ν‚€κ°€ μ£Όμ–΄μ§„λ‹€. μ£Όμ–΄μ§€λŠ” ν‚€λŠ” 100을 λ„˜μ§€ μ•ŠλŠ” μžμ—°μˆ˜μ΄λ©°, 아홉 λ‚œμŸμ΄μ˜ ν‚€λŠ” λͺ¨λ‘ λ‹€λ₯΄λ©°, κ°€λŠ₯ν•œ 정닡이 μ—¬λŸ¬ 가지인 κ²½μš°μ—λŠ” μ•„λ¬΄κ±°λ‚˜ 좜λ ₯ν•œλ‹€.

www.acmicpc.net

β–· λ¬Έμ œμ„€λͺ…

찐 μΌκ³±λ‚œμŸμ΄λ₯Ό μ°ΎλŠ” 문제!

즉, κ°€μ§œ λ‚œμŸμ΄ 2λͺ…이 ν¬ν•¨λœ 9λͺ…μ˜ λ‚œμŸμ΄ μ€‘μ—μ„œ 찐 μΌκ³±λ‚œμŸμ΄λ₯Ό μ°Ύμ•„μ•Ό ν•œλ‹€.

그리고 μΌκ³±λ‚œμŸμ΄μ˜ ν‚€λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

 

β–· λ¬Έμ œν’€μ΄

1) μΌκ³± λ‚œμŸμ΄μ˜ ν‚€μ˜ 합이 100인 것과 μˆœμ—΄μ˜ μ„±μ§ˆμ„ μ΄μš©ν•œλ‹€.

2) 9λͺ… 쀑, 7λͺ…을 μ„ νƒν•˜λŠ” 방법이 μ•„λ‹Œ 2λͺ…μ˜ λ‚œμŸμ΄λ₯Ό μ„ νƒν•˜λŠ” 경우λ₯Ό κ΅¬ν•œλ‹€.(9C7 = 9C2)

3) 전체 ν‚€μ˜ ν•©μ—μ„œ 2λͺ… ν‚€λ₯Ό λΉΌλ³Έλ‹€.

4) κ·Έ 값이 100이 λœλ‹€λ©΄ κ·Έ λ‘˜μ΄ κ°€μ§œ λ‚œμŸμ΄λ“€μ΄λ‹€.

 

β–· μ‹œκ°„λ³΅μž‘도

λ‚œμŸμ΄μ˜ μˆ˜κ°€ N이라면 2λͺ…μ˜ λ‚œμŸμ΄λ₯Ό κ³ λ₯Ό λ•Œ, N제곱의 경우의 μˆ˜κ°€ ν•„μš”ν•˜λ‹€.

λ”°λΌμ„œ μ‹œκ°„λ³΅μž‘λ„λŠ” O(N^2)이닀.

 

β–· μ •λ‹΅μ½”λ“œ

#include <iostream>
#include <algorithm>
using namespace std;
#define INPUT_NUM 9

void Input();
void Permutation(int arr[], int sum);
void Output(int arr[], int idx1, int idx2);

int main() {
	Input();
	return 0;
}

//0. 9λͺ…μ˜ λ‚œμŸμ΄λ“€μ˜ 킀값을 μž…λ ₯λ°›λŠ”λ‹€.
void Input() {
	int arr[INPUT_NUM] = { 0, };
	int sum = 0;
	for (int i = 0; i < INPUT_NUM; i++) {
		cin >> arr[i];
		//1. μž…λ ₯λ°›μœΌλ©΄μ„œ ν‚€μ˜ 합을 κ΅¬ν•œλ‹€.
		sum += arr[i];
	}
	//2. 미리 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.(λ‚˜μ€‘μ— 정렬해도 상관은 μ—†μŒ)
	sort(arr, arr + 9);
	Permutation(arr, sum);
}

//3. 9λͺ…μ˜ λ‚œμŸμ΄ 쀑에 2λͺ…을 골라본닀.(9C2 μˆœμ—΄)
void Permutation(int arr[INPUT_NUM], int sum) {
	for (int i = 0; INPUT_NUM; i++) {
		for (int j = 1; j < INPUT_NUM; j++) {
			//4. 전체 λ‚œμŸμ΄ ν‚€μ˜ 합쀑에 2λͺ… 값을 λΉΌλ³Έλ‹€.
			//5. κ·Έ 값이 100이 λœλ‹€λ©΄ κ³ λ₯Έ 2λͺ…은 κ°€μ§œ λ‚œμŸμ΄λ‹€.
			if (sum - arr[i] - arr[j] == 100) {
				Output(arr, i, j);
				return;
			}
		}
	}
}

//6. 2λͺ…을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ 7λ‚œμŸμ΄λ“€μ˜ ν‚€λ₯Ό 좜λ ₯ν•œλ‹€.
void Output(int arr[INPUT_NUM], int idx1, int idx2) {
	for (int i = 0; i < INPUT_NUM; i++) {
		if (i != idx1 || i != idx2) {
			cout << arr[i] << '/n';
		}
	}
}

 

728x90