白駿20529号最近の3人の心理的距離
質問する
に答える
注意:タイムアウトエラーが発生したため、ずっと大変でした.タイムアウトエラーは時間の複雑さのために発生しますが、入力を受け付けずに待機している場合もあります.この問題に対しては,32より大きいN個のMBTIを全て入力して判断してこそ,入力によるタイムアウトを回避することができる.
コード1 //난이도 : 실버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;
}
コード2 //난이도 : 실버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個の箱に入れる場合、少なくとも1個の箱に2個以上の物品が入っている原理
アテステーション
//난이도 : 실버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個の箱に入れる場合、少なくとも1個の箱に2個以上の物品が入っている原理
アテステーション
例文
5人が
すべてのファイルを任意の大きいS以下に圧縮する無損圧縮アルゴリズムは存在しない.Sより小さいサイズのファイル数は固定されているため、このようなアルゴリズムが存在する場合、同じファイルに圧縮された2つの異なるファイルが存在しなければならないため、2つのファイルを復元することはできません.
Reference
この問題について(白駿20529号最近の3人の心理的距離), 我々は、より多くの情報をここで見つけました https://velog.io/@jsleeg98/백준-20529번-가장-가까운-세-사람의-심리적-거리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol