티스토리 뷰

728x90
반응형

문제

 

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 

이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 

이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

 

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

 

입력

 

첫째 줄에 색종이의 수가 주어진다.

이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다.

색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고,

두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다.

색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다.

 

출력

 

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

 

풀이

 

풀이방식은 자바때와 동일하다. 넓이가 10000인 이차원 평면을 길이가 10000이며 0으로 채워진 일차원 리스트로 매핑한 후

 

색종이가 주어지는 곳의 값을 1로 교체한다.

 

이제 와서 다시 코드를 보니 살짝 가독성이 떨어지는 느낌도 있지만,

 

할 수 있다면 문제의 차원을 낮추거나 높여서 단순화시키는 건 내가 배운 오랜 전통이기도 하니까.

 

그럼에도 굳이 이 문제를 다시 가져온 이유는 자바 리스트의 초기화와 for문에 대해 새로 배운 것이 있기 때문이다.

 

코드를 보면 리스트의 초기값과 길이를 정해 초기화하고, for문의 선언도 range(시작값, 종료값+1, 증가(감소) 값)으로 해보았다.

import sys

area = [0 for i in range(10000)] # 0으로 채운 길이 10000의 일차원 리스트

n = int(sys.stdin.readline())

for i in range(n):
    x, y = map(int, sys.stdin.readline().split())
    z = 100 * y + x # 좌표 역시 일차원 매핑
    for j in range(z, z + 1000, 100):
        for k in range(10):
            area[j + k] = 1

print(area.count(1))
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함