티스토리 뷰

준비

프리코스 미션 1,2,3 을 진행하면서는 시간을 정하지 않고 진행했었다. 특히, 미션3은 구현하는데도 시간이 꽤 오래걸렸고 리팩토링하는데는 더 오래 걸렸다. 하면서 다른 PR 내용을 참고하기도 했다.

코딩테스트에서 컴파일 되어 실행되는 것이 최우선이라고 생각했기 때문에 좀 더 제한시간에 이것저것 풀어보는게 좋을 것이라고 생각했다. 2019 미션3인 블랙잭, 1기 코딩테스트 문제인 영화예매, 2기 코딩테스트 문제인 치킨집 닫힌 PR을 찾아가며 풀어보았다. 3일정도의 시간이라 리팩토링까지는 못했지만 여러 문제를 풀어보면서 짧은 시간 안에 일부라도 구현하는 연습을 했다. 더불어 지난 프리코스 미션의 피드백과 코드, 요구사항을 정리해보면서 준비했다.

코딩테스트

코로나 때문에 줌으로 진행되었다. 신분증 검사를 하고 1시가 좀 넘어서 미션 메일이 왔다. 미션3의 연장선인 지하철경로탐색 문제였다. 다익스트라 알고리즘을 사용해서 최단시간, 최단거리를 구하는 방식이었다. 다익스트라를 본 적은 있지만 사용해본 적이 없었다. README에 test 코드로 다익스트라 알고리즘의 힌트가 주어졌다. test 코드를 사용해본적이 없고, 자바 라이브러리를 사용해 본적도 없어서 라이브러리를 어떻게 넣는지부터 걱정이었다. 일부라도 구현한다는 생각으로 README를 정리했고 메뉴 구조부터 시작했다. 긴장해서 그런지 README 작성하고 초기 커밋을 시도하려고 보니 fork 뜨지 않고 원본저장소를 사용하고 있었다!! 초반에 발견해서 다행이었다.  메뉴는 미션3에서 작성했던 코드를 긁어와서 일부만 변형시켜 사용해서 금방 작성했다. 

 

라이브러리를 어떻게 넣는지 몰라서 찾아보다보니 이미 라이브러리 자체는 넣어져 있는 것 같았다. 테스트 코드에 작성된 코드를 복사해서 클래스로 만들어 실행시켜 보면서 수정해 나가는 방식으로 진행했다. 그래프 구현하고 초기화 한 다음 최단거리를 구하는 것 위주로 진행했다. 더불어 해당 시간도 출력해야 경로 내용을 리스트로 받아서 각각 시간과 거리를 계산하는 방식으로 해결했다. 라이브러리는 잘 이해하지 못했지만 set이 있으니 get도 있겠지 하는 생각으로 edge를 가져왔다. 배열을 돌면서 값을 가져와 더해주는 방식으로 시간과 거리를 구했다.

 

전체 어플리케이션에 시험문제로 낸 것은 일부인 것 같았다. 라인별로 역을 지정해주는 것은 진행하지 못했다. (샘플 대로 구현하는 데는 문제가 없었다.) 추가, 삭제, 라인별로 검색 등의 기능은 언급이 안 되어 있었기 때문에 라인별로 역을 지정해주는 작업을 하다가 헷갈려서 포기하고 주어진 기능구현에 집중했다. 아마 그런 언급이 있었다면 시간 안에 못 했을 것이다ㅠㅠ 기존 미션3에서 Line에 대한 역정보를 따로 클래스를 만들어 map 형식으로 작성했기 때문에 노선별 역정보 추가를 하지 못 했다고 생각한다😥 이걸 작성하면서 다른 코드들을 보니 Line 자체에 stations를 배열로 지정한 코드도 있었다.

 

다익스트라 라이브러리를 사용하는 클래스에서 경고문구가 많이 떴다. 데이터타입을 명확하게 지정해주지 않아서 뜨는 경고문구 같았는데 어떻게 처리하는지 몰라서 그냥 실행만 되는 상태에서 제출했다. 코딩테스트 5시간이 꽤 빨리 갔다. 3~4시간 때 쯤 예시와 동일하게 기능구현을 완료하고 리팩토링은 생각이 안나서 README나 포맷팅위주로 정리했다. 나중에 시험이 다 끝날 때쯤에 리팩토링할 부분들이 생각나서 아쉬웠다.ㅠㅠ 아직은 리팩토링할 부분들이 바로 보이지 않는다ㅠㅠ

개선방안

