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

Dev_ch·2023년 9월 1일
0

우아한테크 도전기

목록 보기
23/51

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

해당 포스팅은 이전 기수 프리코스 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
내가 몰입하는 과정을 담은 곳

0개의 댓글