Page tree
Skip to end of metadata
Go to start of metadata

6주차

        public void putMine(int row, int col) {
                int startRow = (row - 1 < 0) ? row : row - 1;
                int endRow = (row + 1 < getRow()) ? row + 1 : row;
                
                if(getSquare(row, col).isMine()) return;
                for (int i = startRow; i <= endRow; i++) {
                        Row rowOfGrid = rows[i];
                        
                        rowOfGrid.increaseNearNumberOfMine(col);
                        if (i == row) {
                                rowOfGrid.setMine(col);
                        }
                }
        }
  • 위와 같이 지뢰판에서 boundary condition을 체크하는 부분이 많아져 짜증이 난다.
  • 이 부분을 개선하기 위해 자료구조 및 알고리즘 수업 시간에 배웠던 Dummy Square를 만들 수 있는 구조로 가는 것이 좋겠다는 제안이 나옴
    • 예를 들어 4 * 4의 Grid일 경우 가짜 Square를 만들어 6 * 6의 Grid를 만들면 구현하면 좋겠다는 아이디어가 나왔다.

  • 이영남 학생이 위와 같이 제안함으로써 기존의 구조를 변경해야 하는 이슈가 발생했다.
  • 2중 for문을 제거하기 위해 자료 구조를 변경하는 요구사항을 추가한다. 영남이가 제안한 아이디어 투척한다. 단, 테스트와 컴파일 에러가 발생하면 안된다.
  • 테스트와 컴파일 에러가 발생하지 않는다는 제약 조건을 준 상태에서 문제를 해결하기 위해 스터디 대부분의 시간을 소요함.
  • 문제를 바로 해결하지 못하더라도 삽질을 해보도록 하는 것도 소중한 경험이라는 생각이 들었다.

7주차

  • 학생들이 다음 단계로 나아가지 못하고 멘붕 상태로 스터디에 참석함.
  • 변하는 부분과 변화하지 않는 부분을 분리하는 시도를 했으면 좋겠다는 제안을 함.
  • 2차원 배열로 구현했던 부분을 나는 1차원 배열로 구현했다는 소스 코드를 공유함.
  • 이 시점에 장택순이 변하는 부분과 변화하지 않는 부분을 분리하는 시도에 대한 아이디어를 떠올림. 이 부분을 OS와 연결시켜 문제를 해결해 가려는 시도를 함. 설계 회의 시작

  • 위와 같이 설계하는 과정은 자바 스터디 설계 회의 음성 파일 파일을 통해 참고할 수 있다.
  • 설계 회의를 하면서 Grid 전체를 분리하는 것이 아니라 Position이라는 클래스를 두어 일부분만 추상화해 분리하면 좋겠다는 의견을 제시함.
public class Position {
        private int x;
        private int y;
        public Position(int x, int y) {
                this.x = x;
                this.y = y;
        }
        public int getX() {
                return x;
        }
        public int getY() {
                return y;
        }
        public ArrayList<Position> getNeighbors(int row, int col) {
                int startRow = (x - 1 < 0) ? x : x - 1;
                int endRow = (x + 1 < row) ? x + 1 : x;
                
                int startCol = (y-1 < 0)? y : y-1;
                int endCol = (y+1 < col)? y+1 : y;
                
                ArrayList<Position> neighbors = new ArrayList<>();
                
                for (int i = startRow; i <= endRow; i++) {
                        for (int j = startCol; j <= endCol; j++) {
                                neighbors.add(new Position(i, j));
                        }
                }
                
                neighbors.remove(this);
                return neighbors;
        }
}
        public void putMine(int row, int col) {
                Position pos = new Position(row, col);
                
                if(getSquare(pos).isMine()) return;
                
                getSquare(pos).setMine();
                for (Position eachPos : pos.getNeighbors(getRow(), getCol())) {
                        getSquare(eachPos).setNumOfNearMines();
                }
                
        }

스터디 회고

  • 지난 시간에 3시간 동안 삽질을 했지만 첫 부분을 어디서부터 시작해야 할 것인지에 대한 감을 잡지 못했다.
  • 구현을 시작하기보다 어떻게 설계해 나가는 것이 좋을 것인가에 대한 다양한 방식으로 접근하는 시도를 했다.
  • 토론을 하다가 일정 부분으로 구현이 가능한 수준으로 도달하는 시점에 구현을 시작했다. 학생들 스스로 문제를 풀어가도록 유도하는 것이 좋았다.
  • No labels