[포스코x코딩온] 스마트 팩토리 과정 3주차 회고 | 프로젝트 1,4번 해설

Dana·2023년 4월 9일
0
post-thumbnail

프로젝트 1. 배스킨라빈스 31게임

<풀이>

#include <cstdlib>
#include <ctime>

int main()
{
    srand(time(NULL));
    while(1) {
    	...
    	num = rand()%3 + 1;
    }
}
  • 컴퓨터가 몇 개의 숫자를 부를지 랜덤으로 생성하는 부분이다.
  • 1~3 중 랜덤으로 생성된다.
int total = 1; //현재까지 부른 수

int baskin_game(int num, int who) //who : 사용자 1 컴퓨터 0
{
    for (int i=0;i<num;i++)
    {
        cout << total++ << endl;
        if(total > 31)
        {
            (who == 1) ? cout << "게임 종료! 컴퓨터의 승리입니다." : cout << "게임 종료! 사용자의 승리입니다.";
            cout << endl;
            return 1;
        }
    }
    return 0;
}
  • 배스킨라빈스 게임을 진행하는 함수이다.
  • 매개변수로 몇 개의 숫자를 부를지, 사용자인지 컴퓨터인지를 받는다.
  • 현재까지 부른 수는 전역변수로 선언해서 관리한다.
  • 31까지 부르고, 32를 부를 차례에 사용자인지 컴퓨터인지를 확인해서 승자를 출력하고 1을 리턴한다.
int main()
{
    int num; //부를 개수
    srand(time(NULL));

    while(1)
    {
        cout << "\n개수를 입력하세요: ";
        cin >> num;
        if (num < 1 || num >3)
        {
            cout << "1~3 사이의 수를 입력하세요" << endl;
            continue;
        }
        cout << "사용자가 부른 숫자!" << endl;
        if (baskin_game(num, 1)==1) return 0;
        cout << "\n컴퓨터가 부른 숫자!" << endl;
        num = rand()%3 + 1;
        if (baskin_game(num, 0)==1) return 0;
    }
}
  • 사용자가 몇 개의 숫자를 부를지 입력받고 baskin_game 함수에 넘겨준다.
  • 컴퓨터가 몇 개의 숫자를 부를지는 랜덤으로 생성하여 baskin_game 함수에 넘겨준다.
  • baskin_game이 1을 리턴하면 0을 리턴해서 프로그램을 종료한다.

프로젝트 4. 마방진 만들기



<풀이>

int main()
{
	int n; //n*n 마방진 
    cout <<"마방진의  혹은 열의 수를 홀수로 입력해주세요 : ";
    cin >> n;
    
    //2차원 동적배열 선언 후 0으로 초기화
    int **magic_square = new int*[n];
    for (i=0;i<n;i++)
    {
        //magic_square[i] = new int[n];
        //0으로 초기화
        magic_square[i] = new int[n] {};
    }
    
    /*for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            magic_square[i][j] = 0;
        }
    }*/
  • n*n마방진을 만들기 위해 사용자에게 n을 입력받는다.
  • n*n 동적배열을 만들고 값을 0으로 초기화한다.
  • 처음에는 동적배열을 만들고 반복문을 돌며 0을 넣었는데, 할당하면서 0으로 초기화할 수 있다.
  • magic_square[n][n]; 정적 배열의 경우 실행 중 사용자에게 입력받은 값(n)으로 만들 수 없다.
	int number = 1; //채워줄 숫자
    
    //1) 1은 첫 행의 가운데에 위치한다.
    int x = 0;
    int y = n/2;
    while (number < n*n)
    {   
        if (x >= 0 && x < n && y >= 0 && y < n) {
            if (magic_square[x][y] != 0) {
                //3) 우상단으로 이동하는 도중 이미 칸이 채워져 있으면 바로 아래 칸에 다음 숫자가 채워진다.
                x += 2;
                y -= 1;
            }
        }
        else if (x==-1 && y==n) {
            //6) 첫번째 행의 마지막 열에서는 우상단으로 이동하는 것이 아니라 바로 아래칸으로 이동
            x += 2;
            y -= 1;
        }
        else if (x==-1 && y<n) {
            //4) 첫번째 행에서 우상단으로 이동할 때는 마지막 행의 다음 열로 이동한다
            x += n;
        }
        else if (x>=0 && y==n) {
            //5) 마지막 열에서 우상단으로 이동할 때는 첫번째 열의 이전 행으로 이동한다
            y -= n;
        }
        //2) 우상단으로 갈수록 숫자가 1씩 늘어난다.
        magic_square[x][y] = number++;
        x -= 1;
        y += 1;
    }
  • 마방진 안에 채워줄 숫자를 1부터 하나씩 증가하면서 n*n이 될때까지 반복문을 통해 값을 채운다.
  • 마방진 규칙을 그대로 구현한다.
  • 이때 우상단은 x-1, y+1을 의미한다.
    //결과 출력
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
        {
            cout << magic_square[i][j] << " ";
        }
        cout << endl;
    }

    //동적 메모리 해제
    for(int i=0;i<n;i++)
    {
        delete[] magic_square[i];
    }
    delete[] magic_square;

}
  • 2차원 배열을 돌며 결과를 출력한다.
  • 동적 메모리를 해제한다.

0개의 댓글