본문 바로가기

Algorithm/Sorting

(C++) - 백준(BOJ) 17176 : 암호해독기

반응형

https://www.acmicpc.net/problem/17176

 

17176번: 암호해독기

방금 도착한 암호문을 해독했는데, 해독에 오류가 없는지 확인해보려 한다. 해독한 문장이 암호문을 해석한 결과로 나올 수 없다면, 그 해독은 잘못된 것이다. 암호문은 0 이상 52 이하의 정수로

www.acmicpc.net

구현 후 정렬비교로 푼 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

복호화된 문자열을 저장할 decodedCryptogram, 평문 origin, 암호를 저장할 배열 cryptogramVector를 선언한 후 적절히 입력받습니다.

📔 풀이과정

1. 아스키 코드표를 참조해 cryptogramVector에서 하나씩 원소를 확인한 후 복호화해 decodedCryptogram에 저장합니다.2. 암호문의 문자는 무작위로 배치되므로 origin, decodedCryptogram을 오름차순으로 정렬해줍니다. n이 10만이므로 O(nlogn)의 복잡도를 가진 정렬을 수행해야합니다.

📔 정답출력

origin과 decodedCryptogram이 같으면 'y' 다르면 'n'을 출력합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
string decodedCryptogram, origin;
vector <int> cryptogramVector;
int n;

void decodeCryptogram(){
  for(auto c : cryptogramVector){
    if(c == 0) decodedCryptogram += " ";
    else if(1 <= c && c <= 26) {
      decodedCryptogram += (c - 1) + 'A';
    }
    else if(27 <= c && c <= 52) {
      decodedCryptogram += (c - 27) + 'a';
    }
  }
}

int main(){
  cin >> n;
  cryptogramVector.resize(n);
  for(int i = 0; i < n; i++) cin >> cryptogramVector[i];
  cin.ignore();

  getline(cin, origin);
  decodeCryptogram();

  sort(decodedCryptogram.begin(), decodedCryptogram.end());
  sort(origin.begin(), origin.end());
  
  if(decodedCryptogram == origin) cout << 'y';
  else cout << 'n';
}