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

C++ 56제] vector 사용, 숫자 마름모를 만드세요.

by 건티 2022. 6. 27.
728x90

출처] 반크_세계유산 석굴암

 

문제]

아래의 조건에 맞게 출력하는 프로그램을 작성하시오.

 

조건)

1. 입력하는 숫자의 범위는 1에서 6까지의 정수로 한다.

2. 조건1이외의 수가 들어오면 범위 밖입니다.”를 출력하고 다시 입력한다.

3. 출력의 형태는 마름모 형태이어야 한다.

4. 결과 출력 후, 계속여부를 물어 N이면 수고하셨습니다.”를 출력 후 끝낸다.

 

출력 예)

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

1~6 범위 밖입니다.

다시 입력하세요.

 

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

        1        
      3   3      
    8   2   8    
  20   5   5   20  
48   12   3   12   48
  28   7   7   28  
    16   4   16    
      9   9      
        5        

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

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

다시 입력하세요.

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

 

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

    1    
  3   3  
8   2   8
  5   5  
    3    

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

수고하셨습니다.

 

 

참고풀이]

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

int main()
{
   vector<vector<int> > v;
   vector<int> vc;
   int r,c;//반복변수 또는 index 행열변수
   int N;//입력변수 
   int n;//증가값 변수
   int r_s,r_e;//행의 시작과 끝 변수
   int c_j,c_g;//열의 증감변수 
   int i;//반복변수 
   char ch;//계속여부 체크 변수

   while(true) 
   {
      //출력할 기준 수를 입력받는다. 
      while(true)
      {
         cout << "원하는 수를 입력하시오 : ";
         cin >> N;
         if(N>=1 && N<=6) break;
         cout << "1~6 범위 밖입니다.\n";
         cout << "다시 입력하세요.\n\n";
      }

      //vector에 0수를 입력한다.
      for(r=0;r<N*2;r++) vc.push_back(0);
      for(r=0;r<N*2;r++) v.push_back(vc);

      //증가값으로 마름모형을 만든다. 
      //1~N까지의 수를 입력한다.
      for(n=r=0;r<N*2;r+=2) v[r][N-1]=++n;

 

      //나머지 곳에 숫자를 넣는다.
      c_j=c_g=N-1;
      r_s=0; r_e=N*2-1;
      for(i=1;i<N;i++)
      {
         c_j++; c_g--;
         r_s++; r_e--;
         for(r=r_s;r<r_e;r+=2)
         {
            v[r][c_g]=v[r-1][c_g+1]+v[r+1][c_g+1];
            v[r][c_j]=v[r-1][c_j-1]+v[r+1][c_j-1];
         }
      }

      //결과출력
      for(r=0;r<N*2;r++)
      {
         for(c=0;c<N*2;c++)
         if(v[r][c]==0) cout << setw(3) << " ";
         else cout << setw(3) << v[r][c];
         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; 
      v.clear();//vector를 깨끗이한다.
      vc.clear();
      cout << endl; 
   }
   cout << "수고하셨습니다.\n";

   return 0;
}

 

참고풀이 결과]

 

 

 

 

 

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

 

반응형

댓글