작성일 :

문제 링크

25542번 - 약속 장소

설명

n 개의 문자열이 주어졌을 때, n 개의 문자열들 각각과 한 문자만 다른 문자가 있는지 판별하는 문제입니다.

입력으로 주어지는 문자열의 길이가 길지 않고, n 의 크기 역시 크지 않습니다.

따라서, 단순히 완전탐색을 이용하여 풀이하였습니다.


Code

[ C# ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
namespace Solution {
  class Program {
    static void Main(string[] args) {

      var input = Console.ReadLine()!.Split(' ');
      var n = int.Parse(input[0]);
      var l = int.Parse(input[1]);

      List<string> candidates = new List<string>();
      for (int i = 0; i < n; i++)
        candidates.Add(Console.ReadLine()!);

      char[] ans = candidates[0].ToCharArray();
      for (int i = 0; i < l; i++) {
        bool isFound = false;
        for (char c = 'A'; c <= 'Z'; c++) {
          ans[i] = c;
          bool isValid = true;
          foreach (var candidate in candidates) {
            int cntDiff = 0;
            for (int j = 0; j < l; j++) {
              if (candidate[j] != ans[j]) cntDiff++;
              if (cntDiff > 1) {
                isValid = false;
                break ;
              }
            }
            if (!isValid) break ;
          }
          if (isValid) {
            isFound = true;
            break ;
          }
        }
        if (!isFound) ans[i] = candidates[0][i];
      }

      int diffMax = 0;
      for (int i = 0; i < n; i++) {
        int diffCur = 0;
        for (int j = 0; j < l; j++)  {
          if (candidates[i][j] != ans[j])
            diffCur++;
        }
        diffMax = Math.Max(diffMax, diffCur);
      }

      if (diffMax > 1) Console.WriteLine("CALL FRIEND");
      else Console.WriteLine(new string(ans));

    }
  }
}



[ C++ ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n, l; cin >> n >> l;

  vector<string> candidates(n);
  for (int i = 0; i < n; i++)
    cin >> candidates[i];

  string ans = candidates[0];
  for (int i = 0; i < l; i++) {
    bool isFound = false;
    for (char c = 'A'; c <= 'Z'; c++) {
      ans[i] = c;
      bool isValid = true;
      for (const auto &candidate : candidates) {
        int cntDiff = 0;
        for (int j = 0; j < l; j++) {
          if (candidate[j] != ans[j]) cntDiff++;
          if (cntDiff > 1) {
            isValid = false;
            break ;
          }
        }
        if (!isValid) break ;
      }
      if (isValid) {
        isFound = true;
        break ;
      }
    }
    if (!isFound) ans[i] = candidates[0][i];
  }

  int diffMax = 0;
  for (int i = 0; i < n; i++) {
    int diffCur = 0;
    for (int j = 0; j < l; j++) {
      if (candidates[i][j] != ans[j])
        diffCur++;
    }
    diffMax = max(diffMax, diffCur);
  }

  if (diffMax > 1) cout << "CALL FRIEND" << "\n";
  else cout << ans << "\n";

  return 0;
}