프로그래머스/Lv. 0(코딩테스트 입문)

[프로그래머스 코딩테스트] 피자 나눠 먹기(2)(Java)

Sigfriede 2023. 3. 23. 22:45

  문제 설명

  머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

 

  제한사항

  • 1 <= n <= 100

 

  입출력 예

n result
6 1
10 5
4 2
class Solution {
    public int solution(int n) {
        int answer = 0;
        int max;
        int pizza = 6;
        
        if (pizza <= n) {
            max = n;
        } else {
            max = pizza;
        }
        
        for (int i = max; max <= i; i++) {
            if (i % n == 0 && i % pizza == 0) {
                answer = i / pizza;
                break;
            }
        }
        return answer;
    }
}

  이 문제는 초반에 풀었던 문제인데, 지금 코드를 다시 보면서 다음부터는 꼭 변수명을 잘 써야겠다고 생각했습니다. 생각보다 한눈에 잘 들어오지 않는 변수명이어서 처음에는 변수가 무엇을 뜻하는지 한참 고민했어요.

  pizza 변수까지는 안 써도 됐을 것 같긴 하지만, 개인적으로 변수선언을 좋아해서 썼습니다. 그래서 가독성이 더 떨어져보이는 것 같기도 하구요. max는 if문을 통해 n 또는 pizza 중에서 더 큰 값을 저장합니다. 여기서 구한 max값은 for문에서 조건식에 쓰입니다. 이후 n과 pizza의 최소 공배수를 구합니다. 저희가 구해야 할 값은 피자가 몇 판인지 구하는 것이니 6으로 나눠줬구요. 

  하지만 여기에 큰 문제가 있다면 for문의 조건식이 항상 참이라는 점입니다. 코드를 작성해본 지 얼마 되지 않아서 범한 실수였던 것 같습니다. 정답을 맞췄다는 것만으로도 기분이 좋아서 넘어갔나봅니다. 코드를 조금 더 개선해보자면 얼마 전에 다른 게시글에서 언급했던, 유클리드 호제법을 쓰면 조금 더 식이 깔끔해보이지 않았을까 싶습니다.

  최소 공배수(Least[lowest] Common Multi, LCM)를 구하는 법은 두 수(혹은 그 이상)의 최대 공약수를 먼저 구한 후 두 수의 곱셈을 최대 공약수로 나눠주면 됩니다.

public int lcm(int a, int b) {
    int gcd = gcd(a, b);
    return (a * b) / gcd;
}

  최대 공약수 구하는 법은 아래 링크로.

  [프로그래머스 코딩테스트] 분수의 덧셈(Java) https://sigfriede.tistory.com/16