728x90
# 조건
- 당신은 표 편집 프로그램을 작성하고 있습니다.
- 표의 크기는 50 × 50으로 고정되어있고 초기에 모든 셀은 비어 있습니다.
- 각 셀은 문자열 값을 가질 수 있고, 다른 셀과 병합될 수 있습니다.
- 위에서
r
번째, 왼쪽에서c
번째 위치를 (r
,c
)라고 표현할 때, 당신은 다음 명령어들에 대한 기능을 구현하려고 합니다."UPDATE r c value"
- (
r
,c
) 위치의 셀을 선택합니다. - 선택한 셀의 값을
value
로 바꿉니다.
- (
"UPDATE value1 value2"
value1
을 값으로 가지고 있는 모든 셀을 선택합니다.- 선택한 셀의 값을
value2
로 바꿉니다.
"MERGE r1 c1 r2 c2"
- (
r1
,c1
) 위치의 셀과 (r2
,c2
) 위치의 셀을 선택하여 병합합니다. - 선택한 두 위치의 셀이 같은 셀일 경우 무시합니다.
- 선택한 두 셀은 서로 인접하지 않을 수도 있습니다. 이 경우 (
r1
,c1
) 위치의 셀과 (r2
,c2
) 위치의 셀만 영향을 받으며, 그 사이에 위치한 셀들은 영향을 받지 않습니다. - 두 셀 중 한 셀이 값을 가지고 있을 경우 병합된 셀은 그 값을 가지게 됩니다.
- 두 셀 모두 값을 가지고 있을 경우 병합된 셀은 (
r1
,c1
) 위치의 셀 값을 가지게 됩니다. - 이후 (
r1
,c1
) 와 (r2
,c2
) 중 어느 위치를 선택하여도 병합된 셀로 접근합니다.
- (
"UNMERGE r c"
- (
r
,c
) 위치의 셀을 선택하여 해당 셀의 모든 병합을 해제합니다. - 선택한 셀이 포함하고 있던 모든 셀은 프로그램 실행 초기의 상태로 돌아갑니다.
- 병합을 해제하기 전 셀이 값을 가지고 있었을 경우 (
r
,c
) 위치의 셀이 그 값을 가지게 됩니다.
- (
"PRINT r c"
- (
r
,c
) 위치의 셀을 선택하여 셀의 값을 출력합니다. - 선택한 셀이 비어있을 경우
"EMPTY"
를 출력합니다.
- (
제한사항
- 1 ≤
commands
의 길이 ≤ 1,000 commands
의 각 원소는 아래 5가지 형태 중 하나입니다."UPDATE r c value"
r
,c
는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.value
는 셀에 입력할 내용을 나타내며, 알파벳 소문자와 숫자로 구성된 길이 1~10 사이인 문자열입니다.
"UPDATE value1 value2"
value1
은 선택할 셀의 값,value2
는 셀에 입력할 내용을 나타내며, 알파벳 소문자와 숫자로 구성된 길이 1~10 사이인 문자열입니다.
"MERGE r1 c1 r2 c2"
r1
,c1
,r2
,c2
는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.
"UNMERGE r c"
r
,c
는 선택할 셀의 위치를 나타내며, 1~50 사이의 정수입니다.
"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
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 1182번] 파이썬 - 부분 수열의 합 (0) | 2023.07.24 |
---|---|
[백준 18500번] 파이썬 - 미네랄 2 (0) | 2023.07.19 |
[백준 17837번] 파이썬 - 새로운 게임 2 (0) | 2023.07.13 |
[백준 17780번] 파이썬 - 새로운 게임 (0) | 2023.07.13 |
[백준 10610번] 파이썬 - 30 (0) | 2023.07.09 |