파이썬 자료구조 알고리즘 2차원 배열, 색종이 문제
자료구조 알고리즘 2차원 배열문제
우재튜터님이 내주신 문제 3개 중.. 어떻게 하나를 못 풀었다..ㅠㅠ
이건 그 중 하나.
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.
먼저 종이에
휴.. 어떻게 시작해야해ㅠㅠㅠ 난 코드보다 생각하고 로직을 세우는 법을 훈련하는게 더 급선무인 것 같다.
결국 마음은 무겁게 양손은 가볍게.. 빈 손으로 스쿼드 출발..
우재튜터님의 설명을 들었다. 나도 튜터님처럼 사고하고 싶다.. 이차 배열 문제였던 만큼.. 도화지를 100*100의 2차 행렬로 생각하고 각 칸을 0으로 초기화 후 시작해야 했다.
숙제가 어려웠다면 이차배열을 연습할 수 있는 예제문제들을 먼저 풀어보라고 하셔서 그것부터 해보려고 한다.
연습문제 1
array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
"""
output
1 2 3
4 5 6
7 8 9
"""
for문으로 빠져나오고 맵으로 문자열로 바꾼다음 공백으로 조인
for i in range(len(array)):
print(' '.join(map(str, array[i])))
실행하면 잘 나옴
1 2 3
4 5 6
7 8 9
과연.... 정답은 뭘까..
정답코드
for i in range(len(array)):
for j in range(len(array[i])):
print(array[i][j], end=" ")
print()
print()를 줄바꿈 기능으로만 쓸 수도 있구나..
연습문제 2
아래 배열의 모든 원소를 제곱한 squared_array 를 만들어 보세요.
# 예제 배열
array = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 제곱한 배열 생성
squared_array = []
"""
output
[1, 4, 9]
[16, 25, 36]
[49, 64, 81]
"""
간단하게 될 것 같은데 왤케 안돼..ㅠㅠ for문의 for문을 줄줄이 사탕처럼 해보고.. 이 방법 저 방법 해보다 안되서 2차배열 검색하다 리스트 컴프리헨션으로 2차원 배열 만드는 법을 보게 됐는데 뭔가 쉽게 될 것 같아서 해봤다. 너무 간단한데.. 이게 될까.. 하는데 이게 됨ㅠ
프린트해서 [[1, 4, 9], [16, 25, 36], [49, 64, 81]] 나오니까 눈물 날 뻔..ㅠ 사실 눈물은 안남. 그냥 잠시 세상을 얻은 기분..
squared_array = []
squared_array = [[x**2 for x in row] for row in array]
# print(squared_array)
for i in squared_array:
print(i)
정답코드
# 예제 배열
array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 제곱한 배열 생성
squared_array = []
for i in range(len(array)):
row = []
for j in range(len(array[i])):
row.append(array[i][j] ** 2)
squared_array.append(row)
# 출력
for row in squared_array:
print(row)
왜이렇게 헷갈리지ㅠ
연습문제 3
다음 2차원 배열의 테두리 원소들만 출력하세요.
# 예제 배열
array = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]
"""
output
1 2 3 4
5 8
9 12
13 14 15 16
"""
휴... 여기서 중간에 6, 7, 10, 11 뺴려고 이것저것 해보다가... 결국 검색해봄..
# 일단 리스트에서 빼고
# row[1][1:3] row[2][1:3] 을 없애나..
for row in range(len(array)):
# print(array[row])
print(' '.join(map(str, array[row])))
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
아.. 프린트할 로우 값을 함수로 정해줄 수 있다는 생각을 왜 못했을까ㅠ... 힌트 얻고 다시 품..😆
def array_edge(row):
# array[1] 일 때
if row == 1:
print(array[row][0],array[row][3]) # 5,8 만 출력해
# array[2] 일 때
elif row == 2:
print(array[row][0],array[row][3]) # 9,12 만 출력해
# 나머지 row들은 정상적으로 출력
else:
print(' '.join(map(str, array[row])))
for i in range(len(array)):
array_edge(i)
실행해보면 테두리만 출력된다.
1 2 3 4
5 8
9 12
13 14 15 16
휴.. 쉽지 않았지만 쉽게 풀었다. 히히
정답은 뭐였을까
정답코드
# 예제 배열
array = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]
# 테두리 원소 출력
rows = len(array)
cols = len(array[0])
# 첫 행 출력
for j in range(cols):
print(array[0][j], end=" ")
print()
# 가운데 행 출력
for i in range(1, rows-1):
print(array[i][0], array[i][cols-1])
# 마지막 행 출력
for j in range(cols):
print(array[rows-1][j], end=" ")
print()
어우 ..
일단 풀었으니까.. 다음문제..
연습문제 4
좌우, 위아래로 경계를 좁혀가며 나선형으로 출력해 보세요.
# 예제 배열
array = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]
"""
output
[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]
"""
음..
이러라고 주신 문제가 아닌거 알지만.. 너무 졸리다..ㅠㅠ
lst = []
lst.extend(array[0][:])
lst.extend(array[1][3:])
lst.extend(array[2][3:])
lst.extend(array[3][::-1])
lst.extend(array[2][0:1])
lst.extend(array[1][:3])
lst.extend(array[2][2:3])
lst.extend(array[2][1:2])
print(lst)
창피하지만.... 나오긴 함...;
[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]
정답코드
# 예제 배열
array = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
]
# 나선형 출력
def spiral_order(matrix):
result = []
while matrix:
result += matrix.pop(0)
if matrix and matrix[0]:
for row in matrix:
result.append(row.pop())
if matrix:
result += matrix.pop()[::-1]
if matrix and matrix[0]:
for row in matrix[::-1]:
result.append(row.pop(0))
return result
# 출력
print(spiral_order(array))
색종이 문제도 풀어야하는데.. 일단 로직만 세워놓고..
색종이 문제 → 2차원 배열문제
1. 일단 도화지를 100*100 짜리 행렬로 생각하고, 칸들을 모두 0으로 만들기
2. 색종이 수 n과 위치 x, y를 입력받고 + 10 해서 좌표값들을 1로 변경
3. 1을 모두 모아 sum 한 후 return