※ 저의 풀이가 무조건적인 정답은 아닙니다.
다른 코드가 좀 더 효율적이고 좋을 수 있습니다.
다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.
문제 주소입니다.
https://codeup.kr/problem.php?id=1510
1. 문제
2. 문제 해석
3. 소스 코드
문제
마방진(magic square)이란 가로, 세로, 대각선의 합이 같은 사각형을 말한다. 홀수 n 을 입력으로 받아 n * n 홀수 마방진을 구하고자 한다. 구현 방법은 1. 시작은 첫 행 , 중간 열 에서 1 을 두고 2. 행을 감소, 열을 증가하면서 순차적으로 수를 넣어간다. 3. 행은 감소하므로 행이 첫 행보다 작아지는 경우는 행은 마지막 행으로 넘어간다. 4. 열은 증가하므로 열이 끝 열을 넘어가는 경우 열은 첫 열로 넘어간다. 5. 테이블에 들어간 수가 n 의 배수이면 행만 증가(열은 변화없음) |
입력
홀수 n이 입력된다.(n<=49) |
출력
위의 조건을 토대로 크기가 n인 마방진을 출력한다. |
입력 예시
3 |
출력 예시
8 1 6 |
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;
}
|
'코딩테스트 > 코드업' 카테고리의 다른 글
진격 후 결과 C++(1509)[코드업, codeup] (0) | 2020.01.07 |
---|---|
나도 IQ 150 C++(1508)[코드업, code up] (0) | 2020.01.06 |
여러 개씩 묶어 작은 값 골라 배열 만들기 5-7 C++(1498)[코드업, code up] (0) | 2019.12.27 |
2차원 차이 배열 만들기 5-4 C++(1495)[코드업, Code up] (0) | 2019.12.26 |
1차원 차이 배열 만들기 5-3 C++(1494)[코드업, codeup] (0) | 2019.12.25 |
댓글