이번 문제는 3단계 같지 않은 문제입니다.
단순하게 생각해서 각각의 셀을 그룹으로 지정합니다.
그리고 각 그룹의 값을 저장하고 있는 딕셔너리를 만듭니다.
그래서 업데이트를 할 경우에는 해당 셀의 그룹을 가져와서 딕셔너리의 값을 업데이트합니다.
merge는 모든 셀 중에서 merge하고자 하는 그룹에 해당하면, 그룹을 대상 그룹으로 업데이트 합니다.
2500 * 1000 이기 때문에 충분히 가능합니다.
unmerge는 그룹에 해당한다면, 새로운 값으로 그룹을 할당해줍니다. 중복되지 않게 하기 위해서 자기 위치에 해당하는 값을 넣어줍니다.
dic = {i : "" for i in range(50*50)}
board = [[j*50 + i for i in range(50)] for j in range(50)]
def solution(commands):
answer = []
for command in commands:
command = list(command.split())
if command[0] == "UPDATE":
if len(command) == 4:
update1(int(command[1])-1, int(command[2])-1, command[3])
else:
update2(command[1], command[2])
elif command[0] == "MERGE":
merge(int(command[1])-1, int(command[2])-1, int(command[3])-1, int(command[4])-1)
elif command[0] == "UNMERGE":
unmerge(int(command[1])-1, int(command[2])-1)
elif command[0] == "PRINT":
answer.append(print2(int(command[1])-1,int(command[2])-1))
return answer
def update1(r, c, value):
dic[board[r][c]] = value
def update2(value1, value2):
for key in dic:
if dic[key] == value1:
dic[key] = value2
def merge(r1, c1, r2, c2):
if board[r1][c1] == board[r2][c2]:
return
if dic[board[r1][c1]] != "":
tmp = board[r2][c2]
for i in range(50):
for j in range(50):
if board[i][j] == tmp:
board[i][j] = board[r1][c1]
else:
tmp = board[r1][c1]
for i in range(50):
for j in range(50):
if board[i][j] == tmp:
board[i][j] = board[r2][c2]
def unmerge(r, c):
group = board[r][c]
tmp_value = dic[group]
for i in range(50):
for j in range(50):
if board[i][j] == group:
board[i][j] = 50*i + j
dic[50*i + j] = ""
dic[board[r][c]] = tmp_value
def print2(r, c):
if dic[board[r][c]] == "":
return "EMPTY"
else:
return dic[board[r][c]]
반응형
'프로그래밍 > 문제풀이' 카테고리의 다른 글
[swea] 4615 재미있는 오셀로 게임 (0) | 2023.05.20 |
---|---|
[프로그래머스] 블록 이동하기 (0) | 2023.03.07 |
[프로그래머스] 표현 가능한 이진 트리 (0) | 2023.02.15 |
[다익스트라] 백준 9370 (0) | 2023.01.29 |
[다익스트라] 백준 레이저 통신 (0) | 2022.12.25 |