[작년 문제 풀어보기] 5기 1주차 문제 - 1~4번

별의개발자커비·2023년 8월 30일
0

우테코 도전기

목록 보기
3/37
post-thumbnail

개요

우테코 6기를 준비하며 5기 프리코스 문제를 하루에 하나씩 풀어보려고 한다.
기능구현 계획, 클린코드, 객체 지향을 생각하며 코드를 짜보자!

생각할 점

1번 문제

요구사항

과정

클린 코드나 메소드 명칭을 신경쓰다보니 다른 예시글을 거의 따라친 것 같다..

  • 내가 생각치 못한 예외!
    • List에 들어있는 원소의 개수는 2개인가?
    • 왼쪽 페이지는 홀수인가?
    • 오른쪽 페이지는 짝수인가?

1차 코드

package week1;

public class Problem1 {

    public static int find_max_between_plus_and_multi(int num) {
        int units = 0;
        int plus_sum = 0;
        int multi_sum = 1;
        while (num != 0) {
            units = num % 10;
            plus_sum += units;
            multi_sum *= units;
            num = num / 10;
        }
        return Math.max(plus_sum, multi_sum);
    }

    public static int find_max_between_left_and_right(int[] pages) {
        int left_sum = find_max_between_plus_and_multi(pages[0]);
        int right_sum = find_max_between_plus_and_multi(pages[1]);
        return Math.max(left_sum, right_sum);
    }

    public static boolean is_invalid_page(int[] pages) {
        int left_page = pages[0];
        int right_page = pages[1];
        if (pages.length != 2) {
            return true;
        }
        if (left_page % 2 != 1) {
            return true;
        }
        if (right_page > 400) {
            return true;
        }
        return false;
    }


    public static int find_who_win(int pobi_num, int crong_num) {
        if (pobi_num < crong_num) {
            return 1;
        }
        if (pobi_num > crong_num) {
            return 2;
        }
        return 0;
    }

    public static int solution(int[] pobi, int[] crong) {
        int result = 0;
        if (is_invalid_page(pobi) || is_invalid_page(crong)) {
            return -1;
        }
        try {
            int pobi_max = find_max_between_left_and_right(pobi);
            int crong_max = find_max_between_left_and_right(crong);
            result = find_who_win(pobi_max, crong_max);
        } catch (Exception e) {
            return -1;
        }
        return result;
    }

    public static void main(String[] args) {
        System.out.println(solution(new int[]{11, 12}, new int[]{13, 14}));
    }
}

보완할 점

  • 내가 혼자 쳐보기!
  • 예외 다양하게 생각해보기
  • % 10 에 있는 10같은 숫자도 상수화를 하면 좋을 것 같은데 어떻게 하면 될까? 아래 사진 참고하기!
  • 검증 로직은 모든 문제에 있을테니 아예 검증 폴더를 만들어서 클래스를 만들어 넣을 수도 있겠구나
  • 참고코드 1
  • 테스트 폴더를 빼서 테스트 코드를 만들어놓는 방법 해보기!
  • 참고코드 2
  • 이런식의 solution 코드와 변수명도 재밌다!
  • 상수화를 enum으로 하는 것, 클래스를 아예 분리하는 것 따라해보기
  • 십진수를 digit number 라고 하는구나!
  • 초기화를 이렇게
  • ? 궁금한점


    여기서 resultStatus = referee.playGame(pobi, crong) 하지 않고
    regeree 객체 생성 때 넣어주는게 더 나은 건가?
    애초에 palyGame도 ()와 (num, num) 이렇게 두개를 만들어서 ()가 뒤를 호출하게 되어있는 것도 신기
  • exception을 여러개 두는 valid 클래스인데 그 안에서도

    이렇게 boolean을 반환하는 is~ 메소드와 그 결과인 pass와 exception을 던지는 void가 따로있네
  • test 코드 작성해보기
    • assertThat은 아는데
    • assertThatThrownBy는, is Instance Of, hasMessage 이건 뭐지 해보기

알게된 점

  • 최대한 기능을 나눌 수 있는 만큼 나누기! 한 메소드에 한 기능만!
  • 삼항연산자 쓸 필요없이 Math.max로 둘 중 큰 거 return!
  • 이렇게 명칭을 짓는구나! 길어도 어떤 기능의 메소드인지 알 수 있을 것 같다.
  • enum 생성자 사용법
    참고글 1, 2

회고

정말 조각 조각 쪼갤 수 있구나..

최종 코드

pr리뷰 환영합니다!!
https://github.com/skylar1220/java-onboarding/pull/2


2번 문제

요구사항

과정

코드

보완할 점

알게된 점

Deque

https://velog.io/@roro/Java-Stack-Queue


3번 문제

요구사항

과정

2번 문제를 풀면서 메소드를 최대한 나눠서 시작하려고 하고, 객체지향에 몰입하다보니 처음 시작이 안풀리고 계속 꼬이는 것 같았다. 그래서 이번 문제는 일단 하나의 메소드로 쭉 알고리즘 문제 풀듯이 작성하고 완성한 후에 메소드를 나눠봤다.

코드

pr링크
https://github.com/skylar1220/java-onboarding/pull/4/files

보완할 점

연산에 필요한 숫자들을 상수화 시키는 데 너무 세세하게 나눠서 이름을 다르게 짓고 하는 건 아닌가라는 생각이 들었다. 다른 스터디원들에게 물어봐서 개선점을 생각해봐야겠다!

0개의 댓글