코딩테스트/코드업

홀수 마방진 C++(1510)[코드업,code up]

멍토 2020. 1. 8.

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀 더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소입니다.

https://codeup.kr/problem.php?id=1510

 

홀수 마방진

마방진(magic square)이란 가로, 세로, 대각선의 합이 같은 사각형을 말한다. 홀수 n 을 입력으로 받아 n * n 홀수 마방진을 구하고자 한다. 구현 방법은 1. 시작은 첫 행 , 중간 열 에서 1 을 두고 2. 행을 감소, 열을 증가하면서 순차적으로 수를 넣어간다. 3. 행은 감소하므로 행이 첫 행보다 작아지는 경우는 행은 마지막 행으로 넘어간다. 4. 열은 증가하므로 열이 끝 열을 넘어가는 경우 열은 첫 열로 넘어간다. 5. 테이블에 들어간

codeup.kr

 


1. 문제

2. 문제 해석

3. 소스 코드


문제

마방진(magic square)이란 가로, 세로, 대각선의 합이 같은 사각형을 말한다.

홀수 n 을 입력으로 받아 n * n 홀수 마방진을 구하고자 한다.

구현 방법은

1. 시작은 첫 행 , 중간 열 에서 1 을 두고

2. 행을 감소, 열을 증가하면서 순차적으로 수를 넣어간다.

3. 행은 감소하므로 행이 첫 행보다 작아지는 경우는 행은 마지막 행으로 넘어간다.

4. 열은 증가하므로 열이 끝 열을 넘어가는 경우 열은 첫 열로 넘어간다.

5. 테이블에 들어간 수가 n 의 배수이면 행만 증가(열은 변화없음)

입력

홀수 n이 입력된다.(n<=49)

출력

위의 조건을 토대로 크기가 n인 마방진을 출력한다.

입력 예시

3

출력 예시

8 1 6 
3 5 7 
4 9 2 


2. 문제풀이

배열에 데이터를 넣은후에

n의 배수인지 판단하여 배수라면 행을 증가시키고

행감소 혹은 열증가를 실행하지 않고 반복문을 다시돌립니다.

행이 0보다 작다면 n만큼 더해주고

y가 n보다 크거나 같다면 n만큼 빼줍니다.


3. 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
using namespace std;
 
int main() {
    int arr[50][50]{ 0 }, n, count = 0;
    cin >> n;
    //첫행에 열은 중간
    int x = 0, y = n / 2;
    for (int i = 0; i < n * n; i++) {
        count++;
        //x가 음수로 내려간다면 윗행으로
        if (x < 0)    x += n;
        //열이 우측으로 넘어갔다면 첫열로
        if (y >= n)    y -= n;
        arr[x][y] = count;
        //n의 배수라면 행증가
        if (count % n == 0) {
            x++;
            continue;
        }
        //행감소 열증가
        x--;
        y++;
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << arr[i][j] << " ";
        cout << endl;
    }
    return 0;
}

댓글

💲 광고입니다.