본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 11093번 : Secret Message

반응형

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

 

11093번: Secret Message

Jack and Jill developed a special encryption method, so they can enjoy conversations without worrrying about eavesdroppers. Here is how: let L be the length of the original message, and M be the smallest square number greater than or equal to L. Add (M −

www.acmicpc.net

구현 문제였습니다.

 

 

 

📕 풀이방법

 

📔 입력 및 초기화

문제에 나와 있는 입력을 적절히 해준 후 초기화를 해줍니다. 100까지의 제곱수를 squares라는 배열에 저장합니다.

또한 message table인 board배열을 초기화해줍니다.

 

📔 제곱수 찾기

입력받은 문자열의 길이 이상의 가장 가까운 제곱수를 찾습니다. 이 수가 정사각형 message table의 하나의 변입니다.

문자들을 적절히 삽입한 뒤 시계방향으로 90도 회전합니다.

 

📔 답 출력

 '*'를 제외한 나머지를 출력합니다.

 


 

 

📕 Code

#include <bits/stdc++.h>
using namespace std;
int t, side;
char board[101][101];
vector <int> squares;

void rotateClockwise(){
    char tmp[101][101];
    for(int i = 0; i < side; i++){
        for(int j = 0; j < side; j++){
            tmp[i][j] = board[side-j-1][i];
        }
    }
    for(int i = 0; i < side; i++){
        for(int j = 0; j < side; j++){
            board[i][j] = tmp[i][j];
        }
    }
}

int main(){
    for(int i = 1; i <= 100; i++) squares.push_back(i*i);

    cin >> t;
    while(t--){
        memset(board,'*',sizeof(board));
        string s;
        cin >> s;

        for(auto sq : squares){
            if(sq >= s.size()) {side = sqrt(sq); break;}
        }

        int piv = 0;
        for(int i = 0; i < side; i++){

            for(int j = 0; j < side; j++){
                if(piv < s.size())
                    board[i][j] = s[piv++];
                else    
                    board[i][j] = '*';
            }
        }
        rotateClockwise();
        for(int i = 0; i < side; i++){
            for(int j = 0; j < side; j++){
                if(board[i][j] !='*')
                    cout << board[i][j];
            }
        }
        cout << '\n';
    }
}