SWE(4836)_색칠하기

SWE 4836 색칠하기

빨간색으로 색칠한 영역과 파란색으로 색칠한 영역이 겹치는 곳에 대해서 보라색이 된 칸 수를 구하는 문제 구하기

첫째 줄에 테스트 케이스 T가 주어진다. 다음 줄부터 테스트 케이스의 첫 줄에 칠할 영역의 개수 N이 주어진다 그 다음 줄에 왼쪽 위 모서리 인덱스 r1, c1, 오른쪽 아래 모서리 r2와 c2. 색상정보가 주어진다 (color = 1 빨강, color =2 파랑)

아이디어

[10x10] 이차원 리스트 2개 준비한다. 하나는 입력 값 담을 리스트 -> 0으로 초기화 하나는 결과 리스트 -> 1로 초기화

  1. 입력 값 담을 리스트 1로 넣고
  2. 결과 리스트를 1로 초기화한 뒤
  3. 각 요소 비교해서 &연산 해주고
  4. 이후에 들어오는 것들도 다 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)))


알게된 사실

  1. 2차원 리스트를 1차원 리스트에 튜플을 넣는 것으로도 풀 수 있고
  2. red_list와 blue_list의 구분은 if문을 써서 구분 ( 너무 잘하려고 하면 어려워진다.)
  3. 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/

0%