알고리즘
[c++] 백준 2999번 비밀 이메일
IT 참다랑어
2021. 1. 3. 15:45
https://www.acmicpc.net/problem/2999
2999번: 비밀 이메일
정인이는 원래 "bombonisuuladici"를 보내려고 했다. 이 메시지는 16글자이므로, 정인이는 1*16, 2*8, 4*4 행렬을 선택할 수 있다. R이 가장 큰 것은 4*4이므로, 4*4를 선택한다. 정인이가 만든 행렬은 다음과
www.acmicpc.net
아직 이차원 배열의 indexing 이 익숙하지 않아서
인덱싱 순서를 생각하는데 가장 오래걸렸다.
예시는 n*n 짜리 이차원 배열을 이용하는데
n*m짜리 배열을 돌려보니 문자가 이상하게 나왔다.
그래서 어디가 틀렸는지 디버거 이용해서 하나하나 본다고 좀 오래걸렸다.
#include <iostream>
#include <math.h>
using namespace std;
int main() {
string str;
cin >> str;
int num = str.length();
int i, j, k, row = 0, col = 0;
for (i = sqrt(num); i > 0; i--) { // 배열의 크기를 알기 위해
if (num % i == 0) {
col = i; //복호화하는 코드이기때문에 문제에서 주어진 암호 알고리즘과
row = num / col; //row와 col을 반대로 정의한다.
break;
}
}
char** arr = new char* [row]; //row*col 짜리 이차원 배열을 동적할당한다.
for (i = 0; i < row; i++) {
arr[i] = new char[col];
}
i = 0;
while(i<num){ //문자열을 차례로 배열에 집어넣는다.
for (j = 0; j < row; j++) {
for (k = 0; k < col; k++) {
arr[j][k] = str[i++];
}
}
}
for (i = 0; i < col; i++) { //암호를 만들때와 마찬가지로 col은 고정하고
//row를 먼저 바꿔가면서 출력한다.
for (j = 0; j < row; j++) {
cout << arr[j][i];
}
}
}
반복문이 너무 많아서 암호가 길어지면 시간이 너무 많이걸릴것 같긴한데
구글링해서 다른 분들 코드도 읽어봐야겠다.
그래도 오랜만에 혼자힘으로 풀어낸 문제라서 맞추고 나니까 속이 후련했다!