본문 바로가기
프로그램/C++ 1000제

C++ 69제] vector 사용, 원하는 달팽이 수를 만들기

by 건티 2022. 8. 9.
728x90

출처 : 반크_세계유산 창덕궁

 

문제] 

아래와 같이 출력하는 프로그램을 함수를 사용하여 작성하시오.

조건)

▶ 홀수차와 20을 넘지 않도록 입력하시오.

만약, 홀수차 또는 20을 넘어가면 에러메세지를 띄우고 다시 입력하도록 하시오.

계속 작업할지를 물어보도록 하시오.

계속 작업할 지를 물어보는 답변은 y 또는 n만 가능하며 그외는 에러메세지를 띄우고 다시 입력하시오.

n, y는 대소문자 구분없이 작업할 수 있도록 하시오.

 

출력 예)

원하는 수를 입력하시오 : 8

입력수는 조건 20을 넘었거나 짝수를 입력하였습니다.

다시 입력하세요...

원하는 수를 입력하시오 : 25

입력수는 조건 20을 넘었거나 짝수를 입력하였습니다.

다시 입력하세요...

원하는 수를 입력하시오 : 5

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

 

계속하시겠습니까(Y/N)? u

Y/y/N/n이 아닙니다.

다시 입력하세요.

계속하시겠습니까(Y/N)? y

 

원하는 수를 입력하시오 : 3

1 2 3
8 9 4
7 6 5

 

계속하시겠습니까(Y/N)? n

수고하셨습니다.

 

참고풀이]

#include <iostream>
#include <vector>
#include <iomanip> //setw()
#include <string> //toupper()
using namespace std;

int Jari(int j)
{
   int x,y;

   x=0; y=1; 
   while(y<j)
   {
      y*=10;
      x++;
   }
   return x;
}

void DarPeying(int n)
{
   vector<vector<int> > v(n,vector<int>(n,0)); //2차원 벡터를 선언하고 입력수 n*n만큼 0으로 초기화한다.
   int r,c; //행,열변수
   int cnt;//증가값 변수
   int sw;//행열의 방향을 결정하는 변수
   int i;//반복변수
   int nn;//입력수 만큼 작업을 진행할 n의 대체 변수

   c=-1;r=0;sw=1;cnt=0;nn=n;
   while(true)
   {
      //열변환 부분 
      for(i=1;i<=nn;i++)
      {
         c+=sw;
         v[r][c]=++cnt;
      }

      //횟수 결정부분 
      nn--;
      if(nn<1) break;

      //행변환 부분 
      for(i=1;i<=nn;i++)
      {
         r+=sw;
         v[r][c]=++cnt;
      }

      //행열의 방향을 결정한다.
      sw*=-1; 
   }

   //결과 출력
   for(r=0;r<n;r++) 
   {
      for(c=0;c<n;c++)
         cout << setw(Jari(n*n*10)) << v[r][c];
      cout << endl;
   }

   //vector의 size를 0으로 한다.
   vector<vector<int> > ().swap(v);

}

int main()
{
   int N;//임의의 정수입력 변수
   char ch;//계속여부 체크 변수

   while(true) 
   {
      //홀수차와 20을 넘지 않도록 한다. 
      while(true)
      {
         cout << "원하는 수를 입력하시오 : ";
         cin >> N;
         if(N<20 && N%2==1) break;
         cout << "입력수는 조건 20을 넘었거나 짝수를 입력하였습니다.\n";
         cout << "다시 입력하세요...\n";
      }

      //달팽이를 출력한다. 
      DarPeying(N);

      //계속 작업여부를 체크한다.
      cout << endl;
      while(true) 
      {
         cout << "계속하시겠습니까(Y/N)? ";
         cin >> ch;
         if(toupper(ch)=='Y' || toupper(ch)=='N') break;
         cout << "Y/y/N/n이 아닙닙다.\n";
         cout << "다시 입력하세요.\n";
      }
      if(toupper(ch)=='N') break; 
      cout << endl; 
   }
   cout << "수고하셨습니다.\n";

   return 0;
}

 

참고풀이 결과]

 

 

 

 

 

대한민국의 아름다운 영토, 독도의 가을

 

반응형

댓글