SWE 4836 색칠하기
빨간색으로 색칠한 영역과 파란색으로 색칠한 영역이 겹치는 곳에 대해서 보라색이 된 칸 수를 구하는 문제 구하기
첫째 줄에 테스트 케이스 T가 주어진다. 다음 줄부터 테스트 케이스의 첫 줄에 칠할 영역의 개수 N이 주어진다 그 다음 줄에 왼쪽 위 모서리 인덱스 r1, c1, 오른쪽 아래 모서리 r2와 c2. 색상정보가 주어진다 (color = 1 빨강, color =2 파랑)
아이디어
[10x10]
이차원 리스트 2개 준비한다.
하나는 입력 값 담을 리스트 -> 0으로 초기화
하나는 결과 리스트 -> 1로 초기화
- 입력 값 담을 리스트 1로 넣고
- 결과 리스트를 1로 초기화한 뒤
- 각 요소 비교해서 &연산 해주고
- 이후에 들어오는 것들도 다 1 넣어주고 & 연산을 반복한다.
-> 빨강이랑 파랑 뿐만 아니라 n개의 영역이 주어지네 -> 빨강 2개 파랑 1개 이렇게 들어올 수도 있다.
결국 다른 블로그 참조 => 해당 블로그는 이차원 리스트를 사용하지 않고, 튜플을 만들어서 일차원 리스트에 넣어줌
코드
T = int(input()) # testCase
for tc in range(1, T+1):
list_cnt = int(input()) # ListCount
red_list = []
blue_list = []
for i in range(list_cnt):
r1, c1, r2, c2, color = map(int, input().split())
for k in range(r1, r2+1):
for l in range(c1, c2+1):
if color == 1:
red_list.append((k, l))
elif color == 2:
blue_list.append((k, l))
result = []
if len(red_list) >= len(blue_list):
for i in blue_list: # blue_list의 요소 중 한개가
if i in red_list: # red_list에도 있다면 ? 이렇게도 쓸 수 있단 걸 배움
result.append(i)
else:
for i in red_list:
if i in blue_list:
result.append(i)
print("#%s %d" % (tc, len(result)))
알게된 사실
- 2차원 리스트를 1차원 리스트에 튜플을 넣는 것으로도 풀 수 있고
- red_list와 blue_list의 구분은 if문을 써서 구분 ( 너무 잘하려고 하면 어려워진다.)
- for i in blue_list에서 가져온 i를 if문에 그대로 적용해서 if i in red_list, red_list에 있는지 물어볼 수도 있다.
-> 3번에서 배운, for문과 if문에서 i라는 같은 요소를 활용해서 같은 게 있는지 판단하는 건 파이썬이기에 가능했던 접근 방법.
참고자료
[참고한 블로그]https://tothefullest08.github.io/algorithm/2019/03/05/5_4836_%EC%83%89%EC%B9%A0%ED%95%98%EA%B8%B0/