Excel에서 주어진 명령어 UPDATE, MERGE, UNMERGE, PRINT 작업을 수행하고 PRINT를 통해 출력되는 값들을 String 배열로 반환하면 된다.
Update A - 주어진 R, C 위치의 cell value를 VALUE로 수정하면 된다.
Update B - 주어진 VALUE_A를 가진 cell들의 value를 VALUE_B로 수정하면 된다.
Merge - 두 cell을 병합하면 된다. 이 때 첫 번째 cell이 값을 가지고 있으면 해당 값으로 아니면 두 번째 cell 값으로 한다.
Unmerge - 주어진 cell에 병합된 모든 cell을 해제한다. 주어진 cell 위치는 값을 유지하고 나머지 cell은 값을 초기화한다.
Print - 주어진 cell의 값을 출력한다. 만약 값을 가지고 있지 않다면 EMPTY를 출력한다.
특정 알고리즘을 사용하지 않는 구현 문제이다. 각각의 명령에 따른 구현을 하면 된다. 우선 Cell을 정의해야 한다. Cell은 값을 가지고 있어야 한다. 추가로 병합 해제를 할 때 병합된 cell들을 알아야 하기 때문에 이를 저장하는 list도 초기화한다.
class Cell {
String value = "";
final List<Point> cellPoints = new ArrayList<>();
}
UPDATE r c value
(r, c) 위치에 있는 cell의 값을 value로 수정하면 된다. Cell들을 저장하는 2차원 배열 excel에서 위치에 해당하는 cell 인스턴스를 불러와서 수정하면 된다.
private void update(int row, int col, String value) {
excel[row][col].update(value);
}
UPDATE value1 value2
전체 excel을 탐색하면서 value1을 가진 cell의 값을 value2로 수정하면 된다.
private void update(String fromValue, String toValue) {
for (Cell[] cells : excel)
for (Cell cell : cells)
if (cell.value.equals(fromValue)) cell.update(toValue);
}
MERGE r1 c1 r2 c2
(r1, c1) 위치의 cell과 (r2, c2) 위치의 cell을 병합하면 된다. 이 때 cell1이 값을 가지고 있지 않다면 cell2의 값으로 cell1 값을 수정한다. 또한 cell2에 병합된 cell들을 cell1에 병합시킨다.
private void merge(int row1, int col1, int row2, int col2) {
Cell cell1 = excel[row1][col1];
Cell cell2 = excel[row2][col2];
if (!cell1.equals(cell2)) {
if (cell1.value.equals("")) cell1.value = cell2.value;
for (Point cellPoint : cell2.cellPoints) {
excel[cellPoint.x][cellPoint.y] = cell1;
cell1.cellPoints.add(cellPoint);
}
}
}
UNMERGE r c
(r, c) 위치에 있는 cell을 병합 해제하면 된다. 이 때 (r, c) cell은 기존의 값을 유지하고 나머지 cell들은 값을 제거한다.
private void unmerge(int row, int col) {
Cell cell = excel[row][col];
for (Point cellPoint : cell.cellPoints)
excel[cellPoint.x][cellPoint.y] = new Cell(cellPoint.x, cellPoint.y);
excel[row][col] = new Cell(row, col);
excel[row][col].value = cell.value;
}
PRINT r c
(r, c) 위치에 있는 cell의 값을 출력하면 된다. 만약 값이 없다면 EMPTY를 출력한다.
private void print(int row, int col) {
Cell cell = excel[row][col];
if (cell.value.equals("")) prints.add("EMPTY");
else prints.add(cell.value);
}
class Cell {
String value = "";
final List<Point> cellPoints = new ArrayList<>();
public Cell(int r, int c) {
cellPoints.add(new Point(r, c));
}
public void update(String value) {
this.value = value;
}
}
class Solution {
private final Cell[][] excel = new Cell[50][50];
private final List<String> prints = new ArrayList<>();
public String[] solution(String[] commands) {
initExcel();
for (String command : commands) runCommand(command.split(" "));
return prints.toArray(String[]::new);
}
private void runCommand(String[] command) {
String type = command[0];
if (type.equals("UPDATE")) {
if (command.length == 4) {
int row = Integer.parseInt(command[1]) - 1;
int col = Integer.parseInt(command[2]) - 1;
update(row, col, command[3]);
} else update(command[1], command[2]);
} else if (type.equals("MERGE")) {
int r1 = Integer.parseInt(command[1]) - 1;
int c1 = Integer.parseInt(command[2]) - 1;
int r2 = Integer.parseInt(command[3]) - 1;
int c2 = Integer.parseInt(command[4]) - 1;
merge(r1, c1, r2, c2);
} else if (type.equals("UNMERGE")) {
int row = Integer.parseInt(command[1]) - 1;
int col = Integer.parseInt(command[2]) - 1;
unmerge(row, col);
} else {
int row = Integer.parseInt(command[1]) - 1;
int col = Integer.parseInt(command[2]) - 1;
print(row, col);
}
}
private void update(String fromValue, String toValue) {
for (Cell[] cells : excel)
for (Cell cell : cells)
if (cell.value.equals(fromValue)) cell.update(toValue);
}
private void update(int row, int col, String value) {
excel[row][col].update(value);
}
private void merge(int row1, int col1, int row2, int col2) {
Cell cell1 = excel[row1][col1];
Cell cell2 = excel[row2][col2];
if (!cell1.equals(cell2)) {
if (cell1.value.equals("")) cell1.value = cell2.value;
for (Point cellPoint : cell2.cellPoints) {
excel[cellPoint.x][cellPoint.y] = cell1;
cell1.cellPoints.add(cellPoint);
}
}
}
private void unmerge(int row, int col) {
Cell cell = excel[row][col];
for (Point cellPoint : cell.cellPoints)
excel[cellPoint.x][cellPoint.y] = new Cell(cellPoint.x, cellPoint.y);
excel[row][col] = new Cell(row, col);
excel[row][col].value = cell.value;
}
private void print(int row, int col) {
Cell cell = excel[row][col];
if (cell.value.equals("")) prints.add("EMPTY");
else prints.add(cell.value);
}
private void initExcel() {
for (int r = 0; r < 50; r++)
for (int c = 0; c < 50; c++)
excel[r][c] = new Cell(r, c);
}
}