프로그래머스 문제풀기

프로그래머스 14탄-(코딩도장 아마존 면접문제)

Hyeon been 2023. 5. 31. 20:47

한번씩 읽고 가세요.

“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90

1.

다음과 같은 형태의 배열을

[a1,a2,a3...,an,b1,b2...bn]

다음과 같은 형태로 바꾸시오

[a1,b1,a2,b2.....an,bn]

풀이

// swap을 하는 방법
const arr = [10, 20, 30, 40, 50, 60];

[arr[1], arr[2]] = [arr[2], arr[1]];

console.log(arr);

//
const l = ['a1','a2','a3','a4','a5','b1','b2','b3','b4','b5']

function solution(list) {
    var n = list.length / 2;
    for (let i = 1; i < n; i++) {
        for (let j = i * 2 - 1; j < n + i; j++) {
            [list[j], list[n + i - 1]] = [list[n + i - 1], list[j]];
        }
    }
    return list;
}

console.log(solution(l));

주어진 배열 arr에서 두 요소의 위치를 서로 바꾸는 방법을 보여주고 있습니다.

  1. 주어진 배열 arr의 두 요소를 서로 교환하기 위해 배열 비구조화 할당(destructuring assignment)을 사용합니다.
  2. [arr[1], arr[2]]는 첫 번째 요소와 두 번째 요소를 배열로 묶은 것입니다.
  3. [arr[2], arr[1]]는 두 번째 요소와 첫 번째 요소를 배열로 묶은 것입니다.
  4. [arr[1], arr[2]] = [arr[2], arr[1]]은 왼쪽의 배열과 오른쪽의 배열을 비구조화 할당하여 요소의 위치를 서로 바꿉니다.
  5. console.log(arr)을 통해 바뀐 배열 arr을 출력합니다.

따라서, [10, 30, 20, 40, 50, 60]이 출력됩니다.

두 번째 코드는 주어진 배열 list의 요소를 일정한 패턴으로 서로 바꾸는 함수 solution을 정의하고, 주어진 배열 l에 대해 테스트하는 부분입니다. 코드를 해석해보면 다음과 같습니다:

  1. solution 함수는 list라는 매개변수를 받습니다.
  2. n 변수에 list의 길이를 2로 나눈 값을 할당합니다. (배열이 어떤 패턴으로 구성되어 있는지에 따라 계산됩니다.)
  3. 중첩된 반복문을 사용하여 요소의 위치를 서로 바꿉니다.
    • 외부 반복문은 i를 1부터 n까지 증가시킵니다.
    • 내부 반복문은 j를 (i * 2) - 1부터 n + i - 1까지 증가시킵니다.
    • 비구조화 할당을 사용하여 요소의 위치를 서로 바꿉니다.
  4. 바뀐 배열 list를 반환합니다.
  5. console.log(solution(l))을 통해 함수 solution을 호출한 결과를 출력합니다.

따라서, solution 함수는 배열 l의 요소를 일정한 패턴으로 서로 바꾸고, [ 'a1', 'a3', 'a2', 'b1', 'b3', 'b2', 'a4', 'a5', 'b4', 'b5' ]가 출력됩니다. 배열 l의 요소들이 a와 b로 구성되어 있으며, a와 b의 순서가 바뀌는 패턴으로 배열이 재정렬되었습니다.

2.

기계를 구입하려 하는데 이 기계는 추가 부품을 장착할 수 있다. 추가 부품은 종류당 하나씩만 장착 가능하고, 모든 추가 부품은 동일한 가격을 가진다.

원래 기계의 가격과 성능, 추가 부품의 가격과 각 부품의 성능이 주어졌을 때, 추가 부품을 장착하여 얻을 수 있는 최대 가성비를 정수 부분까지 구하시오(가격 및 성능은 상대적인 값으로 수치화되어 주어진다).

e.g.)

원래 기계의 가격 : 10

원래 기계의 성능 : 150

추가 부품의 가격 : 3

추가 부품의 성능 : 각각 30, 70, 15, 40, 65

추가 부품을 장착하여 얻을 수 있는 최대 가성비 : 17.81... → 17

(성능이 70과 65인 부품을 장착하면 됨)

풀이

let 가격 = 10
let 성능 = 150
let 부품가격 = 3
let 부품성능 = [30, 70, 15, 40, 65]

부품성능.sort((a, b) => a - b)
부품성능.sort((a, b) => b - a)

for (let i of 부품성능){
    if ((성능 / 가격) > ((성능 + i) / (가격 + 부품가격))) {
        break
    } else {
        성능 += i
        가격 += 부품가격
    }
}
console.log(~~(성능/가격))
  1. 주어진 변수들은 다음과 같습니다:
    • 가격은 초기 가격을 나타냅니다. (10)
    • 성능은 초기 성능을 나타냅니다. (150)
    • 부품가격은 각 부품의 추가 가격을 나타냅니다. (3)
    • 부품성능은 부품의 성능을 담은 배열입니다. (예: [30, 70, 15, 40, 65])
  2. 부품성능 배열을 오름차순으로 정렬합니다. (부품성능.sort((a, b) => a - b))
  3. 부품성능 배열을 내림차순으로 정렬합니다. (부품성능.sort((a, b) => b - a))
    • 이렇게 하면 부품 성능이 내림차순으로 정렬됩니다.
  4. for...of 문을 사용하여 부품 성능을 하나씩 확인합니다.
    • 각 부품 성능 i에 대해, (성능 / 가격)과 (성능 + i) / (가격 + 부품가격)의 비율을 비교합니다.
    • 만약 (성능 / 가격)이 더 크다면, 즉 성능 대비 가격 비율이 더 크다면 반복문을 종료합니다.
    • 그렇지 않으면, 성능과 가격을 갱신합니다. 성능은 i만큼 증가시키고, 가격은 부품가격만큼 증가시킵니다.
  5. 최종적으로 성능 대비 가격 비율을 구하여 소수점 이하를 버린 후, console.log를 사용하여 결과를 출력합니다. (~~(성능/가격))

따라서, 주어진 가격과 성능에 대한 정보를 기반으로 성능 대비 가격 비율이 최대가 되는 부품을 찾아 그 값을 출력합니다.