daily 알고리즘 : 프로그래머스 0 level 9일차

소히·2022년 11월 8일
0

알고리즘Daily

목록 보기
13/22
post-thumbnail

하루에 4문제씩만 풀어야지 했는데 벌써 프로그래머스 0레벨 62문제를 풀었다..! 👍


최댓값 만들기 (1)


문제

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 0 ≤ numbers의 원소 ≤ 10,000
  • 2 ≤ numbers의 길이 ≤ 100

입출력 예

  • 두 수의 곱중 최댓값은 4 * 5 = 20 입니다.

풀이

내림차순으로 sort 후 배열 앞 두 수를 곱해주었다.

function solution(numbers) {
  numbers.sort((a, b) => b - a);
  return numbers[0] * numbers[1];
}

주사위의 개수


문제

머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.


제한사항

  • box의 길이는 3입니다.
  • box[0] = 상자의 가로 길이
  • box[1] = 상자의 세로 길이
  • box[2] = 상자의 높이 길이
  • 1 ≤ box의 원소 ≤ 100
  • 1 ≤ n ≤ 50
  • n ≤ box의 원소
  • 주사위는 상자와 평행하게 넣습니다.

입출력 예

  • 상자의 크기가 가로 10, 세로 8, 높이 6이므로 모서리의 길이가 3인 주사위는 12개 들어갈 수 있습니다.

풀이

주사위는 상자와 평행하게 넣어야하므로 상자의 가로, 세로, 높이를 주사위의 모서리 길이로 나눈 후 곱해주었다.

function solution(box, n) {
  return box.map((el) => ~~(el / n)).reduce((a, b) => a * b);
}


팩토리얼


문제

i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 4 3 2 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.

  • i! ≤ n

제한사항

  • 0 < n ≤ 3,628,800

입출력 예

  • 3! = 6, 4! = 24입니다. n이 7이므로, 7 이하의 최대 팩토리얼인 3을 return 합니다.

풀이

팩토리얼 문제가 나오면 무조건 재귀함수를 써야지! 하는 생각이 코드를 더 복잡하게 만들었다.
다른 사람 풀이를 보면 while문 하나로 문제를 해결하는 경우가 있어서 코드를 참조해왔다.

  • 나의 풀이
function solution(n) {
  let i = 1;

  function fac(num) {
    if (num === 1) return 1;
    return num * fac(num - 1);
  }

  while (fac(i) <= n) {
    i++;
    fac(i);
  }
  return i - 1;
}
  • 다른 사람 풀이
function solution(n) {
  let res = 1;
  let i = 0;

  while (res <= n) {
    i++;
    res *= i;
  }
  return i - 1;
}

합성수 찾기


문제

약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ n ≤ 100

입출력 예

  • 15 이하 합성수는 4, 6, 8, 9, 10, 12, 14, 15 로 8개입니다. 따라서 8을 return합니다.

풀이

n을 1부터 n까지의 수로 나누었을 때 나머지가 0인 값들을 answer 객체에 추가해주었다.
최종적으로 answer객체에 3이상의 값을 가진 Key값만 result 배열에 넣어주었고
result배열의 길이를 return 해주었다.

function solution(n) {
  let answer = {};
  let result = [];
  for (let i = 4; i <= n; i++) {
    for (let k = 1; k <= n; k++) {
      if (i % k === 0) {
        !answer[i] ? (answer[i] = 1) : answer[i]++;
      }
    }
  }
  for (let i in answer) {
    if (answer[i] >= 3) {
      result.push(i);
    }
  }
  return result.length;
}

배열의 유사도


문제

두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ s1, s2의 길이 ≤ 100
  • 1 ≤ s1, s2의 원소의 길이 ≤ 10
  • s1과 s2의 원소는 알파벳 소문자로만 이루어져 있습니다
  • s1과 s2는 각각 중복된 원소를 갖지 않습니다.

입출력 예

  • 입출력 예 #1 -> "b"와 "c"가 같으므로 2를 return합니다.
  • 입출력 예 #2 -> 같은 원소가 없으므로 0을 return합니다.

풀이

map을 이중으로 돌려 같은 값이면 answer을 +1 해주었다.

function solution(s1, s2) {
  let answer = 0;
  s1.map((el) =>
    s2.map((item) => {
      item === el && answer++;
    })
  );
  return answer;
}

삼각형의 완성조건 (1)


문제

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.


제한사항

  • sides의 원소는 자연수입니다.
  • sides의 길이는 3입니다.
  • 1 ≤ sides의 원소 ≤ 1,000

입출력 예

  • [1,2,3] 가장 큰 변인 3이 나머지 두 변의 합 3과 같으므로 삼각형을 완성할 수 없습니다. 따라서 2를 return합니다.

풀이

max값을 골라낸 후 나머지 값들을 더한 값과 비교하여 리턴해주었다.

function solution(sides) {
  let answer = Math.max(...sides);
  sides[sides.indexOf(answer)] = 0;
  let others = sides.reduce((a, b) => a + b);
  return answer < others ? 1 : 2;
}

영어가 싫어요


문제

영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.


제한사항

  • numbers는 소문자로만 구성되어 있습니다.
  • numbers는 "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" 들이 공백 없이 조합되어 있습니다.
  • 1 ≤ numbers의 길이 ≤ 50
  • "zero"는 numbers의 맨 앞에 올 수 없습니다.

입출력 예

  • "onetwothreefourfivesixseveneightnine"를 숫자로 바꾼 123456789를 return합니다.

풀이

answer이라는 변수에 numbers의 단어를 한글자씩 채워 answer값이 alphabet 배열의 값에 포함되어 있으면
res에 해당하는 alphabet 인덱스 값을 추가해주어 리턴하였다.

function solution(numbers) {
  let answer = "";
  let res = "";
  let alphabet = [
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine",
  ];

  for (let i of numbers) {
    answer += i;
    if (alphabet.includes(answer)) {
      res += alphabet.indexOf(answer);
      answer = "";
    }
  }
  return Number(res);
}

0개의 댓글