-
백준 1855번 : 암호 (C 언어)c c++ 언어 공부 2023. 10. 3. 16:47
https://www.acmicpc.net/problem/1855
1855번: 암호
준표와 세준이는 서로 솔루션을 토론 하면서 다른 사람이 자신들의 솔루션을 듣지 못하게 하도록 서로 메시지를 주고받을 때 메시지를 암호화 하여서 주고받았다. 암호를 만드는 방법은 다음과
www.acmicpc.net
Code:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <stdio.h>#include <string.h>#include <stdlib.h>int main(){int k;scanf("%d", &k);char cnt[200] = { 0, };scanf("%s", cnt);int len = strlen(cnt);int num = (len + k - 1) / k;char** arr = (char**)malloc(num * sizeof(char*));for (int i = 0; i < num; i++) {arr[i] = (char*)malloc(k * sizeof(char));}int count = 0;int flag = 0;for (int i = 0; i < num; i++) {if (flag == 0) {for (int j = 0; j < k; j++) {if (count < len)arr[i][j] = cnt[count++];elsearr[i][j] = '\0';}flag = 1;}else if (flag == 1) {for (int j = k - 1; j >= 0; j--) {if (count < len)arr[i][j] = cnt[count++];elsearr[i][j] = '\0';}flag = 0;}}for (int i = 0; i < k; i++) {for (int j = 0; j < num; j++) {printf("%c", arr[j][i]);}}for (int i = 0; i < num; i++) {free(arr[i]);}free(arr);return 0;}cs 문제 설명
주어진 문자열을 특정 열의 개수 K에 따라 암호화하고, 다시 원래 문자열로 복구하는 문제입니다. 암호화 방법은 주어진 열의 개수 K에 따라 표를 채우고, 특정 방향으로 읽어 원래 문자열을 구성하는 것입니다.
코드 해석
- k를 입력 받아서 열의 개수로 설정합니다.
- 암호화된 문자열인 cnt를 입력 받습니다.
- 암호화된 문자열의 길이인 len을 계산합니다.
- 행의 개수 num을 계산합니다. num은 (len + k - 1) / k로 계산되며, 열의 개수 K에 따라 생성될 행의 개수를 의미합니다.
- num 개수만큼의 행을 가지고, 각 행마다 k 개수만큼의 열을 가지는 2차원 문자열 배열 arr을 동적으로 할당합니다.
- 암호화된 문자열을 주어진 규칙에 따라 복구합니다. 먼저, flag를 사용하여 왼쪽에서 오른쪽, 오른쪽에서 왼쪽으로 문자를 배치합니다. flag가 0일 때는 왼쪽에서 오른쪽으로 문자를 배치하고, 1일 때는 오른쪽에서 왼쪽으로 문자를 배치합니다.
- 원래의 문자열을 출력하기 위해 각 열에 대해 행을 순서대로 읽어와 문자를 출력합니다.
- 할당한 동적 메모리를 해제하여 메모리 누수를 방지합니다.
문제 해결 방법
- 주어진 암호화된 문자열 cnt와 열의 개수 k를 이용하여 원래의 문자열을 복구합니다.
- 열의 개수 k를 이용하여 행과 열을 설정하고, 암호화된 문자열을 특정 방식으로 배열에 배치합니다.
- 배치된 문자열을 순서대로 읽어와 원래의 문자열을 구성합니다.
- 구성된 원래의 문자열을 출력하여 문제를 해결합니다.
'c c++ 언어 공부' 카테고리의 다른 글
백준 2522번 : 별 찍기 - 12 (C 언어) (1) 2023.10.04 백준 2506번 : 점수계산 (C 언어) (0) 2023.10.04 백준 1940번 : 주몽 (C 언어) (0) 2023.09.28 백준 14489번 : 치킨 두 마리 (...) (C 언어) (0) 2023.09.28 백준 1284번 : 집 주소 (C 언어) (0) 2023.09.27