백준 10817번 - 세 수

VDoring·2021년 8월 25일
0

백준-문제풀이

목록 보기
1/16

백준 10817번 - 세 수

문제 출처

10817번: 세 수

코드

/* 내 코드 */
#include <stdio.h>
int main() {
	int n[4];
	int min = 999, max = -999;
	int min_locate, mid_locate, max_locate;
	
	scanf("%d %d %d", &n[0], &n[1], &n[2]);

	for (int i = 0; i < 3; i++) { // 최대값, 최소값 찾기
		if (min > n[i]) {
			min = n[i];
			min_locate = i;
		}
		if (max < n[i]) {
			max = n[i];
			max_locate = i;
		}
	}

	for (int i = 0; i < 3; i++) { // 최대값, 최소값이 저장된 위치를 바탕으로 중간값이 저장된 위치를 추측
		if (i == min_locate || i == max_locate)
			continue;
		mid_locate = i;
	}

	if (n[0] == n[1] || n[1] == n[2]) // 값이 같은 부분이 있을 경우에 관한 처리
		printf("%d", n[1]);
	else if (n[2] == n[0])
		printf("%d", n[2]);
	else
		printf("%d", n[mid_locate]);

}
/* 모범 코드 */

#include <stdio.h>

int main()
{
	int A, B, C;
	scanf("%d %d %d", &A, &B, &C);
	if ((A > B) != (A > C)) printf("%d", A); // A와 B를, A와 C를 비교해서 하나라도 A가 크면 B,C보다 A보다 큰게 하나. A보다 작은게 하나가 있다는 이야기가 된다.
	else ((A > B) == (B > C)) ? printf("%d", B) : printf("%d", C); // 첫 번째 조건은 확실하지 않다. 하지만 두 번째 조건은 A>C>B가 되어 C가 답이 된다. 그럼 첫 번째는 자연스럽게 B가 된다.
	return 0;
}

해결 방법

나는 최솟값과 최댓값의 위치를 파악해서 중간값을 유추한 다음, a, b, c 중 2개 이상이 같은 값을 가질 때에 맞는 처리를 한 다음 출력하는 방식을 사용했다.

따라서 배열을 이용하였고, 특정 숫자가 들어있는 위치를 파악하기 위해 int형 변수를 따로 선언하였다.

느낀 점

이 글을 적으면서 다시 살펴보니 그냥 값들을 정렬해서 중간값만 빼오는 방법을 사용하면 더 간단하게 해결할 수 있을 것 같다는 생각이 든다.

이 문제는 1달 전 나에게 고비를 가져다준 문제였으나, 브론즈 상위 문제와 실버 하위 문제에 얻어맞으며 힘을 기른 지금의 나에겐 그렇게까지 어려운 문제는 아니었다.

하지만 내 문제풀이 방식을 보면... 계속 공부하는 수밖에!

profile
< Beginners Heart >

0개의 댓글