본문 바로가기
SWE/코테

[성실코딩 6일차] 백준 #2251 물통 ***

by S나라라2 2019. 1. 11.
반응형

아아아ㅏㅏㅏㅏ 너무 지치는 문제다

처음에 접근을 잘못했다.


시뮬레이션으로 생각안하고 

A,B,C 크기 조건에 따라 규칙적인 값이 있을 것이라고 생각했다.


(1) C=A=B

-> C


(2) A,B > C

-> C


(3) A >= C >= B

-> B, C, C-B

    B >= C >= A

-> A, C, C-A


(4) C >= B >= A 

    C >= A >= B



(1), (2), (3)의 경우는 맞지만 (4)의 경우는 시뮬레이션을 하는게 맞는 것 같다,,,,,,

아니면 A,B,C의 약수가 공통으로 있다면(배수관계라면) 규칙성을 찾을 수 있고,,,,, 하아,, 어렵다,,,,,

(참고로 위처럼 크기로 조건을 나눠서 푼다면, (1)중복값을 체크해서 제외 (2)오름차순으로 정렬 을 까먹으면 안된다.)


시뮬레이션으로 다시 풀어봐야겠다.



틀렸던 C언어 구현 코드


#include < iostream >
#include < vector >
#include < algorithm >

using namespace std;

int A, B, C;
vector<int> answer;

// vector에 이미 값이 있으면 return 1
//                    없으면 return 0
int isAlreadythere(int _v) {
	for (int k = 0; k < answer.size(); k++) {
		if (answer.at(k) == _v) {
			return 1;
		}
	}
	return 0;
}

int main(void) {

	cin >> A >> B >> C;

	// 1. 세 개 모두 같은 경우
	// 2. C가 가장 작은 경우
	if ( (A == B && A == C) ||
		(A > C && B > C)) {
		cout << "0 "<< C << endl;
		return 0;
	} 
	
	// 3. C가 두 번째로 큰 경우
	if (A >= C && C >= B) {
		answer.push_back(C);
		answer.push_back(B);
		answer.push_back(C - B);
	}
	else if ( B >= C && C >= A ) {
		answer.push_back(C);
		answer.push_back(A);
		answer.push_back(C - A);
	}// 4. C가 가장 큰 경우
	else if ( C >= A && C >= B) {
		int sum_ab = A + B;
		if (A >= B) {
			if (C == sum_ab) {
				answer.push_back(C);
				if (isAlreadythere(C - B) == 0) {
					answer.push_back(C - B);
				}
			}
			else if (C>sum_ab) { // C > A >= B && C >= A+B 
				answer.push_back(C);
				if (isAlreadythere(C-A)==0) {
					answer.push_back(C - A);
				}
				if (isAlreadythere(C - B) == 0) {
					answer.push_back(C - B);
				}
			}
			else {           // C > A >= B && C < A+B 
				answer.push_back(C);
				if (isAlreadythere(C - B) == 0) {
					answer.push_back(C - B);
				}
				if (isAlreadythere(A) == 0) {
					answer.push_back(A);
				}
				if (isAlreadythere(B) == 0) {
					answer.push_back(B);
				}
			}
		}
		else {  // A < B
			if (C >= sum_ab) { // C > B > A && C >= A+B 
				answer.push_back(C);
				if (isAlreadythere(C-A) == 0) {
					answer.push_back(C-A);
				}
				if (isAlreadythere(C - B) == 0) {
					answer.push_back(C - B);
				}
			}
			else {           // C > B > A && C < A+B 
				answer.push_back(C);
				if (isAlreadythere(C - A) == 0) {
					answer.push_back(C - A);
				}
				if (isAlreadythere(C - B) == 0) {
					answer.push_back(C - B);
				}
				if (isAlreadythere(A) == 0) {
					answer.push_back(A);
				}
				if (isAlreadythere(B) == 0) {
					answer.push_back(B);
				}
			}
		}
	}

	int answer_sz = answer.size();

	sort(answer.begin(), answer.end());


	for (int k = 0; k < answer_sz-1; k++) {
		cout << answer.at(k) << " ";
	}
	
	cout << answer.at(answer_sz-1) << endl;

	return 0;
}

반응형