다익스트라 라이브러리의 타입을 지정했다. 역정보는 String이 아니라 Station 타입으로 가져올 수 있게 객체 타입으로 변경했다. DijkstraShortestPath<String, String> 이 부분도 몰라서 이렇게 지정하니까 경고문구가 사라져서 작성한 것인데 <Station, DefaultWeightedEdge>가 맞는것 같다. 이런식으로 작성하니 남아있던 6개의 경고문구가 다 사라졌다.

    //기존
    private static final WeightedMultigraph<String, DefaultWeightedEdge> graphByDistance
        = new WeightedMultigraph<>(DefaultWeightedEdge.class);
    private static final WeightedMultigraph<String, DefaultWeightedEdge> graphByTime
        = new WeightedMultigraph<>(DefaultWeightedEdge.class);
    private static final DijkstraShortestPath<String, String> dijkstraShortestDistance
        = new DijkstraShortestPath(graphByDistance);
    private static final DijkstraShortestPath<String, String> dijkstraShortestTime
        = new DijkstraShortestPath(graphByTime);
    //개선
    private static final WeightedMultigraph<Station, DefaultWeightedEdge> graphByDistance
        = new WeightedMultigraph<>(DefaultWeightedEdge.class);
    private static final WeightedMultigraph<Station, DefaultWeightedEdge> graphByTime
        = new WeightedMultigraph<>(DefaultWeightedEdge.class);
    private static final DijkstraShortestPath<Station, DefaultWeightedEdge> dijkstraShortestDistance
        = new DijkstraShortestPath<>(graphByDistance);
    private static final DijkstraShortestPath<Station, DefaultWeightedEdge> dijkstraShortestTime
        = new DijkstraShortestPath<>(graphByTime);

데이터 타입을 바꾸면서 연관되어 있는 메소드들의 데이터 타입도 수정해 주었다. 'ctrl + 클릭'으로 해당 클래스에 들어가서 정보를 보면 아직은 명확하지 않지만 데이터타입에 대한 힌트를 얻을 수 있는 것 같다.

같은 형식의 코드를 복붙하면서 변수명을 안 바꿔준게 계속 마음에 걸렸는데 이 부분도 수정해주었다. 큰 문제는 없지만 이걸 마지막에 발견해서 결과 발표 전까지 종종 생각났었다😅

    //기존
    public static int getDistanceByList(List<String> path) {
        double totalTime = 0;
        for (int i = 0; i < path.size() - 1; i++) {
            totalTime += graphByDistance
                .getEdgeWeight(graphByDistance.getEdge(path.get(i), path.get(i + 1)));
        }
        return (int) totalTime;
    }
    //개선
    public static int getDistanceByList(List<Station> path) {
        double totalDistance = 0;
        for (int i = 0; i < path.size() - 1; i++) {
            totalDistance += graphByDistance
                .getEdgeWeight(graphByDistance.getEdge(path.get(i), path.get(i + 1)));
        }
        return (int) totalDistance;
    }

setter를 지양하라는 요구사항도 있었는데 테스트 제출은 set을 사용해서 edge를 지정해 주었다. 개선하면서 이름은 add~~로 바꿔주긴 했지만 메소드 이름만 변경된 것이 아닌지,, setter를 지양하라는 것은 어떤 의미인지 아직도 잘 모르겠다. 🤔

 

미션3와 더불어서 노선에 역을 저장하고 역정보를 저장하는 것을 어떻게 동시에 작성하는게 좋을지 아직은 잘 모르겠다. 다른 PR에서 발견한 것처럼 Line 자체에 stations를 저장하고 최단경로를 구하는 클래스를 따로 두는 것도 좋을 것 같다. 이 부분도 생각해보면 좋겠지만.. 가장 마음에 걸렸던 위의 내용을 개선한 것으로 만족하고 다음에 생각해 보도록 한다. 

결과

 

마지막 코딩테스트까지 합격했다😀 잘하는 사람들도 너무 많고 모르는 것도 너무 많아서 이렇게 하는게 맞을까 하는 불안감도 많았었는데 좋은 결과로 내년에 우테코에서 배울 수 있게 되었다. 앞으로 계속 하다보면 할 수 있다는 메세지를 주는 것 같아서 나에게는 더 의미가 있었다.

프리코스부터 코딩테스트까지 많은 걸 배울 수 있었다. 아무래도 평가 받는다고 생각하니 평소보다 더 많이 생각했고 요구사항들을 지키려고 노력했다. 이러면서 더 좋은 방법을 찾기 위해 고민했고 많이 발전했다. 코드를 작성하는데 이렇게 작성하는 이유를 생각하게 된 것 같다.

 

누군가 내 코드를 읽는다고 생각하고 작성하니 변수명이나 컨벤션에 더 신경 쓰게 되었다. 미션을 확실히 혼자 하는 것과 누군가가 보고 평가한다고 생각하고 하는 것은 다르다. 모르겠는 것들이 너무 많은데 답을 찾아갈 수 있는 과정인 것 같아서 2월부터 시작하는 코스가 기대가 된다. 😊

'회고' 카테고리의 다른 글

[월간회고] 2021.02  (0) 2021.02.28
[월간회고] 2021.01 - CS  (2) 2021.01.31
2020 한 해를 돌아보며  (3) 2020.12.26
우테코 프리코스 미션3을 제출하며 (2020.12.15)  (10) 2020.12.23
2020.09 공부기록  (0) 2020.12.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함