21년 2월 16일
한 일
-
Java로 체스게임 만들기 일부를 완성하고 코드 리뷰를 받았다.
-
Board라는 클래스는 체스판에 올라와있는 체스말을 관리한다.
-
Piece라는 추상 클래스를 만들어서 모든 체스말이 Piece를 상속받게 하였다.
- Piece는 체스말이라면 갖고있어야 하는 기본 속성을 갖고 있다. (색깔, 보드판에 표시할 문자 등)
- 체스말이라면 공통으로 갖고 있어야 하지만 종류별로 다른 기능은 추상메소드로 만들었다.(이동 가능한지 판단 등)
-
체스말을 편하게 관리하기 위하여 Piece의 2차원 배열을 사용하였다.
(체스판의 크기는 게임동한 변하지 않으므로 정적 크기인 배열을 사용하는게 좋다고 생각했다.)
-
사용자 입력을 받아서 체스게임을 시작하는데, Scanner를 close하지 않는 실수를 해 코멘트가 달렸다.
- try with resources를 사용하는 습관을 갖자
-
else if 구문을 지양하라는 코멘트가 달렸다.
- 가독성 관련한 의견 같다
-
하드 코딩되어 있던 값들에 대하여, 변하지 않는 값은 상수로 선언해달라는 코멘트가 달렸다.
- 유지 보수와 가독성을 위해 하드코딩이 아닌 상수를 사용하는 습관을 가져야겠다.
-
-
프로그래머스 경주로건설(재풀이)과 매칭점수 문제를 풀었다.
-
경주로건설
-
BFS또는 DFS로 풀 수 있는 문제였다.
-
나는 처음에 PriorityQueue를 사용하여 풀었는데, 답은 맞혔지만
- visit처리를 queue에 넣을 때 하느냐
- visit처리를 queue에서 꺼낼 때 하느냐
에 따라서 답이 달라지기 때문에 다소 복잡하고 생각할게 많았다.
-
두 번째 풀이는 단순 BFS로 푸는 대신에, visit처리 대신 해당 값의 최소값을 확인하도록 하였다.
-
어쨌든 (n-1,n-1)까지 만들 수 있는 최소비용을 구하는 것이기 때문에, visit이라는 boolean으로 체크하지 않고,
cost라는 int값을 좌표에 넣어서, 방문할때의 비용이 cost에 기록되어있는 비용보다 작은 경우에만 방문하게 한다.
(visit은 기본으로 false이기 때문에 초기화가 필요없지만, cost일 경우에는 모든 원소를 최대값으로 초기화해야 한다.)
-
첫 번째 풀이와 두 번째 풀이 모두, (x,y)의 방문 기록할 때, 수직으로 방문하는지 수평으로 방문하는지도 구분해야 한다
-
결론적으로
visit[n][n][2]
,cost[n][n][2]
등으로 방문을 기록해야 한다. (마지막 2는 수평으로 방문이냐 수직으로 방문이냐)
-
-
매칭 점수
- Java로 풀 경우 String의 indexOf 메소드와 split메소드를 잘 활용하여 풀면 된다.
- String 사용을 자주 안하고 익숙하지 않아서 푸는데 시간이 오래걸렸다.
- 자료구조는 hash map을 사용했는데, 사실 특별한 알고리즘이 필요한 문제 같지는 않다.
-
잘못한 것
- 오전에 놀고, 오후 늦게 시작하고는 밤 늦게까지 공부한 기분을 즐기고 있다.
- 오전에 놀기 때문에 실제로 공부한 시간은 적은데!!!
- 맨날 밤 늦게까지 구현, 알고리즘 풀이 등을 했다고 책 읽을 시간이 없다고 하는데, 오전에 쉬지만 않으면 시간이 있다 ㅠㅠ
잘한 것
느낌
- java로 체스만들기를 진행하며 코드 리뷰를 받으니, 코드의 디테일을 생각하게 되서 좋다.
- 당분간은 알고리즘 빼고는 TIL에 적을 내용이 크게 없을 것 같다.(구현이 주 활동이다 보니..?)
할 일
- 코드스쿼드 미션하기
- 자바의 정석 읽기
- 프로그래머스 문제 풀기