Programmers/Level 0

<22.11.10>프로그래머스 Level 0 문제 풀이 #15

mayberry 2022. 11. 10. 11:46

Programmers Level 0 문제 풀이 #15 : 22-11-10

 

Programmers Level 0 문제 풀이 #15 : 22-11-10

 

 

15-1. 삼각형의 완성조건(2)

 

문제)

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

  • 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.

 

내가 작성한 답안)

const solution = (sides) => {
  //22-11-10
  //0. 배열 sides에서 가장 긴 변(a)에서, a와 가장 짧은 변(b)을 뺸 값을 다시 뺀다.
  //1. sides 배열 원소의 합에서 sides 배열 내에 가장 긴 변을 뺀 뒤 1을 뺀 값을 반환한다.
  //2. 1번과 2번 값을 더한 뒤 반환한다.
  const innerLongest = Math.max(...sides) - (Math.max(...sides) - Math.min(...sides));
  const outerLongest = sides.reduce((acc, cur) => acc + cur) - Math.max(...sides) - 1;
  return innerLongest + outerLongest;
}

 

 

15-2. 등수 매기기

 

문제)

영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

내가 작성한 답안)

const solution = (score) => {
  //22-11-10
  // 0. score에 존재하는 원소들의 평균들로 이루어진 score1 배열과 score1 배열을 오름차순 정렬한 score2 배열을 생성한다..
  // 1. score1 배열을 순회하여 score2.indexOf(it)을 이용하여 score2에서의 인덱스를 score1 배열에 삽입한다.
  // 2. 리턴
  let averageArr = score.map(it => (it[0] + it[1]) / 2);
  let sortedArr = score.map(it => (it[0] + it[1]) / 2).sort((a, b) => b - a);
  return averageArr.map(it => sortedArr.indexOf(it) + 1);
}

 

 

15-3. 로그인 성공?

 

문제)

머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.

  • 아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
  • 로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.

 

내가 작성한 답안)

const solution = (id_pw, db) => {
  //22-11-10
  //0. db 배열을 순회하여 아이디(key) - 패스워드(value) 형태의 객체를 생성한다.
  //1. obj에 a와 b를 대입한다.
  //1-A. undefined가 발생할 경우 => 아이디가 없다는 의미이므로 fail
  //1-B. obj에서 a의 value가 id_pw의 비밀번호와 일치하는지 확인한다.
  //1-B-a. 일치할 시 login 리턴
  //1-B-b. 일치하지 않을 시 wrongpw
  const [id, pw] = id_pw;
  let dbObj = db.reduce((acc, cur) => ({
    ...acc,
    [cur[0]]: cur[1],
  }), {})

  if (dbObj[id] !== undefined) {
    if (dbObj[id] === pw) {
      return 'login';
    } else {
      return 'wrong pw';
    }
  } else {
    return 'fail';
  }
}

 

 

15-4. 치킨 쿠폰

 

문제)

프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.

 

내가 작성한 답안)

const solution = (chicken) => {
  //22-11-10
  //0. chicken의 값이 1이 될 때까지 10으로 나누고, 나눈 몫과 나머지를 지속적으로 체크한다.
  //1. 10으로 나눌 때마다 나온 몫은 sum(주문할 수 있는 치킨)에 합산
  //2. 10으로 나눌 때마다 나온 나머지는 10으로 나누었을 때 1이 되었을 경우 sum에 합산
  // let restCpn = 0;
  let purchase = chicken;
  let coupon = 0;
  let sum = 0;
  while (chicken >= 10) {
    chicken = Math.floor(chicken / 10);
    coupon = coupon + (chicken % 10) + (chicken < 10 ? chicken : 0);
    if (coupon >= 10) {
      sum += Math.floor(coupon / 10);
      coupon = coupon % 10;
    }
    sum += chicken;
  }

  return sum;
}

 

실제 답안)

function solution(chicken) {
    let answer = 0;
    let rest = 0;
    while(chicken > 1) {
        answer += parseInt(chicken / 10);
        rest += chicken % 10;
        chicken = chicken / 10;
    }
    answer += parseInt(rest / 10);
    return answer;
}

* 내가 작성한 답안은 틀린 답안이 많았다. 쿠폰으로 시킨 후 또다시 남은 쿠폰들을 처리하는 것이 관건이었는데, 그 쿠폰들이 다시 10개가 모였을 때 전체 주문한 치킨 수에 반영하는 것을 너무 어렵게 생각했나보다.