Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 n 행의 지그재그 문자열 연결 인쇄


이 문제에서는 일련의 문자인 문자열이 제공됩니다. 그리고 지그재그 패턴의 길이가 주어지고 이 지그재그 문자열의 연결 문자열을 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