2차원 배열 활용 2

2022. 11. 3. 17:37파이썬(Python)

반응형

Q) 대각선으로 숫자 채우기

- 자연수 n, m 입력

- n*m 크기의 배열에 숫자를 1부터 1씩 증가시켜 대각선 방향으로 숫자를 채우기

 

결과

>> 3 4
1 2 4 7 
3 5 8 10
6 9 11 12
n,m=map(int,input().split())
arr=[[0 for _ in range(m)] for _ in range(n)]

num=1
for i in range(m):
    j=0
    while True:
        arr[j][i]=num
        num+=1
        j+=1
        i-=1
        if i<0 or i>m-1 or j<0 or j>n-1: break
    
for i in range(1,n):
    j=m-1
    while True:
        arr[i][j]=num
        num+=1
        i+=1
        j-=1
        if i<0 or i>n-1 or j<0 or j>m-1: break

for i in arr:
    for j in i:
        print(j,end=' ')
    print()

- 모든 원소가 0인 n*m의 배열을 생성

- num : 배열에 들어갈 숫자

- 대각선의 방향은 왼쪽 아래.

- 대각선의 시작점을 2가지로 생각.

- 1. 1번째 행에서 시작할 경우

- 2. 1번이 끝나면 (1번째 행의 원소가 생성되면) m번째 열에서 시작할 경우

 

1. 1번째 행에서 시작할 경우

- 시작점을 기준으로 while을 통해 행은 1 증가하고 열은 1 감소하여 숫자를 1 증가해서 원소를 삽입

- 만약 격자점을 벗어나면 while을 break.

- 다음 열로 이동해서 위와 같은 과정 반복

- arr [0][m-1]까지 과정을 수행

 

2. 1번이 끝나면 (1번째 행의 원소가 생성되면) m번째 열에서 시작할 경우

- 1이 끝나면 m-1열 2행부터 while 수행.

- while 과정은 1번과 같음 (행 1 증가, 열 1 감소, 숫자 1 증가 삽입. 범위 벗어나면 break)

- arr [n-1][m-1]까지 완료되면 프로그램 종료


Q) 지그재그 반대로 채우기

- 자연수 n, m을 입력

- n*m 크기의 배열에서 arr [n-1][m-1]이 1이면서 거꾸로 된 지그재그 형태로 출력

 

결과

>> 4 5
20 13 12 5 4 
19 14 11 6 3
18 15 10 7 2
17 16 9 8 1

 

n,m=map(int,input().split())

arr=[[0 for _ in range(m)] for _ in range(n)]

cnt,num=1,1

for i in range(m-1,-1,-1):
    if cnt%2==1:
        for j in range(n-1,-1,-1):
            arr[j][i]=num
            num+=1
    else:
        for j in range(n):
            arr[j][i]=num
            num+=1
    cnt+=1

for i in arr:
    for j in i:
        print(j,end=' ')
    print()

- cnt : 행을 증가 또는 감소할 것 인지 판별

- num : 배열에 삽입할 원소

- 시작점 1은 arr [n-1][m-1]부터 시작 (num=1, cnt=1)

- num을 1 증가하면서 행을 증가시키며 숫자를 삽입. (1번째 행까지)

0 0 0 0 4
0 0 0 0 3
0 0 0 0 2
0 0 0 0 1

- 열 1개를 채우면 열을 1 감소하면서 cnt를 1 증가 (cnt=2)

- 행을 1 증가하면서 num을 1 증가하여 배열에 num을 삽입

0 0 0 5 4
0 0 0 6 3
0 0 0 7 2
0 0 0 8 1

- 따라서 cnt가 홀수이면 행을 감소하며 원소를 삽입.

- cnt가 짝수이면 행을 증가하며 원소를 삽입.

- 위 과정을 반복

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

Q) 파스칼의 삼각형

- 자연수 n을 입력

- 행이 n인 파스칼 삼각형을 출력

- 파스칼 삼각형의 규칙 : (i, j)의 숫자는 (i-1, j-1) 숫자 + (i-1, j) 숫자

- 예) (2, 1)의 수는 3, (2, 2)의 수가 4라면 (3, 2)는 7이다.

 

n=int(input())

arr=[[1 for _ in range(n)] for _ in range(n)]

for i in range(n):
    for j in range(i+1):
        if j==0 or j==i:
            print(arr[i][j],end=' ')
        else:
            arr[i][j]=arr[i-1][j-1]+arr[i-1][j]
            print(arr[i][j],end=' ')
    print()

결과

>> 6
1 
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

 

- n*n 크기모든 원소가 1인 배열을 생성한다.

- 출력은 행이 1일 때 1개 출력

- 그 후로 행이 1 증가할 때, 열의 개수도 1 증가한다.

- 파스칼의 삼각형을 보면 각 행의 첫 번째 원소와 마지막 원소는 항상 1이다.

- 나머지는 파스칼의 성질에 따라 arr [i][j] = arr [i-1][j-1]+arr [i-1][j]을 적용한다.


Q) 번호 표시.

- 자연수 n, m 입력

- n은 격자의 크기 n*n, m은 점의 개수

- m개의 번호 위치를 입력 (r, c)

- 입력한 위치의 순서대로 번호가 부여

- 번호를 격자에 삽입

 

n,m=map(int,input().split())
arr=[[0 for _ in range(n)] for _ in range(n)]

num=1
for _ in range(m):
    a,b=map(int,input().split())
    arr[a-1][b-1]=num
    num+=1

for i in arr:
    for j in i:
        print(j,end=' ')
    print()

결과

>> 3 3
>> 1 3
>> 2 1
>> 3 2

0 0 1
2 0 0
0 3 0

 

- 모든 원소가 0인 n*n 크기의 배열을 생성

- num은 배열에 들어갈 숫자

- 위치를 입력하면 각각의 행과 열에 1을 빼서, 배열의 행과 열에 맞는 위치에 값을 저장

- 값을 저장한 후, num은 1 증가


 

'파이썬(Python)' 카테고리의 다른 글

문자열 문제 풀이  (0) 2022.11.08
문자열  (0) 2022.11.03
2차원 배열 활용  (0) 2022.10.28
2차원 배열  (0) 2022.10.26
리스트 최대 최소 2  (0) 2022.10.25