백준 2563 색종이 (Python)

    문제

    https://www.acmicpc.net/problem/2563


    풀이

    Paper = [[0 for _ in range(101)] for _ in range(101)]
    I = int(input())
    Color_Paper = [list(map(int, input().split())) for _ in range(I)]
    
    for i in Color_Paper:
        for a in range(i[0], i[0] + 10):
            for b in range(i[1], i[1] + 10):
                Paper[a][b] = 1
    
    print(sum([Paper[i].count(1) for i in range(101)]))

    100X100 사이즈의 도화지 2차원 배열을 만들고, 색종이들의 위치를 기반으로 색종이가 있는 부분을 1로 바꾸어 1의 개수를 출력했음.


    삽질

    첫번째 시도

    I = int(input())                            #색종이의 수
    Paper_Arr = [[0, 0] for i in range(I)]      #색종이의 위치 *2차원 정수 배열
    for i in range(I):
        Paper_Arr[i][0], Paper_Arr[i][1] = map(int, input().split())
    Black = 0
    
    for i in range(max([Paper_Arr[a][0] for a in range(I)]) + 10):     #색종이의 세로 정점
        for j in range(max([Paper_Arr[b][0] for b in range(I)]) + 10):     #색종이의 가로 정점
            for k in range(I):
                if Paper_Arr[k][0] <= i >= Paper_Arr[k][0] + 10 and Paper_Arr[k][1] <= j >= Paper_Arr[k][1] + 10:
                    Black += 1
                    break
    
    print(Black)

    이중 for 문으로 무작정 다 확인해봤음.
    내가 실수를 해서 답이 똑바로 안 나왔겠지만, 고치는 과정에서 코드가 너무 비효율적인 것 같아 처음부터 다시 풀기로 했음. (3중 for문 쓰면 밥 혼자 먹어야 한다고 해서 겁먹음)

    두번째 시도

    Paper_Arr = [[0, 0] for i in range(I)]      #색종이의 위치 *2차원 정수 배열
    for i in range(I):
        Paper_Arr[i][0], Paper_Arr[i][1] = map(int, input().split())
    Black = 100 * I
    Black2 = 0
    
    for a, i in enumerate(Paper_Arr):
        for b, j in enumerate(Paper_Arr):
            if j[0] <= i[0] and i[0] >= j[0] + 10:
                Black2 += (10 - abs(i[0] - j[0])) * (10 - abs(i[1] - j[1]))
    
    Black -= int(Black2 / 2)
    print(Black)

    이중 for 문을 사용하되, 계산식을 기반으로 코드를 짜 보았음.
    하우에버! 두 개 이상 겹치는 색종이의 중복 처리나 복잡한 식에 현기증이 나서 엎어버림.

    세번째 시도 (성공)

    Paper = [[0 for _ in range(101)] for _ in range(101)]
    I = int(input())
    Color_Paper = [list(map(int, input().split())) for _ in range(I)]
    
    for i in Color_Paper:
        for a in range(i[0], i[0] + 10):
            for b in range(i[1], i[1] + 10):
                Paper[a][b] = 1
    
    print(sum([Paper[i].count(1) for i in range(101)]))

    그 전까지는 색종이의 좌표를 기반으로 계산했는데, 그냥 빈 2차원 배열에 색종이가 있는 좌표를 표시하는 방식으로 중복을 처리했음.
    이렇게 코드를 짜더라도 100X100이기 때문에 순식간에 처리될듯.
    앞으로는 간단한 문제에 괜히 복잡하게 생각하지 말고 직관적으로 풀이를 해야겠음.

    'Algorithm Study' 카테고리의 다른 글

    백준 9506번 약수들의 합  (0) 2024.02.18
    백준 27433번 팩토리얼 2 - Python  (0) 2024.02.18
    백준 28215번 대피소 - Python  (0) 2024.02.18
    백준 28214번 크림빵 - Python  (0) 2024.02.18
    백준 2745 진법 변환 (Python)  (0) 2024.02.18

    댓글