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 |