내가 생각한 방법: 빨간색의 파란색의 x좌표, y좌표 가져와서 정렬, 빨간색 좌표들 사이 파란색이 끼워져 있으면 빼기? R-B-R-B처럼 퐁당퐁당이면 R-B할건지 B-R 할건지 어떻게 알지? 너무 복잡

결국 gemini hint 예를 들어, 어떤 칸에 빨간색이 칠해졌다는 사실을 그 칸이 기억하게 만들고, 나중에 파란색이 칠해질 때 그 기억을 확인하게 한다면 어떨까요?

디버깅 과정:

  1. 데이터 들어오는 순서 빨간색을 먼저 칠한 경우에도, 파란색 먼저 칠한 경우에도 다 돌아야 함. answer += 1이 든 if문을 파란색 칠할 때 넣어버리면 파란색 먼저 칠하면 답이 안 나옴.

  2. 디커플링 색칠 하면서 answer 변수 바꾸기 보다는 색칠 단계가 모두 끝나고 비교하는 것이 훨씬 안전. 디커플링 후 answer 세는 것은 한 번만!! for문 다 나와서 하기!

  3. 상태 누적: 조건 대신 상태를 보자 서로 다른 값 더해서 더해진 누적값으로 확인. 리팩토링 쉽고 (색이 몇 가지가 되어도 상관 x, 칠해지는 순서 상관 x) 비트 연산자 적용 가능

  4. 극단적인 코너 케이스 생각해 보기


내 답: 디커플링 + 상태 누적 if 잔뜩 써서 분기 나누어야 함, 세면서 자료가 상태 변화하므로 에러 가능성 높음

T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    answer = 0
    arr=[[0]*10 for _ in range (10)]
    #check_list = []
    n=int(input())
    full_list = [list(map(int, input().split())) for _ in range (n)]
    for i in range (n):
        if full_list[i][4] == 1:
            for j in range (full_list[i][2] - full_list[i][0] +1) : # x좌표, +1은 범위 처음 끝 모두 포함이므로
                for k in range (full_list[i][3] - full_list[i][1] +1) : # y좌표
                    if arr[full_list[i][0]+j] [full_list[i][1]+k] == 0:
                        arr[full_list[i][0]+j] [full_list[i][1]+k] = 1
                    #check_list.append ((full_list[i][0]+j, full_list[i][1]+k)) # 빨간 네모 색칠 (이건 튜플 사용)
                    elif arr [full_list[i][0]+j] [full_list[i][1]+k] == 2: # 빨간 네모 색칠 하려는데 파란 네모 색칠 되어 있다면
                        answer += 1  
        elif full_list[i][4] == 2:
            for l in range (full_list[i][2] - full_list[i][0] +1) : # x좌표
                for m in range (full_list[i][3] - full_list[i][1]+1) : # y좌표
                    # 파란 네모 색칠 하려는데 빨간 네모 색칠 되어 있다면 -> 만약 파란 네모가 제일 먼저 나오면 바로 answer에 +1 코드는 안 돈다!
                    if arr[full_list[i][0]+l] [full_list[i][1]+m] == 0:
                        arr[full_list[i][0]+l] [full_list[i][1]+m] = 2
                    if arr [full_list[i][0]+l] [full_list[i][1]+m] == 1: # 파란 네모 색칠 하려는데 빨간 네모 색칠 되어 있다면
                        answer += 1          
    print (f'#{test_case} {answer}')

gemini 도움 답: 디커플링 + 상태 누적 깔끔, 리팩토링 용이 (ex. 새로운 색 추가 그냥 새로운 색 더하기)

T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    answer = 0
    arr=[[0]*10 for _ in range (10)]
    #check_list = []
    n=int(input())
    full_list = [list(map(int, input().split())) for _ in range (n)]
    for i in range (n):
        if full_list[i][4] == 1:
            for j in range (full_list[i][2] - full_list[i][0] +1) : # x좌표, +1은 범위 처음 끝 모두 포함이므로
                for k in range (full_list[i][3] - full_list[i][1] +1) : # y좌표
                        arr[full_list[i][0]+j] [full_list[i][1]+k] += 1
        elif full_list[i][4] == 2:
            for l in range (full_list[i][2] - full_list[i][0] +1) : # x좌표
                for m in range (full_list[i][3] - full_list[i][1]+1) : # y좌표
                        arr[full_list[i][0]+l] [full_list[i][1]+m] += 2
                        
    # [중요] 모든 영역(n개)에 대한 색칠이 '완전히' 끝난 시점 (반복문 밖)
    # for i in range (n): 이 안에 들어가 있으면 새로운 영역을 하나 칠할 때마다 지금까지 만들어진 모든 보라색 칸을 중복해서 세고 있는 것
    for o in range (len(arr)): # n은 이미 위에서 쓰고 있음
        for p in range (len(arr[0])):
                if arr[o][p] == 3:
                        answer += 1          
    print (f'#{test_case} {answer}')

색칠 때 마다 리스트에 튜플 추가해서 푸는 것 보다 용량도 아끼고 상태 누적 편하므로 2중 list array 쓰자