[우아한테크 도전기] 이전 기수 프리코스 1주차_1번 연습

Dev_ch·2023년 9월 1일
0

우아한테크 도전기

목록 보기
23/51
post-custom-banner

이제 정말 한달정도 남은 시점에서, 기존의 프로젝트와 서버 개발을 뒤로 미루고 우테코 연습을 해보기위해 이전 기수에서 진행했었던 프리코스 문제들을 풀어보려한다.

해당 포스팅은 이전 기수 프리코스 1주차 문제를 풀어보았다.

문제

풀이

class Player {
    private final String name;
    private final Integer score;

    public Player(String name, Integer score) {
        this.name = name;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public Integer getScore() {
        return score;
    }
}
...

public static final int MINIMUM = 0;
public static final int MAXIMUM = 400;

private static Integer solution(List<Integer> pobiPage, List<Integer> crongPage) {
        // 포비
        Player pobi = new Player(
                "pobi", resultMax(pobiPage.get(0), pobiPage.get(1))
        );

        // 크롱
        Player crong = new Player(
                "crong", resultMax(crongPage.get(0), crongPage.get(1))
        );

        return checkWinner(pobi, crong);
    }

    // 승자 여부 판단 메서드
    private static Integer checkWinner(Player pobi, Player crong) {
        if (pobi.getScore() > crong.getScore()) {
            return 1;
        } else if (pobi.getScore().equals(crong.getScore())) {
            return 0;
        }
        return 2;
    }

    // 페이지 검증 메서드
    private static void validatePage(Integer leftPage, Integer rightPage) {
        if (leftPage == null || rightPage == null) {
            throw new IllegalArgumentException();
        }

        if (leftPage + 1 != rightPage) {
            throw new IllegalArgumentException();
        }

        if (leftPage <= MINIMUM || rightPage >= MAXIMUM) {
            throw new IllegalArgumentException();
        }
    }

    // 참여자의 페이지 최댓값 구하는 메서드
    private static int resultMax(Integer leftPage, Integer rightPage) {
        try {
            validatePage(leftPage, rightPage);
        } catch (IllegalArgumentException e) {
            System.out.println(-1);
            System.exit(0);
        }

        int leftPageMax = Math.max(plus(leftPage), multiply(leftPage));
        int rightPageMax = Math.max(plus(rightPage), multiply(rightPage));

        return Math.max(leftPageMax, rightPageMax);
    }

    // 각 자리를 더하는 메서드
    private static int plus(Integer page) {
        int sum = 0;
        while (page != 0) {
            sum += page % 10;
            page = page / 10;
        }
        return sum;
    }

    // 각 자리를 곱하는 메서드
    private static int multiply(Integer page) {
        int sum = 1;
        while (page != 0) {
            sum *= page % 10;
            page = page / 10;
        }
        return sum;
    }
    

잡담

코드를 구성하면서 Player를 조금 더 객체지향적으로 분리하고 싶어 Player 라는 클래스를 통해 생성자를 만들어 각각의 플레이어를 생성해주는 형식으로 코드를 작성하였다.

기능 단위로 메서드를 만들고 검증하는 메서드를 통해 예외를 발생시켜 해당 예외가 발생했을 경우 -1을 return하고 프로그램이 종료되게 구현했다.
물론, 실제라면 이런 예외처리는 하면 안되지만 요구사항에 맞추다보니 예외처리 하는 부분을 저렇게 구현했다.

아쉬운점

예외처리를 할 수 있는 방법이 다양한데 요구사항에 맞춰 최적화된 예외처리가 뭘지 고민되게하는 것 같다.

이러한 상황에서 리뷰받고 성장하는 단계가 있어야 하는데,, 그게 힘드니 역시 우테코를 꼭 들어가야 한다..ㅠ

기능 단위의 분리 또한 메서드들로 분리된 기능들이 잘 분리된건지 고민되게 만드는 것 같다 🥹

profile
내가 몰입하는 과정을 담은 곳
post-custom-banner

0개의 댓글