작성일 :

문제 링크

27891번 - 특별한 학교 이름 암호화

설명

시저 암호로 암호화된 학교 이름이 주어질 때, 어떤 학교인지 찾는 문제입니다.

후보는 NLCS, BHA, KIS, SJA 네 개이며, 정식 명칭에서 공백과 문장 부호를 제거하고 소문자로 만든 뒤 앞 10글자만 사용합니다.


접근법

먼저 네 학교의 전처리된 이름을 준비합니다.

이후 암호문을 0부터 25까지 회전해 보며 각 학교 이름과 비교합니다.

일치하는 학교를 찾으면 해당 약칭을 출력합니다.


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
using System;

class Program {
  static string Rotate(string s, int n) {
    var arr = s.ToCharArray();
    for (var i = 0; i < arr.Length; i++)
      arr[i] = (char)((arr[i] - 'a' + n) % 26 + 'a');
    return new string(arr);
  }

  static string Decode(string name) {
    var full = new[] {
      "northlondoncollegiateschool",
      "branksomehallasia",
      "koreainternationalschool",
      "stjohnsburyacademy"
    };
    var abbr = new[] { "NLCS", "BHA", "KIS", "SJA" };
    for (var i = 0; i < 26; i++) {
      var decoded = Rotate(name, i);
      for (var j = 0; j < full.Length; j++) {
        if (full[j].Substring(0, 10) == decoded)
          return abbr[j];
      }
    }
    return "";
  }

  static void Main() {
    var name = Console.ReadLine()!;
    Console.WriteLine(Decode(name));
  }
}

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
#include <bits/stdc++.h>
using namespace std;

typedef vector<string> vs;

string rotate(string s, int n) {
  for (char& c : s)
    c = (c - 'a' + n) % 26 + 'a';
  return s;
}

string decode(string name) {
  vs full = {
    "northlondoncollegiateschool",
    "branksomehallasia",
    "koreainternationalschool",
    "stjohnsburyacademy"
  };
  vs abbr = {"NLCS", "BHA", "KIS", "SJA"};
  for (int i = 0; i < 26; ++i) {
    string decoded = rotate(name, i);
    for (size_t j = 0; j < full.size(); ++j) {
      if (full[j].substr(0, 10) == decoded)
        return abbr[j];
    }
  }
  return "";
}

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

  string name; cin >> name;
  cout << decode(name) << "\n";

  return 0;
}