728x90

프로그래머스 - 표 병합

# 조건

  • 당신은 표 편집 프로그램을 작성하고 있습니다.
  • 표의 크기는 50 × 50으로 고정되어있고 초기에 모든 셀은 비어 있습니다.
  • 각 셀은 문자열 값을 가질 수 있고, 다른 셀과 병합될 수 있습니다.
  • 위에서 r번째, 왼쪽에서 c번째 위치를 (r, c)라고 표현할 때, 당신은 다음 명령어들에 대한 기능을 구현하려고 합니다.
    1. "UPDATE r c value"
      • (r, c) 위치의 셀을 선택합니다.
      • 선택한 셀의 값을 value로 바꿉니다.
    2. "UPDATE value1 value2"
      • value1을 값으로 가지고 있는 모든 셀을 선택합니다.
      • 선택한 셀의 값을 value2로 바꿉니다.
    3. "MERGE r1 c1 r2 c2"
      • (r1, c1) 위치의 셀과 (r2, c2) 위치의 셀을 선택하여 병합합니다.
      • 선택한 두 위치의 셀이 같은 셀일 경우 무시합니다.
      • 선택한 두 셀은 서로 인접하지 않을 수도 있습니다. 이 경우 (r1, c1) 위치의 셀과 (r2, c2) 위치의 셀만 영향을 받으며, 그 사이에 위치한 셀들은 영향을 받지 않습니다.
      • 두 셀 중 한 셀이 값을 가지고 있을 경우 병합된 셀은 그 값을 가지게 됩니다.
      • 두 셀 모두 값을 가지고 있을 경우 병합된 셀은 (r1, c1) 위치의 셀 값을 가지게 됩니다.
      • 이후 (r1, c1) 와 (r2, c2) 중 어느 위치를 선택하여도 병합된 셀로 접근합니다.
    4. "UNMERGE r c"
      • (r, c) 위치의 셀을 선택하여 해당 셀의 모든 병합을 해제합니다.
      • 선택한 셀이 포함하고 있던 모든 셀은 프로그램 실행 초기의 상태로 돌아갑니다.
      • 병합을 해제하기 전 셀이 값을 가지고 있었을 경우 (r, c) 위치의 셀이 그 값을 가지게 됩니다.
    5. "PRINT r c"
      • (r, c) 위치의 셀을 선택하여 셀의 값을 출력합니다.
      • 선택한 셀이 비어있을 경우 "EMPTY"를 출력합니다.

제한사항

  • 1 ≤ commands의 길이 ≤ 1,000
  • commands의 각 원소는 아래 5가지 형태 중 하나입니다.
    1. "UPDATE r c value"
      • r, c는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.
      • value는 셀에 입력할 내용을 나타내며, 알파벳 소문자와 숫자로 구성된 길이 1~10 사이인 문자열입니다.
    2. "UPDATE value1 value2"
      • value1은 선택할 셀의 값, value2는 셀에 입력할 내용을 나타내며, 알파벳 소문자와 숫자로 구성된 길이 1~10 사이인 문자열입니다.
    3. "MERGE r1 c1 r2 c2"
      • r1, c1, r2, c2는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.
    4. "UNMERGE r c"
      • r, c는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.
    5. "PRINT r c"
      • r, c는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.
  • commands는 1개 이상의 "PRINT r c" 명령어를 포함하고 있습니다.

# 접근 방법

  • 문제에 주어진 함수들을 구현하면 되는 문제이다.
  • 우선, merge와 unmerge 함수가 있기 때문에, 각 표의 인덱스를 관리할 merge 배열과, 값을 관리하는 arr 배열을 사용해준다.
  • UPDATE 함수
    • R C 값을 업데이트하는 경우 merge[r][c] 값 (x, y)를 찾아 arr[x][y] 값을 변경
    • value1 을 value2로 업데이트하는 경우 arr 배열의 val1 값을 모두 val2로 변경
  • MERGE 함수
    • merge[r1][c1] 값 (x1, y1) 과 merge[r2][c2] 값 (x2, y2)를 찾아 (x2, y2) 원소 모두를 (x1, y1)로 변경하고 문제의 조건에 따라 arr값을 변경해준다.
  • unmerge 함수
    • merge와 arr 값을 찾은 후 idx와 temp 에 저장해준다.
    • merge의 값이 위에서 찾아준 idx와 같은 경우에 대해 초기화 시켜준다.
    • arr[r][c] 값을 temp로 변경해준다.
def solution(commands):
    answer = []
    merge = [[(i, j) for j in range(50)] for i in range(50)]
    arr = [['EMPTY' for _ in range(50)] for _ in range(50)]

    for k in commands:
        com = k.split(' ')
        if com[0] == 'UPDATE':
            if len(com) == 4:
                i, j = int(com[1])-1, int(com[2]) -1
                x, y = merge[i][j]
                arr[x][y] = com[3]
            else:
                for i in range(50):
                    for j in range(50):
                        if arr[i][j] == com[1]:
                            arr[i][j] = com[2]
        elif com[0] == 'MERGE':
            x1, y1, x2, y2 = int(com[1])-1, int(com[2])-1, int(com[3])-1, int(com[4])-1
            r1, c1 = merge[x1][y1]
            r2, c2 = merge[x2][y2]
            if arr[r1][c1] == 'EMPTY':
                arr[r1][c1] = arr[r2][c2]
            for i in range(50):
                for j in range(50):
                    if merge[i][j] == (r2, c2):
                        merge[i][j] = (r1, c1)
        elif com[0] == 'UNMERGE':
            r, c = int(com[1])-1, int(com[2]) -1
            x, y = merge[r][c]
            temp = arr[x][y]
            for i in range(50):
                for j in range(50):
                    if merge[i][j] == (x, y):
                        merge[i][j] = (i, j)
                        arr[i][j] = 'EMPTY'
            arr[r][c] = temp
        else:
            i, j = int(com[1]) -1, int(com[2]) -1
            x, y = merge[i][j]
            answer.append(arr[x][y])
    return answer
728x90