이 문제에서는 일련의 문자인 문자열이 제공됩니다. 그리고 지그재그 패턴의 길이가 주어지고 이 지그재그 문자열의 연결 문자열을 n 행으로 인쇄해야 합니다.
개념을 더 잘 이해할 수 있도록 몇 가지 예를 살펴보겠습니다.
예
Input : string = ‘STUVWXYZ’ n = 2. Output : SUWYTVXZ
설명 - 2행 패턴의 문자열에 대한 지그재그 패턴은 -
S U W Y T V X Z
이 지그재그 패턴의 연결은 -SUWYTVXZ입니다.
예시
Input : string = ABCDEFGH n = 3 Output: ADGBEHCF
설명 - 3행 문자열의 지그재그 패턴은 -
A E B D F H C G
지그재그 패턴의 연결은 - AEBDFHCG입니다.
이제 문제를 알았으므로 이에 대한 솔루션을 설계해 보겠습니다. 여기서 우리는 죽음이 n이 될 때까지 문자열의 아래 및 다음 요소를 전파할 것입니다. 그런 다음 죽음이 0이 될 때까지 일어났다가 다시 내려갑니다. 그런 다음 솔루션에 대한 각 행을 인쇄하십시오.
이 개념을 바탕으로 문제를 해결할 수 있는 알고리즘을 도출해 보겠습니다.
알고리즘
Step 1 : Take an array of string of size n, string arr[n], row for current row no. i.e. string in the array and the direction as 1(indicating downward traversal). Step 2 : Traverse the string and follow step 3 - 7. For every character of the string. Step 3 : Append the character to the current string in the array based on the value of row. Step 4 : If row = n-1, direction = 1. Step 5 : if row = 0, direction = -1. Step 6 : if direction = 1, row++ . Step 7 : else row--. Step 8 : print all string on the array from 0 to n-1 in sequence.
예시
이제 이 알고리즘을 기반으로 솔루션을 구현하는 프로그램을 만듭니다.
#include<bits/stdc++.h> using namespace std; void ZigZagConcatenationString(string str, int n){ if (n == 1){ cout << str; return; } int len = str.length(); string arr[n]; int row = 0; int direction = 1; bool down; for (int i = 0; i < len; ++i){ arr[row].push_back(str[i]); if (row == n-1) direction = -1; else if (row == 0) direction = 1; (direction == 1)? (row++): (row--); } for (int i = 0; i < n; ++i) cout << arr[i]; } int main(){ string str = "ABCDEFGH"; int n = 3; ZigZagConcatenationString(str, n); return 0; }
출력
AEBDFHCG