Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 웨이브 패턴으로 문자열 출력하는 방법


이 문제에서는 하나의 문자열과 정수 n이 주어집니다. 우리의 과제는 주어진 문자열을 n줄에 걸친 웨이브 패턴(wave pattern) 형태로 출력하는 것입니다.

문제 이해하기

예시를 통해 문제를 살펴보겠습니다.

입력: Tutorial, n = 3
출력:
T         r
  U    o   i   s
   t       l

접근 방법

웨이브 패턴은 다음과 같은 규칙으로 만들 수 있습니다.

  • 문자열의 각 문자를 한 글자씩 순서대로 출력하되, 다음 문자는 오른쪽으로 한 칸 이동한 위치에 배치합니다.
  • 첫 번째 줄부터 시작해 n번째 줄까지 아래 방향으로 진행합니다.
  • n번째 줄에 도달하면 방향을 바꿔 첫 번째 줄까지 위로 진행합니다.
  • 문자열의 모든 문자가 배치될 때까지 이 패턴을 반복합니다.

결과적으로 문자가 지그재그(zigzag) 형태로 배치되어 마치 물결 모양처럼 보이게 됩니다.

구현 예제

아래 코드는 위 해결 방법을 C++로 구현한 것입니다.

#include<bits/stdc++.h>
using namespace std;
void printWavePattern(string s, int n) {
   if (n==1) {
      cout<<s;
      return;
   }
   int len=s.length();
   char a[len][len]={ };
   int row=0;
   bool down;
   for (int i=0; i<len; i++) {
      a[row][i]=s[i];
      if (row==n-1)
         down=false;
      else if (row==0)
         down=true;
         (down)?(row++):(row--);
   }
   for (int i=0; i<n; i++) {
      for (int j=0; j<len; j++) {
         cout<<a[i][j]<<" ";
      }
      cout<<endl;
   }
}
int main() {
   string str = "TutorialsPoint";
   int n = 4;
   cout<<n<<" Line wave pattern '"<<str<<"' is:\n";
   printWavePattern(str, n);
}

코드 동작 원리

  1. 예외 처리: n이 1이면 웨이브를 만들 필요가 없으므로 문자열을 그대로 출력하고 종료합니다.
  2. 2차원 배열 선언: 문자열 길이만큼의 2차원 문자 배열을 만들어 각 문자가 놓일 위치를 저장합니다.
  3. 방향 추적: 현재 행(row)과 진행 방향(down) 플래그를 사용해 문자를 배치합니다.
  4. 방향 전환: row가 마지막 줄(n-1)에 도달하면 down을 false로, 첫 줄(0)에 도달하면 true로 설정하여 위아래 방향을 전환합니다.
  5. 패턴 출력: 마지막으로 2차원 배열을 행 단위로 순회하며 웨이브 패턴을 화면에 출력합니다.

문자열의 각 문자를 한 번씩만 처리하므로 배치 연산의 시간 복잡도는 O(N)(N은 문자열 길이)이고, 최종 출력 단계는 O(N·n)입니다.

출력 결과

4 Line wave pattern 'TutorialsPoint' is −
T   a   n
u  i l   i t
t   r   s o
   o   P