Python

파이썬 자료구조 알고리즘 2차원 배열, 색종이 문제

monster route 2024. 7. 29. 05:37

 

자료구조 알고리즘 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