티스토리 뷰
문제 설명
당신은 표 편집 프로그램을 작성하고 있습니다.
표의 크기는 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"를 출력합니다.
아래는 UPDATE 명령어를 실행하여 빈 셀에 값을 입력하는 예시입니다.
commands | 효과 |
UPDATE 1 1 menu | (1,1)에 "menu" 입력 |
UPDATE 1 2 category | (1,2)에 "category" 입력 |
UPDATE 2 1 bibimbap | (2,1)에 "bibimbap" 입력 |
UPDATE 2 2 korean | (2,2)에 "korean" 입력 |
UPDATE 2 3 rice | (2,3)에 "rice" 입력 |
UPDATE 3 1 ramyeon | (3,1)에 "ramyeon" 입력 |
UPDATE 3 2 korean | (3,2)에 "korean" 입력 |
UPDATE 3 3 noodle | (3,3)에 "noodle" 입력 |
UPDATE 3 4 instant | (3,4)에 "instant" 입력 |
UPDATE 4 1 pasta | (4,1)에 "pasta" 입력 |
UPDATE 4 2 italian | (4,2)에 "italian" 입력 |
UPDATE 4 3 noodle | (4,3)에 "noodle" 입력 |
위 명령어를 실행하면 아래 그림과 같은 상태가 됩니다.
아래는 MERGE 명령어를 실행하여 셀을 병합하는 예시입니다.
commands | 효과 |
MERGE 1 2 1 3 | (1,2)와 (1,3) 병합 |
MERGE 1 3 1 4 | (1,3)과 (1,4) 병합 |
위 명령어를 실행하면 아래와 같은 상태가 됩니다.
병합한 셀은 "category" 값을 가지게 되며 (1,2), (1,3), (1,4) 중 어느 위치를 선택하더라도 접근할 수 있습니다.
아래는 UPDATE 명령어를 실행하여 셀의 값을 변경하는 예시입니다.
commands | 효과 |
UPDATE korean hansik | "korean"을 "hansik"으로 변경 |
UPDATE 1 3 group | (1,3) 위치의 셀 값을 "group"으로 변경 |
위 명령어를 실행하면 아래와 같은 상태가 됩니다.
아래는 UNMERGE 명령어를 실행하여 셀의 병합을 해제하는 예시입니다.
commands | 효과 |
UNMERGE 1 4 | 셀 병합 해제 후 원래 값은 (1,4)가 가짐 |
위 명령어를 실행하면 아래와 같은 상태가 됩니다.
실행할 명령어들이 담긴 1차원 문자열 배열 commands가 매개변수로 주어집니다. commands의 명령어들을 순서대로 실행하였을 때, "PRINT r c" 명령어에 대한 실행결과를 순서대로 1차원 문자열 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- 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 사이의 정수입니다.
- "UPDATE r c value"
- commands는 1개 이상의 "PRINT r c" 명령어를 포함하고 있습니다.
입출력 예
commands | result |
["UPDATE 1 1 menu", "UPDATE 1 2 category", "UPDATE 2 1 bibimbap", "UPDATE 2 2 korean", "UPDATE 2 3 rice", "UPDATE 3 1 ramyeon", "UPDATE 3 2 korean", "UPDATE 3 3 noodle", "UPDATE 3 4 instant", "UPDATE 4 1 pasta", "UPDATE 4 2 italian", "UPDATE 4 3 noodle", "MERGE 1 2 1 3", "MERGE 1 3 1 4", "UPDATE korean hansik", "UPDATE 1 3 group", "UNMERGE 1 4", "PRINT 1 3", "PRINT 1 4"] | ["EMPTY", "group"] |
["UPDATE 1 1 a", "UPDATE 1 2 b", "UPDATE 2 1 c", "UPDATE 2 2 d", "MERGE 1 1 1 2", "MERGE 2 2 2 1", "MERGE 2 1 1 1", "PRINT 1 1", "UNMERGE 2 2", "PRINT 1 1"] | ["d", "EMPTY"] |
입출력 예 설명
입출력 예 #1
- 문제 예시와 같습니다. (1,3) 위치의 셀은 비어있고 (1,4) 위치의 셀 값은 "group"입니다. 따라서 ["EMPTY", "group"]을 return 해야 합니다.
입출력 예 #2
- 모든 UPDATE 명령어를 실행하면 아래와 같은 상태가 됩니다.

