본문 바로가기
TIL

[231023] 개인 과제 리뷰

by 진진리 2023. 10. 23.
728x90
  • 알고리즘 문제 풀이

https://school.programmers.co.kr/learn/courses/30/lessons/150370

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

위의 문제를 다음과 같이 풀었는데 

import java.util.Arrays;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        int len = privacies.length;
        int[] answer = new int[len];
        int answer_num = 0;
        for(int i=0;i<len;i++){
            int term = findTerm(privacies[i], terms);
            String deadline = deadline(privacies[i], term);
            if(passedOrNot(today, deadline)) answer[answer_num++]=i+1;
        }
        return Arrays.copyOfRange(answer, 0, answer_num);
    }

    public static String deadline(String privacy, int term_month){
        String deadline = "";
        int day = findDay(privacy)-1;
        int month = findMonth(privacy) + term_month;
        if(day==0){
            month--;
            day = 28;
        } 
        int year = findYear(privacy);
        if(month > 12){
            year += month/12;
            month -= 12*(month/12);
            if(month == 0){
                year--;
                month = 12;
            }
        }
        
        deadline = String.format("%d.%02d.%02d", year, month, day);

        return deadline;
    }

    public static boolean passedOrNot(String today, String deadline){
        if(today.compareTo(deadline) <= 0) return false;
        else return true;
    }

    public static int findYear(String str){
        return Integer.parseInt(str.substring(0, 4));
    }

    public static int findMonth(String str){
        return Integer.parseInt(str.substring(5, 7));
    }
    
    public static int findDay(String str){
        return Integer.parseInt(str.substring(8, 10));
    }
    
    public static int findTerm(String str, String[] terms){
        String termkind = str.substring(11, 12);
        int term = 0;
        for (String s : terms) {
            if (s.contains(termkind)) {
                term = Integer.parseInt(s.substring(2));
            }
        }
        return term;
    }
    
}

다른 사람이 제출한 코드를 보니 "0000.00.00"이라는 String 날짜 형식을 맞추는 것이 아니라

연, 월, 일을 숫자로 더해 계산함으로써 더 간단하고 빨리 실행될 수 있도록 하였다.

문제의 특정 형식을 지키는데 얽매이지 말고 문제를 효율적으로 풀기 위한 고민도 해야겠다는 생각이 들었다.


이번 개인 과제의 모범 코드를 보았는데 각 출력을 기능 별로 메소드를 구현하고 있어 알아보기 쉽다는 점과 관리 모드를 통해 메뉴를 추가하고 삭제할 수 있도록 구현한 점, 메뉴 구현에 해시맵을 사용했다는 점이 인상깊었다.

그래도 모범 코드를 보면서 나 스스로가 해시맵 등에도 그동안 조금 친숙해졌고 코드를 짤 때 최대한 기능별로 쪼개서 구현해야 한다는 점을 잘 알게 되었다는 것을 확인하면서 일주일 동안 자바 실력이 성장했다는 것을 실감할 수 있어 좋았다.

내일부터 팀 과제가 시작되기 때문에 개인과제를 수정하지는 못했지만 다양한 코드들을 구현해나가면서 연습하고 싶다.


그 외 느낀점:

팀원분이 개인적으로 현재 짜고 계신 코드를 리뷰해주셨는데 내가 보기엔 완성되어 있는 코드여서 무엇을 중점으로 고칠 생각인지 여쭤보았다. 코드 내에서 사용되지 않은 변수를 지우고, 하나의 클래스가 하나의 역할을 하도록 하고, 비효율적인 코드를 수정하신다는 말씀을 듣고 나도 코드를 작성할 때 정확한 입출력 외에도 다양한 관점에서 더 좋은 코드를 만들기 위해 열심히 검토해야겠다는 생각이 들었다. 지금 나에게 가장 필요한 건 기능별로 구현하려고 노력하기라고 생각한다.