CS/알고리즘_문제풀이(파이썬)

colorpaper

Jedy_Kim 2021. 5. 11. 18:27
728x90

문제


평면에 색깔이 서로 다른 직사각형 모양의 색종이 N장이 하나씩 차례로 놓여진다. 이 때 색종이가 비스듬하게 놓이는 경우는 없다. 즉, 모든 색종이의 변은 서로 평행하거나, 서로 수직이거나 둘 중 하나이다. 그림-1은 1번, 2번, 3번 세 장의 색종이가 순서대로 놓인 상태를 보여준다.

그림-1

여기에 그림-2에서 보인 것처럼 4번 색종이가 하나 더 놓이면 3번 색종이는 완전히 가려서 보이지 않게 된다. 그리고, 1번 색종이와 2번 색종이는 부분적으로 가려 보이며, 4번 색종이는 완전히 보이게 된다.

그림-2

N장의 색종이가 주어진 위치에 차례로 놓일 경우, 각 색종이가 보이는 부분의 면적을 구하는 프로그램을 작성하시오.  

입력


입력의 첫 번째 줄에는 색종이의 장수를 나타내는 정수 N (1 ≤ N ≤ 100)이 주어진다. 이어서 N장의 색종이에 관한 입력이 각 색종이마다 한 줄씩 차례로 주어진다. 색종이가 놓이는 평면은 가로 최대 101칸, 세로 최대 101칸으로 구성된 격자 모양이다. 격자의 각 칸은 가로, 세로 길이가 1인 면적이 1인 정사각형이다.

편의상 가로 6칸, 세로 6칸으로 이루어진 격자의 예를 들어 설명하면, 각 칸에 표시된 값 (a,b)는 해당 칸의 번호를 나타낸다. 가장 왼쪽 아래의 칸은 (0,0) 가장 오른 쪽 위의 칸은 (5,5)이다.

색종이가 놓인 상태는 가장 왼쪽 아래 칸의 번호와 너비, 높이를 나타내는 네 정수로 표현한다. 예를 들어, 위 그림에서 회색으로 표시된 색종이는 (1,4)가 가장 왼쪽 아래에 있고 너비 3, 높이 2이므로 1 4 3 2로 표현한다. 색종이가 격자 경계 밖으로 나가는 경우는 없다.

 

출력


입력에서 주어진 순서에 따라 N장의 색종이를 평면에 놓았을 때, 입력에서 주어진 순서대로 각 색종이가 보이는 부분의 면적을 한 줄에 하나씩 하나의 정수로 출력한다. 만약 색종이가 보이지 않는다면 정수 0을 출력한다.

 

예제 입력 

2

0 0 10 10

2 2 6 6

예제 출력

64

36

 

# 런타임 에러...

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
= int(input())
getInfo = [list(map(int, input().split())) for _ in range(N)]
frame = [[-1 for _ in range(100)] for _ in range(100)]
resDic = {}
 
for i in range(N): 
  resDic[i+1= 0
  col = getInfo[i][2+ getInfo[i][0]
  row = getInfo[i][3+ getInfo[i][1]
  for j in range(getInfo[i][1], row):
    for k in range(getInfo[i][0], col): 
      frame[j][k] = i+1
      cnt += 1  
       
  
       
 
for i in range(N):  
  cnt = 0
  for j in range(len(frame)):
    for k in range(len(frame[j])):
      if frame[j][k] == (i+1):
        cnt += 1
  print(cnt)
 
     
 
cs

# 개선된 코드

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
= int(input())
getInfo = [list(map(int, input().split())) for _ in range(n)]
plane = [[0 for _ in range(101)] for _ in range(101)]
count = [0 for _ in range(101)] 
 
for i in range(n):
  # a : 가로, b : 세로, c : 가로길이, d : 세로길이
  a = getInfo[i][0]
  b = getInfo[i][1]
  c = getInfo[i][2]
  d = getInfo[i][3]
  
  for j in range(b, (b+d)): #세로를 의미
    for k in range(a, (a+c)):
      plane[j][k] = i+1
      
# 1의 갯수, 2의 갯수, 3의 갯수,....
for i in range(101):
  for j in range(101):  
    if plane[i][j] > 0:
      count[plane[i][j]] += 1
 
     
for i in range(n):
  print(count[i+1])
cs

 

반응형

'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글

streetree  (0) 2021.05.13
bingo  (0) 2021.05.12
class president  (0) 2021.05.11
attackrange  (0) 2021.05.11
rook  (0) 2021.05.11