배꼽파지 않도록 잘 개발해요

[프로그래머스] 입문 Day 4 수학, 배열 (Javascript) 본문

코딩테스트/프로그래머스

[프로그래머스] 입문 Day 4 수학, 배열 (Javascript)

꼽파 2023. 12. 14. 21:33


피자 나눠 먹기 (1)

문제 설명

  • 머쓱이네 피자가게는 피자를 일곱 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수를 return 하는 solution 함수를 완성해보세요.

제한사항

  • 1 ≤ n ≤ 100

입출력 예

n result
7 1
1 1
15 3


풀이 1

Math.trunc와 삼항연산자 사용

function solution(n) {
    /* 7로 나눌 때 나누어 떨어지는 경우 : 몫
       7로 나눌 때 나누어 떨어지지 않는 경우 : 몫 + 1 
    */
    
    var answer = (n % 7 == 0) ? Math.trunc(n / 7) : Math.trunc(n / 7) + 1 
    return answer;
}

 

풀이 2

Math.ceil

function solution(n) {
    return Math.ceil(n / 7)
}

 

주의할 점

  • 만약 피자 15개를 7조각씩 나누면 2판, 1조각이므로 총 3판이 필요함.
  • 입력값 n이 나누어 떨어지면 상관이 없지만, 만약 소수점이 나오면 올림해서 정수를 출력해야됨.
  • 풀이 2번처럼 간단하게 풀면 될 것을 복잡하게 풀었음.

피자 나눠 먹기 (2)

문제 설명

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

제한사항

  • 1 ≤ n ≤ 100

입출력 예

n result
6 1
10 5
4 2

 

풀이 1

반복문으로 나누어 떨어지는 수를 찾는다

function solution(n) {
    var answer = 0;
    for (let i = 1; i <= 100; i++) {  // 제한사항에 100회 -> n으로 써도 됨
        if ((i * 6) % n == 0) {
            answer = i
            break;
        }
    }
    return answer;
}

 

풀이 2

while 루프로 같은 논리를 구현함

const solution = (n) => {  
	// 전체 조각의 수
    let piece = 6

	// 전체 조각의 수를 나누어 떨어지게 하는 n을 구한다
    while(true) {
        if (piece % n === 0) {
            break
        }
        piece += 6
    }

	// 나누어 떨어지게끔 만들어진 piece를 6으로 나누어서 실제 조각의 수 x를 구함
    return piece / 6  
}

 

주의할 점

  • 어떤 수 n이 주어졌을 때 6x(6의 배수 형태로 나타낼 수 있는 가장 작은 양의 정수 x를 찾는 문제임.
  • 흐름대로 풀면 되는 문제였음.

피자 나눠 먹기 (3)

문제 설명

  • 머쓱이네 피자가게는 피자를 두 조각에서 열 조각까지 원하는 조각 수로 잘라줍니다. 피자 조각 수 slice와 피자를 먹는 사람의 수 n이 매개변수로 주어질 때, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 2 ≤ slice ≤ 10
  • 1 ≤ n ≤ 100

입출력 예

slice n result
7 10 2
4 12 3

 

풀이

Math.ceil을 이용

function solution(slice, n) {
    var answer = 0;
    answer = Math.ceil(n / slice)
    return answer;
}

 

주의할 점

  • 위 피자 나눠 먹기 (1) 문제와 아이디어가 같다.
  • 다만 파라미터를 2개를 받는다는 것이 다르다.

배열의 평균값

문제 설명

  • 정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 0 ≤ numbers의 원소 ≤ 1,000
  • 1 ≤ numbers의 길이 ≤ 100
  • 정답의 소수 부분이 .0 또는 .5인 경우만 입력으로 주어집니다.

입출력 예

numbers result
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  5.5
[89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] 94.0

 

풀이 1

for 반복문을 활용해서 문제 그대로 옮겼음.

function solution(numbers) {
    var average = 0;  // 배열의 평균 (정답)
    var sum = 0;  // 배열 원소 전체의 합
    // 평균 : 원소 전체의 합 / 원소 전체의 개수
    for (i = 0; i < numbers.length; i++) {
        sum += numbers[i]
        answer = (sum / numbers.length)
    }
    return answer;
}

 

풀이 2

반복문을 더 간결하게 썼음.

function solution(numbers) {
    var answer = 0;
    for(i of numbers) {
        answer += i
    }
    return answer / numbers.length;

}

 

풀이 3

reduce를 활용하여 배열의 합을 계산

function solution(numbers) {
	var answer = numbers.reduce((a, b) => (a + b), 0) / numbers.length;
	return answer;
}

 

reduce

· numbers.reduce((a, b) => a + b, 0)
· 배열의 각 요소에 대해 주어진 콜백 함수를 실행하고 누적 값을 계산하는 메소드
· 배열 numbers의 모든 요소를 더하는 표현
- a : 누적합계 (accumulator)
- b : 현재 숫자 (currentValue)

const numbers = [10, 9, 8, 7, 6];

const sum = numbers.reduce((accumulator, currentValue) => {
    return accumulator + currentValue;}, 0);

console.log(sum)
accumulator currentValue
0   (초기값) 10
0 + 10 9
(0 + 10) + 9 8
(0 + 10 + 9) + 8 7
(0 + 10 + 9 + 8) + 7 6

 

최종 : 0 + 10 + 9 + 8 + 7 + 6 = 40

728x90