백준 20529번 문제 바로가기
문제 상황 이해 한때 핫했던 MBTI를 활용한 재밌는 문제. MBTI 글자 하나가 다를때마다 거리를 1로 잡고 그 거리의 총합을 구하는 문제다.
Keypoint 비둘기집의 원리을 활용해서 if문 작성해주기 MBTI의 총 가짓수가 2^4=16종류이기 때문에 33명 이상이면 반드시 3명은 같은 MBTI를 가진다 def distance(case): temp = 0 for i in range(3): for j in range(4): if case[i%3][j] != case[(i+1)%3][j]: temp += 1 return temp n_test = int(input()) for i in range(n_test): n_friend = int(input()) mbti = input().split() if n_friend >= 33: print(0) else: min_distance = 20 for x in range(n_friend-2): for y in range(x+1, n_friend-1): for z in range(y+1, n_friend): d = distance([mbti[x], mbti[y], mbti[z]]) if d < min_distance: min_distance = d print(min_distance) #include <iostream> #include <string> using namespace std; int distance(string a, string b, string c){ int temp = 0; for (int i=0; i<4; i++){ if (a[i] != b[i]){ temp++; } if (b[i] != c[i]){ temp++; } if (c[i] != a[i]){ temp++; } } return temp; } int main() { int n_test, n_friend; string name; string mbti[100000]; cin >> n_test; for (int i=0; i<n_test; i++){ int d, min_distance = 20; cin >> n_friend; for (int j=0; j<n_friend; j++){ cin >> name; mbti[j] = name; } if (n_friend >= 33){ cout << 0 << endl; } else { for (int x=0; x<n_friend-2; x++){ for (int y=x+1; y<n_friend-1; y++){ for (int z=y+1; z<n_friend; z++){ d = distance(mbti[x], mbti[y], mbti[z]); if (d < min_distance){ min_distance = d; } } } } cout << min_distance << endl; } } }