참고 : 시간 초과 오류가 떠서 계속 고생했는데 시간 초과 오류는 시간복잡도 때문에 나오기도 하지만 입력을 받지 않고 기다려서 나는 경우도 있다. 이 문제의 경우 32보다 큰지 아닌지를 N개의 MBTI를 모두 입력 받은 다음에 판단하여야 입력 때문에 시간초과가 나오는 경우를 피할 수 있다.
시간 초과가 난 경우 입력을 모두 받은게 맞는지 확인하는 습관을 가지자
//난이도 : 실버1
//시작 : 18:10
//끝 :
#include <iostream>
#include <vector>
using namespace std;
//MBTI를 숫자로 바꾸는 함수
vector<int> change_num(string tmp) {
vector<int> num_mbti;
if (tmp[0] == 'E') {
num_mbti.push_back(1);
}
else {
num_mbti.push_back(2);
}
if (tmp[1] == 'N') {
num_mbti.push_back(1);
}
else {
num_mbti.push_back(2);
}
if (tmp[2] == 'F') {
num_mbti.push_back(1);
}
else {
num_mbti.push_back(2);
}
if (tmp[3] == 'J') {
num_mbti.push_back(1);
}
else {
num_mbti.push_back(2);
}
return num_mbti;
}
//3개의 MBTI의 거리를 출력하는 함수
int get_distance(vector<vector<int>> mbti_3) {
int distance = 0;
for (int i = 0; i < 4; i++) {
distance += abs(mbti_3[0][i] - mbti_3[1][i]);
}
for (int i = 0; i < 4; i++) {
distance += abs(mbti_3[1][i] - mbti_3[2][i]);
}
for (int i = 0; i < 4; i++) {
distance += abs(mbti_3[0][i] - mbti_3[2][i]);
}
return distance;
}
// 경우의 수에 따라 거리 측정하는 함수
int solve(vector<vector<int>> mbti) {
int min_distance = 100;
for (int i = 0; i < mbti.size() - 2; i++) {
for (int j = i + 1; j < mbti.size() - 1; j++) {
for (int k = j + 1; k < mbti.size(); k++) {
vector<vector<int>> mbti_3;
mbti_3.push_back(mbti[i]);
mbti_3.push_back(mbti[j]);
mbti_3.push_back(mbti[k]);
int distance = get_distance(mbti_3);
if (min_distance > distance) { //최소값 찾기
min_distance = distance;
}
}
}
}
return min_distance;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T;
cin >> T;
for (int i = 0; i < T; i++) {
int N;
cin >> N;
vector<vector<int>> mbti;
for (int j = 0; j < N; j++) { //MBTI 입력 받기
string tmp;
cin >> tmp;
mbti.push_back(change_num(tmp));
}
if (N >= 33) { //33개이상인 경우 반드시 거리가 0이다. MBTI의 종류가 16개이기 때문에 최대한 멀게 하려고 해도 중복되는 3개가 존재하기 때문이다.
cout << 0 << '\n';
}
else { //32개 이하인 경우 최소 거리 측정
int min_distance = solve(mbti);
cout << min_distance << '\n';
}
}
return 0;
}
//난이도 : 실버1
//시작 : 18:10
//끝 :
#include <iostream>
#include <vector>
using namespace std;
//두 MBTI의 거리를 출력하는 함수
int get_distance(string a, string b) {
int distance = 0;
for (int i = 0; i < 4; i++) {
if (a[i] != b[i]) { //문자가 다를경우 거리 +1
distance += 1;
}
}
return distance;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T;
cin >> T;
for (int i = 0; i < T; i++) {
vector<string> str;
int N;
cin >> N;
for (int j = 0; j < N; j++) { //MBTI를 입력 받는다.
string tmp;
cin >> tmp;
str.push_back(tmp);
}
if (N > 32) { //받은 MBTI개수가 32개를 넘는 경우 아무리 거리를 멀리 하려고 해도 MBTI는 16 종류이기 때문에 반드시 3개가 중복되는 것이 발생한다.
//이 때는 거리가 무조건 0이기 때문에 거리를 측정할 필요가 없다.
cout << 0 << '\n';
}
else { //32개 이하이면 다양한 거리가 나올 수 있기 때문에 최소 거리를 직접 계산한다.
int min_distance = 100;
for (int i = 0; i < N - 2; i++) {
for (int j = i + 1; j < N - 1; j++) {
for (int k = j + 1; k < N; k++) { //최소 값 찾기를 한다.
min_distance = min(min_distance, get_distance(str[i], str[j]) + get_distance(str[j], str[k]) + get_distance(str[i], str[k]));
}
}
}
cout << min_distance << '\n'; //최소 거리 출력
}
}
return 0;
}
n+1개의 물건을 n개의 상자에 넣을 때 적어도 어느 한 상자에는 두 개 이상의 물건이 들어있다는 원리