JavaScript/알고리즘

프로그래머스 피자 나눠 먹기 (2) JS ( 정확한 범위를 모를때 while문 )

hihiha2 2023. 7. 26. 17:59

문제 설명

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

 

 

 

🙋‍♀️ 내 생각

먼저, 문제에서 찾는값이 어떤 값인지 또 그 값에는 어떤 패턴이 있는지를 분석하기 위해서 반복되는 특징을 적었다.

 

피자가 6조각인 것은 fix된 값이므로 모두 6 이라고 적는다.

그런 다음 (6*피자판의 개수)를 구하면 총 피자조각들의 개수가 된다. 이 값을 다시 사람수인 n으로 나눈다.

이렇게 모두 같은 조각을 먹기위해서는 이렇게 나눈 값이 0이 되어야한다.

 

테스트코드를 통해 확인한 규칙은 아래와 같다.

여기에서 1, 5, 2와 같이 저 자리에 들어갈 값을 구하면 된다.

 

 6* %n ===0
 6* 5 %n ===0
 6* 2 %n ===0

 

 

✅ 내 코드

function solution(n){
    for(i=1; i<=n; i++){
        if(6*i%n===0){
            return i
        }
    } 
}

우선 for문으로 반복문을 만든다. for문 안의 피자가 몇판인지를 나타낸다.

 

for문의 범위1판부터 시작하므로 1부터 시작한다.

이 문제를 풀면서 고민했던 부분은 i의 범위를 어디까지로 지정할 것인가였다.

몇판까지 가야할지는 모르기때문이다. 그래서 일단은 n<=100으로 범위가 정해져있으므로 나올 수 있는 최대범위를 기준으로 범위를 충분히 크게 지정하여서(i<=n) 가능한 모든 경우를 탐색하게 하였다.

 

그리고 if문으로 위에서 찾은 패턴을 기준으로 i의 값을 찾는다.

만약  6*i%n ===0 라면 그 i의 값을 찾으면 된다.

그러면 i의 값이 있을 경우에만 i를 리턴할 것이다.

 

i는 피자가 몇판인지를 나타내므로 원하는 값을 구할 수 있다.

 

 

 

💻  다른사람 코드중에 배울 것  1

const solution = (n) => {
    let piece = 6

    while(true) {
        if (piece % n === 0) {
            break
        }
        piece += 6
    }

    return piece / 6
}

한 판의 피자는 6조각으로 고정되어 있으므로, piece라는 변수를 만들고 6을 초기값으로 할당한다.

piece의 출발값이 6이고 앞으로 이 piece라는 변수에 +1을 하면서 수를 더할 것이기 때문에 piece는 피자조각의 총 수를 나타낸다.

 

그런 다음 while문을 사용해서 조건문을 실행하도록 한다.

while문: 조건문이 참일 때 실행되는 반복문이다. 조건은 문장안이 실행되기 전에 참, 거짓을 판단

    while (condition)
      statement

 

while문의 conditiontrue이기때문에 계속 반복해서 실행할 것이다.

그래서 while문의 안에 if문을 이용해서 조건을 만들어서 만약 그 조건을 충족할 경우에만 break를 통해서 while문을 빠져나오도록한다.

(if문을 충족할 경우에만 while문을 빠져나옴)

 

만약 if문의 조건을 충족하지 않는다면 piece에 +1을 더하고 다시 while문이 반복된다.

 

if문의 조건이  piece%n===0 이다. 피자조각의 합을 사람의 수로 나눈 나머지가 0이라는 것은 모두 같은 수만큼의 피자조각을 먹는 다는 것을 의미한다. 이런 경우 break를 통해서 while문을 탈출하고 piece는 총 조각의 수이고, 구하려는 값은 피자가 몇판인지이므로 piece/6을 통해서 피자의 판수를 구해서 리턴한다.

 

우선 piece라는 변수명이 직관적이라서 코드를 처음 본 사람도 쉽게 의도를 이해할 수 있다.

조건의 범위도 넓게 설정한 것이 아니라 딱 필요한 부분부터 시작하여 조건을 충족하면 반복을 그만두므로 효율적이다.

반복과 조건을 하는 상황이라고 하더라도 while문의 break와 if문을 통해서 가독성이 높으면서도 효율적인 코드를 짤 수 있는 것 같다.

 

 

💻  다른사람 코드중에 배울 것  2

function solution(n) {
    let pizza = 1;
    while (pizza * 6 % n) {
        pizza++;
    }
    return pizza;
}

구하려는 값을 피자조각으로 설정하는 것이 아니라, 바로 피자의 판수로 설정한다.

그래서 변수명을 pizza라고 짓고 1 초기값으로 할당한다.

 

그런 다음 while문 통해서 조건이 참일때만 반복을 실행하도록 한다.

while문의 조건으로  pizza*6%n 을 적는다.

pizza*6피자의 총 조각수를 의미한다. 이것을 사람의 수(n)로 나눈 값이 0이 아닌 경우에는 계속 실행되며 값이 0이 되는 순간 반복문을 빠져나온다.

 

🔫 while문은 조건식이 0(false)이 아닌경우에는 모두 true라고 판단한다.

 

while문은 0이 아니라면 모두 true로 판단하는 특징이 있다. 따라서 나머지가 0이 아닌 경우에는 모두 true로 판단되어 while문이 계속해서 반복된다. 그래서 pizza에 +1을 하면서 반복문을 돌면서 조건문이 0이 되는 순간 while문을 빠져나온다.

 

마지막으로 pizza를 리턴한다.

 

 

 

🙋‍♀️ 내 생각

정확하게 범위를 모르는 경우지만 반복문을 만들어 실행해야할때는 for문이 아니라 while문을 사용하여 조건문을 만족할 경우에만  특정한 식을 수행하도록 한다.

 

while문의 조건을 true로 설정하여 무한루프를 만든 다음, if문을 통해서 특정한 조건일 경우에만 break문을 통해서 무한루프에서 빠져나오도록 함으로써 원하는 값을 구한다.

만일 조건을 만족하지 않는다면 계속해서 반복문을 반복하도록 한다. 반복하면서 어떤 값을 더하거나 빼는 등의 특정한 작업을 수행할 수 있다.

 

while문은 조건이 0이 아닌 경우 모두 true라고 판단하는 특징을 이용하여, while의 조건으로 검사하고 싶은 값을 넣는다. 이 값이 0일 경우에는 false가 되므로 while문을 빠져나오는 성질을 이용한다.

 

위의 문제를 풀면서 어디까지로 범위를 지정할지는 고민했는데, while문을 통해서 굳이 범위를 정확하게 지정하지 않고 조건식을 지정함으로써 문제를 풀 수 있다는 것을 알게 되었다. 또한 piece나 pizza와 같이 직관적은 변수명을 사용함으로써 처음 보는 사람들도 어떤 코드인지 쉽게 이해할 수 있다는 것도 학습했다.