coding test

[파이썬] 4836. 색칠하기

잔망루피 2021. 1. 6. 16:12

swexpertacademy.com/main/learn/course/lectureProblemViewer.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.


그림과 같이 인덱스가 있는 10x10 격자에 빨간색과 파란색을 칠하려고 한다.

N개의 영역에 대해 왼쪽 위와 오른쪽 아래 모서리 인덱스, 칠할 색상이 주어질 때, 칠이 끝난 후 색이 겹쳐 보라색이 된 칸 수를 구하는 프로그램을 만드시오.

주어진 정보에서 같은 색인 영역은 겹치지 않는다.


예를 들어 2개의 색칠 영역을 갖는 위 그림에 대한 색칠 정보이다.

2

2 2 4 4 1  ( [2,2] 부터 [4,4] 까지 color 1 (빨강) 으로 칠한다 )

3 3 6 6 2 ( [3,3] 부터 [6,6] 까지 color 2 (파랑) 으로 칠한다 )

 

[입력]
 

첫 줄에 테스트 케이스 개수 T가 주어진다.   ( 1 ≤ T ≤ 50 )

다음 줄부터 테스트케이스의 첫 줄에 칠할 영역의 개수 N이 주어진다. ( 2 ≤ N ≤ 30 )

다음 줄에 왼쪽 위 모서리 인덱스 r1, c1, 오른쪽 아래 모서리 r2, c2와 색상 정보 color가 주어진다. ( 0 ≤ r1, c1, r2, c2 ≤ 9 )

color = 1 (빨강), color = 2 (파랑)

 

[출력]
 

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

입력 출력
3
2
2 2 4 4 1
3 3 6 6 2
3
1 2 3 3 1
3 6 6 8 1
2 3 5 6 2
3
1 4 8 5 1
1 8 3 9 1
3 2 5 8 2
#1 4
#2 5
#3 7

 

🖼 나의 풀이

 

T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    N=int(input())
    color1=list()		# 빨강
    color2=list() 		# 파랑
    cnt=0
    
    for i in range(N):
        r1, c1, r2, c2, color=map(int, input().split())
        for r in range(r1, r2+1):		# 행
            for c in range(c1, c2+1):		# 열
                 if color == 1 :		# 빨강
                    color1.append((r,c))
                 else:
                    color2.append((r,c))
    
    for i in color1:	
        if i in color2:		# 빨강과 파랑이 겹치는 부분 찾기
            cnt+=1
        
    print('#%d %d' %(test_case, cnt))

 

처음에 r1, c1, r2, c2, color에 입력받을 때 에러가 많이 떴다. 다른사람 풀이를 보니 for문으로 제어하길래 한 색깔씩 처리해야되는 것을 알았다.

for r in range(r1, r2+1): 는 행, for c in range(c1, c2+1): 는 열이다. 색깔에 따라 튜플 형태로 리스트에 추가한다.

반복문이 끝난 후에 빨강과 파랑이 겹치는 부분을 찾는다.

 

🎞 다른사람 풀이

 

TC = int(input())
for tc in range(1, TC+1):
    N = int(input())		# 칠할 영역의 개수
    red_lst = []
    blue_lst = []
    for i in range(N):
        y1, x1, y2, x2, color = map(int, input().split())
        for y in range(y1, y2+1):
            for x in range(x1, x2+1):
                if color == 1:
                    red_lst.append((y,x))
                elif color == 2:
                    blue_lst.append((y,x))

    result = []
    if len(red_lst) > len(blue_lst):
        for i in blue_lst:
            if i in red_lst:
                result.append(i)

    if len(red_lst) < len(blue_lst):
        for i in red_lst:
            if i in blue_lst:
                result.append(i)

    print('#%s %d'%(tc, len(result)))

 

색깔이 겹치는 부분을 찾는 코드가 좀 길다..

red_lst와 blue_lst중 더 짧은 쪽을 선택해서 반복문으로 값을 뽑아낸다. 이 값이 red_lst에 있다면 리스트 result에 추가하고 마지막에 이 길이를 출력한다.

 

 

 

반응형

'coding test' 카테고리의 다른 글

[파이썬] 4839. 이진탐색  (0) 2021.01.07
[파이썬] 4837. 부분집합의 합  (0) 2021.01.06
[파이썬] 4835. 구간합  (0) 2021.01.06
[파이썬] 4834. 숫자 카드  (0) 2021.01.05
[파이썬] 4831. 전기버스  (0) 2021.01.04