안경잡이 구루루

백준 2480 (주사위 세개) [C programming] [VS/Visual Code] 본문

C언어(C programming)/문제풀이(백준,BaekJoon)

백준 2480 (주사위 세개) [C programming] [VS/Visual Code]

구루루(gururu) 2023. 11. 3. 15:07
반응형

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

 

2480번: 주사위 세개

1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.  같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.  같은 눈이 2개

www.acmicpc.net

 


나:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int a[3],i,j=0,totall = 0;
	for (i = 0; i < 3; i++) {
		scanf("%d", &a[i]);
		if (a[i] > j) j = a[i];
	}
	
	if (a[0] == a[1] && a[0]==a[2] && a[1]==a[2]) totall = 10000 + a[0] * 1000;
	else if (a[0] == a[1]) totall = 1000 + a[0] * 100;
	else if (a[0] == a[2]) totall = 1000 + a[0] * 100;
	else if (a[1] == a[2]) totall = 1000 + a[1] * 100;
	else {
		totall = j * 100;
	}
	printf("%d", totall);
	return 0;
}

완성된 코드는 위와 같다.

 

우선 VS의 scanf() 오류를 막기위해  #define _CRT_SECURE_NO_WARNINGS 선언.

 

 

// #1
int a[3],i,j=0,totall = 0;
for (i = 0; i < 3; i++) {
    scanf("%d", &a[i]);
    if (a[i] > j) j = a[i];
}

입력값 세개를 받고 이들중에 가장 큰 수를 구하기 위해 for 반복문을 이용했다.

 

for 반복문이 3번 반복하는 동안 scanf() 를 통해 a배열 3개에 입력값을 하나씩 이때 이전 배열보다 더 큰수이면 그 큰수를 변수 j 에 저장시켰다.

 

 

// #2
if (a[0] == a[1] && a[0]==a[2] && a[1]==a[2]) totall = 10000 + a[0] * 1000;
else if (a[0] == a[1]) totall = 1000 + a[0] * 100;
else if (a[0] == a[2]) totall = 1000 + a[0] * 100;
else if (a[1] == a[2]) totall = 1000 + a[1] * 100;
else {
    totall = j * 100;
}
printf("%d", totall);
return 0;

 

이후 문제 조건에 따라 세개가 모두 같은 경우를 if 조건문에 넣었고

 

셋중 두개만 같은경우 어떤 것끼리 같은지 모르기 때문에 a[0] == a[1], a[0] ==a[2], a[1] == a[2] 의 세가지 경우 모두 else if 구문으로 구현

 

마지막으로 세개가 모두 다른 경우 앞서 구했던 가장 큰 수가 담긴 j 변수를 이용 else 구문으로 구현


다른사람:

#include <stdio.h>

int main() {
    int a,b,c ,MAX, sum=0;
    
    scanf("%d %d %d", &a,&b,&c);
    
    if ((a==b)&&(b==c)) {
        sum = 10000+ (1000*a);
    } else if (a==b) {
        sum = 1000+ (a*100);
    } else if (b==c) {
        sum = 1000+ (b*100);
    } else if (c==a) {
        sum = 1000+ (c*100);
    } else {
       MAX = (((a>=b)?a:b)>=c)?((a>=b)?a:b):c;
       sum = 100*MAX;
    }
    
    printf("%d",sum);
}

완성된 코드는 위와 같다.

 

주목할 점은 세 수가 다를 때 가장 큰 수를 구해야 하는데 여기선 MAX 를 구하는 부분이다.

 

MAX = (((a>=b)?a:b)>=c)?((a>=b)?a:b):c;

 

C 언어만의 독특한 ' 삼항 연산자 '를 이용한 참,거짓을 통해 변수에 값을 저장하는 방식을 이용했다.

 

 

https://dojang.io/mod/page/view.php?id=145

위 사진과 같은 방식으로 이를 이용할 수 있다.

 

위 코드의 경우 삼항 연산자 3개가 겹쳐서 사용되어 다소 복잡해 보이지만 왼쪽 연산부터 차례대로 생각해 보면 이해할 수 있다;

 

코드 과정을 쉽게 보자면

a>=b 가 참인 경우 a, 거짓일 경우 b  (이때 a=b의 경우 어짜피 같기 때문에 둘중 어떤걸 사용해도 상관없음)

②  위 결과에 따라 큰 수인 a 혹은 b가  >= c 를 만족(참) 하면 a 혹은 b , 거짓이면 c 가 변수 MAX에 담김

반응형