본문 바로가기

코드업

코드업 1505. 2차원 배열 채우기 3(달팽이 배열)

출처 

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

 

2차원 배열 채우기 3(달팽이 배열)

n이 입력되면 크기가 n인 다음과 같은 2차원 배열을 출력하시오. 입력 예) 3 출력 예) 1 2 3 8 9 4 7 6 5

codeup.kr

n이 입력되면 크기가 n인 다음과 같은 2차원 배열을 출력하시오.

 

입력

예) 3

 

출력

예)

1 2 3

8 9 4

7 6 5

 

입력

2차원 배열의 크기 n이 입력된다.(n<=50)

 

출력

크기가 n인 달팽이 배열을 출력한다.(설명참조)

 

입력 예시 

2

 

출력 예시

1 2

4 3

 

문제풀이

 

일단 난 2차원 배열에 매우 취약하다.

for문이 2개 이상 나온 순간 부터 머리가 잘 안돌아감.. 

후.  달팽이 매우 화나는 문제였다 ㅋㅋㅋ 이걸 내가 왜 알아야 되나 싶고..

 

규칙찾는 것이 먼저라 생각해서 열심히 고민을 했다 

규칙을 찾음 -> 코드 구현을 못함 -> 절망.. 절망.  (끙끙댐의 연속)

 

일단 내가 찾은 규칙

1. 행증가, 열증가, 행감소, 열감소 4개의 순서로 배열의 값이 완성이 된다는 것

2. 행이 채워지면 반복문 도는 횟수가 1씩 줄어든다는 것 

 

처음에 1, 2, 3 의 숫자가 채워지면(행증가) , 반복문 횟수-1 -> 그 다음 4,5 가 채워지고(열증가)

그다음 6,7(행감소) -> 반복문 횟수 -1 -> 8(열감소) , 그다음 9 (행증가) 

이렇게 마지막 값을 채우면 반복문이 끝난다. 

 

무튼 행과 열을 나눠서 생각 하니까 코드 구현이 더 쉬운 것 같다.

 

처음에도 while문과 for문을 이용했는데,

행과 열을 한꺼번에 구현 하려다 보니 더 어려웠던 것 같음

 

앞으로도 이렇게 나눠 생각하면 좀 더 접근이 쉬울듯 하다

 

다음에 다시 한번 더 풀어봐야징 

사실 이것도 다시 푸는건데 저번에 풀었던 방법이 기억 안나서 다른방법으로 푼 건 함정..

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
a= int(input())
arr = [[0 for _ in range(a)] for _ in range(a)]
 
= 0 # i열
= -1 # j행
count = 0 #배열에 들어가는 숫자
sw= 1 #행증가, 열증가, 행감소, 열감소에 사용됨
= a #반복문 도는 횟수 
while count<a*a: #배열에 숫자가 다 채워지면 종료 
 
    for _ in range(p): #p만큼 반복문을 돈다
        count +=1
        j+=sw
        arr[i][j] = count 
    p = p-1 
   # 행이 변할때, 이 for문이 끝나면 p값 1 감소
    
    for _ in range(p):
        count+= 1
        i = i+sw
        arr[i][j] =count 
    sw *= -1
   #행증가,열증가가 끝나면 감소시켜야하므로 sw에 -1을 곱해준다
 
#출력
for i in range(a):
    for j in range(a):
        print(arr[i][j], end =' ')
   print()