
#include <iostream>
using namespace std;
int main() {
int a,b,c;
int max;
cin >> a >> b >> c;
if(a == b && b == c) cout << 10000+a*1000;
else if (a == b || b == c) cout << 1000 + b*100;
else if (a == c) cout << 1000+a*100;
else {
max=a;
if(b>max) max=b;
if(c>max) max=c;
cout << max*100;
}
return 0;
}
세 주사위를 던지는 경우,
(1) 3개 전부 같다
(2) 2개가 같다
(3) 0개가 같다 (=전부 다르다)
이 3가지의 경우가 존재하니, 이를 기준으로 조건문을 사용해 분기 처리하면된다.
위의 문제의 경우 2가지가 고민이다.
(1) 어떻게 같은지를 찾을거냐?
(2) 어떻게 최댓값을 찾을거냐?
(1),(2) 모두 조건문 적절히 사용하면 가능하다.
그러나 (2)의 경우 <algorithm> 헤더의 max(a,b) 함수를 쓰면 최댓값을 쉽게 찾을 수 있다.
이때 중요한 것은 max(a,b)는 인자가 2개이다.
따라서 3개의 수 중 가장 큰 값을 찾으려면 max(a,max(b,c))와 같은식으로
max(a,b)의 인자로 max(a,b)를 넣어줘야한다.
처음에 전부 다른 경우 최댓값을 어떻게 찾아야할지가 고민이었다.
max=a;
if(b>max) max=b;
if(c>max) max=c;
cout << max*100;
위처럼 a,b,c 각각을 전부 max 값과 비교하여 max값보다 큰 녀석이있다면 max에 해당 값을 대입해주고,,하는식으로하면 최댓값을 얻을 수 있다는것이 인상적이었다.
위의 코드는 다른데도 많이 사용할 수 있을 것 같다.
#include <iostream>
using namespace std;
int main() {
int a,b,c;
int max;
ios_base::sync_with_stdio(false);
cin >> a >> b >> c;
if(a == b && b == c) cout << 10000+a*1000;
else if (a == b || b == c) cout << 1000 + b*100;
else if (a == c) cout << 1000+a*100;
else {
max=a;
if(b>max) max=b;
if(c>max) max=c;
cout << max*100;
}
return 0;
}
그냥 기본 <iostream> 코드에다가 ios_base::sync_with_stdio(false); 만
한 줄 추가해주면된다.
#include <stdio.h>
int main() {
int a, b, c, max;
scanf("%d %d %d", &a, &b, &c);
if(a==b&&a==c) printf("%d", 10000+1000*a);
else if(a==b||b==c) printf("%d", 1000+b*100);
else if(a==c) printf("%d", 1000+a*100);
else {
max = a;
if(b>max) max=b;
if(c>max) max=c;
printf("%d", max*100);
}
printf(10000+1000*a) 와 같은 식으로 사용했더니 오류가났다.
printf() 사용시 printf("hihello") 이런식으로 문자열을 인자로 넣는 경우 아니라면, 전부 무조건 형식지정자를 사용해줘야한다.
printf("%d", 10000+1000*a) 이런식으로 !
사실 처음에 분기하려하니 너무 노가다일것같아서 오름차순으로 정렬을 진행한 다음에 분기하려했다.
그렇게 삽질하다가 잘 안돼서 gpt한테 물어봤더니 위처럼 간단하게 잘 코드를 짜주었다.
if, else if, else 구문을 사용할 때, if,else if,else 문을 각각 거름망처럼 생각하면 좋을 것 같다.
예를들어
if(a == b && b == c) cout << 10000+a*1000; 밑에서는 더이상 a와 b와 c가 모두 같은 상황을 고려할 필요가없다. 위에서 거름망으로 거르기때문에 절대 위와같은 상황은 아래에서 발생하지않는다.
else if (a == b || b == c) cout << 1000 + b*100; 밑에서는 더이상 a와 b가 같거나 b와 c가 같은 상황을 고려할 필요가없다. 위에서 거름망으로 거르기때문에 절대 위와같은 상황은 아래에서 발생하지않는다.
else if (a == c) cout << 1000+a*100; 밑에서는 더이상 a와 c가 같은 상황을 고려할 필요가없다. 위에서 거름망으로 거르기때문에 절대 위와같은 상황은 아래에서 발생하지않는다.
그러면 이제 남은건 전부 다른 상황 밖에없으니 그에 맞는 처리를 해주면된다.
세 주사위 값이 같은지,다른지는 if문을 사용하면 쉽게 분기가 가능하다.
그러나 최댓값의 경우 어떻게 구해야할지 잘 떠오르지 않았다.
머릿속에 떠오른 방법은
(1) 문자열로 받아서 정렬 함수 사용
(2) 최댓값 찾는 함수 사용
였는데, 둘다 어떤 헤더의 어떤 함수를 써야될지 떠오르지않았다.
// (1) 방법
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
string a, b, c;
cin >> a >> b >> c; // 3 3 6
a = a + b + c; // "336"
sort(a.begin(), a.end());
if(a[0]==a[1] && a[1]==a[2]) cout << 10000+(a[0]-'0')*1000;
else if(a[0] == a[1] && a[1] != a[2]) cout << 1000 +(a[0]-'0')*100;
else if(a[0] == a[2] && a[1] != a[0]) cout << 1000 + (a[0]-'0')*100;
else if(a[1] == a[2] && a[0] != a[1]) cout << 1000 + (a[1]-'0')*100;
else cout << (a[2]-'0') * 100;
return 0;
}
// (2) 방법
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
int a, b, c;
cin >> a >> b >> c;
if (a == b && b == c) cout << 10000 + a * 1000;
else if (a == b || a == c) cout << 1000 + a * 100;
else if (b == c) cout << 1000 + b * 100;
else cout << max(a, max(b,c)) * 100;
return 0;
}
<algorithm> 헤더의 사용법 미숙지로 인해 틀린것으로 생각된다.
<algorithm> 헤더의 주요 함수들을 잘 외워둬야겠다.