이제 정말 한달정도 남은 시점에서, 기존의 프로젝트와 서버 개발을 뒤로 미루고 우테코 연습을 해보기위해 이전 기수에서 진행했었던 프리코스 문제들을 풀어보려한다.
해당 포스팅은 이전 기수 프리코스 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하고 프로그램이 종료되게 구현했다.
물론, 실제라면 이런 예외처리는 하면 안되지만 요구사항에 맞추다보니 예외처리 하는 부분을 저렇게 구현했다.
예외처리를 할 수 있는 방법이 다양한데 요구사항에 맞춰 최적화된 예외처리가 뭘지 고민되게하는 것 같다.
이러한 상황에서 리뷰받고 성장하는 단계가 있어야 하는데,, 그게 힘드니 역시 우테코를 꼭 들어가야 한다..ㅠ
기능 단위의 분리 또한 메서드들로 분리된 기능들이 잘 분리된건지 고민되게 만드는 것 같다 🥹