출처
https://codeup.kr/problem.php?id=1505
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)]
i = 0 # i열
j = -1 # j행
count = 0 #배열에 들어가는 숫자
sw= 1 #행증가, 열증가, 행감소, 열감소에 사용됨
p = 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()
|
'코드업' 카테고리의 다른 글
코드업 1509. (2차원배열) 진격 후 결과 (0) | 2020.02.24 |
---|---|
코드업 1916. (재귀함수) 피보나치 수열 (Large) (0) | 2020.02.24 |