- "MERGE 1 1 1 2" 명령어를 실행하면 아래와 같은 상태가 됩니다.

- "MERGE 2 2 2 1" 명령어를 실행하면 아래와 같은 상태가 됩니다.

- "MERGE 2 1 1 1" 명령어를 실행하면 아래와 같은 상태가 됩니다.

- "UNMERGE 2 2" 명령어를 실행하면 아래와 같은 상태가 됩니다.

풀이
# 표에서 1행 1열의 실제 위치는 (0,0)
def idx(a,b):
return int(a)-1, int(b)-1
# 같은 위치 link를 가진 셀(병합된 셀)은 모두 값을 바꿔줘야 함
def update1(r,c,new):
target = link[r][c]
for i in range(size):
for j in range(size):
if link[i][j] == target:
graph[i][j] = new
def update2(old,new):
for i in range(size):
for j in range(size):
if graph[i][j] == old:
graph[i][j] = new
def merge(r1,c1,r2,c2):
main, sub = (0,0), (0,0)
if graph[r1][c1] == 'EMPTY':
main = (r2, c2)
sub = (r1, c1)
elif graph[r2][c2] == 'EMPTY':
main = (r1, c1)
sub = (r2, c2)
else: # 두 셀 모두 값을 가지고 있을 경우
main = (r1, c1)
sub = (r2, c2)
old = link[sub[0]][sub[1]]
new = link[main[0]][main[1]]
for i in range(size):
for j in range(size):
if link[i][j] == old:
link[i][j] = new
graph[i][j] = graph[main[0]][main[1]]
def unmerge(r,c):
value = graph[r][c]
target = link[r][c]
for i in range(size):
for j in range(size):
if link[i][j] == target:
link[i][j] = (i,j)
graph[i][j] = 'EMPTY'
graph[r][c] = value
size = 50
graph = [['EMPTY']*size for _ in range(size)]
link = [[(i,j) for j in range(size)] for i in range(size)]
def solution(commands):
answer = []
for command in commands:
cmd = command.split(' ')
if cmd[0] == 'UPDATE':
if len(cmd) == 4: # UPDATE r c value
r,c = idx(cmd[1],cmd[2])
update1(r,c,cmd[3])
else: # len(cmd) == 3, 즉 UPDATE value1 value2
update2(cmd[1],cmd[2])
elif cmd[0] == 'MERGE': # MERGE r1 c1 r2 c2
r1,c1 = idx(cmd[1],cmd[2])
r2,c2 = idx(cmd[3],cmd[4])
if (r1,c1) == (r2,c2):
continue
merge(r1,c1,r2,c2)
elif cmd[0] == 'UNMERGE': # UNMERGE r c
r,c = idx(cmd[1],cmd[2])
unmerge(r,c)
else: # cmd[0] == 'PRINT', 즉 PRINT r c
r,c = idx(cmd[1],cmd[2])
answer.append(graph[r][c])
return answer
'개발자를 위한 한 걸음 > 코딩 문제' 카테고리의 다른 글
아기 상어2 - 백준 #17086, 그래프/브루트포스 알고리즘/너비 우선 탐색 (0) | 2023.02.18 |
---|---|
코딩 테스트 공부 - 프로그래머스 lv.3, DP (0) | 2023.02.18 |
바닥 장식 - 백준 #1388, 구현/그래프/bfs/dfs (0) | 2023.02.12 |
미로 탈출 명령어 - 프로그래머스 lv.3, dfs (0) | 2023.02.09 |
파괴되지 않은 건물 - 프로그래머스 lv.3, 누적합 (0) | 2023.02.09 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 카카오 코딩테스트
- 문자열
- leetcode
- 그래프 탐색
- 깊이 우선 탐색
- 골드5
- 너비 우선 탐색
- 릿코드
- 코딩 테스트
- 코드트리
- 정렬
- lv.2
- 리트코드
- 수학
- 백트래킹
- 프로그래머스
- Simulation
- 코딩테스트
- 그리디 알고리즘
- 백준
- 그래프 이론
- 실버3
- 다이나믹 프로그래밍
- lv.3
- 실버2
- Python
- 시뮬레이션
- 브루트포스 알고리즘
- 구현
- 카카오
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함