ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [5일차](문제 번호 : 2536, 색종이) 도전
    백준 문제 풀이 2023. 7. 22. 22:41

    1. 문제 요약

    100*100 도화지에 10*10 색종이를 여러 장 붙인다. (겹치게 붙일 수 있다.) 이때, 색종이가 차지하는 넓이를 구하는 프로그램을 구해야한다.

    위와 같은 경우, 넓이는 260이다.

     

    입력은 다음과 같다.

    첫 줄 : 색종이 개수

    다음 줄 : 색종이 위치 ( a, b ) ( a는 색종이의 왼쪽 변과 도화지의 왼쪽 변과의 거리, b는 색종이의 아래쪽 변과 도화지의 아래쪽 변과의 거리)

     

    예시.

    입력

    3
    3 7
    15 7
    5 2

    출력

    260

     


    2. 풀어보기

    100*100의 2차원 리스트를 만들어 0으로 채운 뒤, 입력을 통해 색종이가 차지하는 공간에 해당하는 위치를

    1로 바꾸고, 1의 개수를 총 넓이로써 출력하면 될 것 같았다.

     

    1. 색종이 개수 입력받기

    2. 도화지 2차원 리스트 만들기

    3. 색종이의 시작위치에 따른 인덱스 번호 부여하고, 가로 세로 각각 +9만큼의 인덱스 1로 변경하기

    4. 도화지 리스트에서 1의 개수 세기

     


    3. 코드

    1. 색종이 개수 입력받기

    N = int(input())

    2. 도화지 2차원 리스트 만들기

    paper = [[] for _ in range(100)]
    for i in range(100):
        for _ in range(100):
            paper[i].append(0)

    3. 색종이의 시작위치에 따른 인덱스 번호 부여하고, 가로 세로 각각 +9만큼의 인덱스 1로 변경하기

    for i in range(N):
        a, b = map(int, input().split())
        x, y = a, 90-b
        for j in range(10):
            for k in range(10):
                paper[y+k][x+j] = 1

    세로 부분의 인덱스는 도화지 리스트에서는 아래로 갈수록 뒤의 인덱스이므로,

    도화지 세로길이 - 색종이 세로길이 - 시작위치로써 세로 시작을 계산하였다.

    (100-10-b)


    4. 도화지 리스트에서 1의 개수 세기

    count = 0
    for l in paper:
        count += l.count(1)
    print(count)

    paper.count(1)은 안된다. 왜냐하면, paper는 2차원 리스트이기에 1이라는 요소는 하나도 없기 때문이다.


    4. 개선 방안

    먼저, 도화지 2차원 리스트를 만들 때,

    []가 100개 들어있는 리스트를 만들고,  각 []에 0을 100개 채우는 식으로 진행했었지만,

    [[0] * 100 for _ in range(100)] 와 같은 식을 이용하면 굳이 그러지 않았어도 됐었다.

     

    또한, 목적이 넓이이기에 굳이 세로부분의 인덱스를 반전시켜 정확한 위치를 통한 계산이 필요없었다.

     


    사실, for문을 2-3중으로 쓰고, 스케일이 큰 계산을 해서 시간 초과가 날 줄 알았는데, 나지 않아서 다행이다.

     

Designed by Tistory.