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

Python 64제] N*N의 홀수 마방진 프로그램을 작성하시오.

by 건티 2022. 4. 20.
728x90

출처] 반크_세계유산 고인돌

 

문제]

임의의 정수 N을 입력하여 N*N의 홀수마방진 프로그램을 작성하시오.

조건)
▶ N은 3<=N<20 범위이다.
 범위 또는 짝수를 입력하면 에러 메세지를 띄우고 다시 입력한다.
 첫번째 행의 중간 열에 1을 채운다.
 증가값이 N으로 나눈 나머지가 1이면 행만 증가하여 증가값을 채운다.
 그외 행은 1감소하고 열은 1증가한 위치에 증가값을 채운다.
 행이 첫번째 행보다 작으면 행은 N번째 행으로 한다.
 열이 N번째 열보다 크면 열은 첫번째 열로 정한다.

 

입력 예시1)

3~20사이의 홀수를 입력하시오 : 4

 

출력 예시1)

4은(는) 3~20사이의 짝수입니다.

다시 입력하세요...

 

입력 예시2)

3~20사이의 홀수를 입력하시오 : 50

 

출력 예시2)

50은(는) 3~20사이의 범위를 벗어난 수입니다.

다시 입력하세요...

 

입력 예시3)

3~20사이의 홀수를 입력하시오 : 5

 

출력 예시2)

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

 

참고풀이]

#임의의 정수를 입력한다.
while True:
    N=int(input("3~20사이의 홀수를 입력하시오 : "))
    if 3<=N<20:
        if N%2==1:
            break
        else:
            print(f"{N}은(는) 3~20사이의 짝수입니다.")
    else:
        print(f"{N}은(는) 3~20사이의 범위를 벗어난 수입니다.")
    print("다시 입력하세요...\n")

#홀수 마방진 구하기
#N*N의 리스트를 선언하고 초기값을 0으로 셋팅한다.
L=[[0 for j in range(N)] for i in range(N)]

#첫번째행, 중간열에 1을 채운다.
r=0
c=N//2
cnt=1
L[r][c]=cnt

while True:
    cnt+=1
    #증가값이 입력수N*N보다 크면 작업을 끝낸다.
    if cnt>N*N: break
    #증가값이 N으로 나눈 나머지가 1이면 행만 1증가하고
    #아니면 행은 1감소, 열은 1증가한다.
    if cnt%N==1:
        r+=1
    else:
        r-=1
        c+=1
    #행이 첫번째 행보다 작으면 행을 N번째 행으로 정한다.
    if r<0: r=N-1
    #열이 N번째 열보다 크면 열을 첫번째 열로 정한다.
    if c>N-1: c=0
    
    #리스트의 행열위치에 증가값을 넣는다.
    L[r][c]=cnt
    
#결과출력
for Line in L:
    for su in Line:
        print(f"{su:3}",end='')
    print()

 

 

참고풀이 결과]

 

 

 

 

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

 

반응형

댓글