알고리즘

[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];
		}
	}
}

 

반복문이 너무 많아서 암호가 길어지면 시간이 너무 많이걸릴것 같긴한데

구글링해서 다른 분들 코드도 읽어봐야겠다.

그래도 오랜만에 혼자힘으로 풀어낸 문제라서 맞추고 나니까 속이 후련했다!