ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Softeer][21년 재직자 대회예선] 이미지 프로세싱
    개발 이야기/알고리즘 및 코테 준비 2024. 9. 23. 16:46

    문제

    https://softeer.ai/practice/6265

     

    Softeer - 현대자동차그룹 SW인재확보플랫폼

     

    softeer.ai

    자율주행 자동차를 구현하는 데에 있어서 이미지 프로세싱은 아주 중요한 요소이다. 카메라를 통해 들어온 차량 전후의 모습을 파악해 차량 근처에 있는 장애물들을 빠른 속도로 파악하고, 이를 다른 센서로부터 들어온 데이터와 함께 분석해 차량에게 올바른 명령을 내려야 하기 때문이다. 이 문제에서는 간단한 이미지 프로세싱을 하고자 한다.

    H×W 크기의 2차원 비트맵 이미지가 있다. 이 이미지는 H×W개의 픽셀들로 구성되어 있으며, 위에서부터 i (1 ≤ i ≤ H)번째에 있고 왼쪽에서부터 j (1 ≤ j ≤ W)번째에 있는 픽셀은 (i, j)로 표기할 수 있다. 각 픽셀에는 색상이 붙어 있으며, 이 색상은 1 이상 109 이하의 정수로 표기할 수 있다. 픽셀 (i, j)의 색을 Ci, j라고 하자. 이 이미지에 아래와 같은 연산을 Q번 수행할 것이다:

    (i, j, c): 픽셀 (i, j)를 고른다. 이 픽셀과 색깔이 같으면서 가로세로로 연결되어 있는 모든 픽셀들을 선택한 뒤, 그 픽셀들의 색을 모두 c로 바꾼다.

    예를 들어 아래와 같은 이미지가 있다고 하자.

     

    이 상황에서 (3,5,3) 연산을 수행해 보자. (3,5) 픽셀은 아래와 같다.

    이 픽셀의 색은 4이므로, 색이 4이면서 (3,5)와 가로세로로 연결되어 있는 픽셀들을 선택하면 아래와 같고, 색을 3으로 바꾸면 다음과 같다. 

     

    제약조건
    1 ≤ H ≤ 128
    1 ≤ W ≤ 128
    모든 i, j (1 ≤ i ≤ H, 1 ≤ j ≤ W) 에 대해:
    1 ≤ Ci, j ≤ 109
    1 ≤ Q ≤ 500

    각 연산 (i, j, c)에 대해:
    1 ≤ i ≤ H
    1 ≤ j ≤ W
    1 ≤ c ≤ 109
    주어지는 모든 수는 정수이다.

    입력형식
    첫 번째 줄에 두 정수 H와 W가 공백 하나를 사이로 두고 주어진다. 다음 H개의 줄에는 각 픽셀의 색상이 주어진다. 이 중 i (1 ≤ i ≤ H)번째 줄의 j (1 ≤ j ≤ W)번째 정수는 Ci, j이다.
    그 다음 줄에는 Q가 주어진다. 다음 Q개의 줄에는 연산들이 순서대로 주어진다. 각 줄에는 세 개의 정수 i, j, c가 공백 하나를 사이로 두고 주어진다.

    출력형식
    모든 연산을 완료한 후, 최종 이미지를 H개의 줄에 W개의 정수를 공백 하나씩을 사이로 두고 출력한다.

    입력예제1
    1 9
    1 1 2 2 2 1 1 2 2
    2
    1 5 1
    1 5 2
    출력예제1
    2 2 2 2 2 2 2 2 2

     

    입력예제2
    7 9
    4 2 3 4 3 2 3 2 3
    2 1 3 4 3 3 4 2 4
    1 3 3 4 4 4 3 2 2
    1 4 4 4 1 4 3 3 3
    1 2 3 4 4 4 4 4 4
    3 1 3 3 3 4 3 3 3
    4 4 1 3 3 4 3 4 3
    1
    3 5 3
    출력예제2
    4 2 3 3 3 2 3 2 3
    2 1 3 3 3 3 4 2 4
    1 3 3 3 3 3 3 2 2
    1 3 3 3 1 3 3 3 3
    1 2 3 3 3 3 3 3 3
    3 1 3 3 3 3 3 3 3
    4 4 1 3 3 3 3 4 3

     

    입력예제3
    7 9
    4 2 3 4 3 2 3 2 3
    2 1 3 4 3 3 4 2 4
    1 3 3 4 4 4 3 2 2
    1 4 4 4 1 4 3 3 3
    1 2 3 4 4 4 4 4 4
    3 1 3 3 3 4 3 3 3
    4 4 1 3 3 4 3 4 3
    4
    3 5 3
    1 9 2
    3 9 3
    3 9 1
    출력예제3
    4 2 1 1 1 2 1 1 1
    2 1 1 1 1 1 4 1 4
    1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1
    1 2 1 1 1 1 1 1 1
    3 1 1 1 1 1 1 1 1

    4 4 1 1 1 1 1 4 1

     

    내 첫 풀이 + 틀린부분 찾기

    1. 우선 bfs 혹은 dfs로 탐색하면서 조건을 확인할것

    2. 이차원 배열을 쓸것 

    이렇게 두 가지 아이디어를 가지고 코드를 작성했다. 

    import sys
    from collections import deque
    
    h, w = map(int, input().split())
    
    # img_array = [list(map(int, input().split())) for _ in range(h)]
    img_array = [[0 for j in range(w)] for i in range(h)]
    
    # 초기화된 img_array에 입력값으로 덮어쓰기
    for i in range(h):
        img_array[i] = list(map(int, input().split()))
        
    Q = int(input())
    
    dx = [0, 0, -1, 1]
    dy = [-1, 1, 0, 0]
    
    for _ in range(Q):
        i, j, c = map(int, input().split())
        i -= 1
        j -= 1
        now = img_array[i][j]
        
        if now == c:
            continue
    
        img_array[i][j] = c
        q = deque()
        q.append((i, j))
        
        while q:
            x, y = q.popleft()
            for k in range(4):
                nx, ny = x + dx[k], y + dy[k]
                if 0 <= nx < h and 0 <= ny < w and img_array[nx][ny] == now:
                    img_array[nx][ny] = c
                    q.append((nx, ny))
    
    for row in img_array:
        print(' '.join(map(str, row)))

     

    여기서 조심해야할 것은 처음 아무생각없이 img_array[i]로 초기화하지 않고 append해서 한동안 에러를 못찾았었다. 

    또 마지막 print .join을 확인하자! 

Designed by Tistory.