ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 자료구조 알고리즘 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

     

     

     

Designed by Tistory.