[ 프로그래머스 ] 150366 표 병합

codesver·2023년 7월 5일
0

Programmers

목록 보기
26/30
post-thumbnail

📌 Problem

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를 출력한다.

📌 Solution

특정 알고리즘을 사용하지 않는 구현 문제이다. 각각의 명령에 따른 구현을 하면 된다. 우선 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);
}

📌 Code

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);
    }
}
profile
Hello, Devs!

0개의 댓글