-
파이썬 자료구조 알고리즘 2차원 배열, 색종이 문제Python 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
'Python' 카테고리의 다른 글
어제 배운 [백준 1991, 이진 트리 순회] 문제 풀기 (0) 2024.07.31 자료구조 알고리즘, 이진 트리 순회 (0) 2024.07.30 파이썬, 자료구조 알고리즘, array & list (0) 2024.07.25 파이썬, class, Exception, 시간복잡도 공간복잡도, Big-O Notation (2) 2024.07.24 파이썬 자료구조 알고리즘, BFS -> Queue로 구현 (0) 2024.07.23