[수학] 4. 문제 풀이 (1)




1. 등차수열의 항 찾기

입력된 값을 통해서 등차 수열의 볓 번째 항인지를 구하는 프로그램을 작성하시오.
입력은 초항 a, 인접한 차이 d, 찾는 항의 수 n이 주어지며, n 값에 해당하는 항 번호를 반환한다.
단, 만약 항 번호가 없을 시에는 -1을 반환한다.
예를 들어 a=1, d=2, n=7이 주어졌을 때, 4를 반환한다.


function answer(a, d, n) {
  let index = -1;
  //   구현
  if ((n - a) % d == 0) {
    index = (n - a) / d + 1;
  }

  // 구현 종료
  return index;
}

let input = [
  // TC : 1
  [1, 2, 7],
  // TC : 2
  [2, 3, 10],
  // TC :3
  [3, 5, 23],
];

for (let i = 0; i < input.length; i++) {
  console.log(`#${i + 1} ${answer(input[i][0], input[i][1], input[i][2])}`);
}

// #1 4
// #2 -1
// #3 5
function answer(a, d, n) {
  let index = -1;
  //   구현

  // 등차수열
  let num;
  // 언제까지 증가할지는 모르겠지만 break 는 내부 코드에 있다.
  for (let i = 1; ; i++) {
    // 등차수열 점화식
    num = a + d * (i - 1);

    if (num > n) {
      index = -1;
      break;
    }

    // 답 찾음
    if (num == n) {
      index = i;
      break;
    }
  }

  // 구현 종료
  return index;
}

점화식을 직접 만드는 경우를 보고 내 방법이 너무 야매인가..?했는데 바로 다음으로 내 방법 그대로 나와서 뿌듯했다.ㅋㅋㅋ (내가 만든 방법이 더 좋은 방향이라했다.🤓)



2. 잃어버린 카드 찾기

등차 수열을 이루는 4개의 숫자 카드를 받았는데, 한 카드를 잃어버렸다.
잊어버린 카드를 찾아주자.
입력은 자연수로 된 3개의 숫자 카드를 받고, 한 가지의 잃어버린 카드의 수를 반환한다.
단, 잃어버린 카든느 가운데 숫자 카드로 한정한다.
예를 들어 1,7,10을 입력받았을 때 초항이 1이고, 두수의 차가 3인 등차수열 1,4,7,10을 찾아 4를 반환하도록 한다.

function answer(a, b, c) {
  let number = 0;

  // sort
  num = [a, b, c].sort((x, y) => x - y);

  //   구현
  let min = Number.MAX_SAFE_INTEGER;
  let max = Number.MIN_SAFE_INTEGER;
  let d = 0;
  for (let i = 0; i < num.length - 1; i++) {
    d = num[i + 1] - num[i];
    min = min > d ? d : min;
  }
  for (let i = 0; i < num.length - 1; i++) {
    d = num[i + 1] - num[i];
    if (max < d) {
      max = d;
      number = num[i + 1] - min;
    }
  }
  // 구현 종료
  return number;
}

let input = [
  // TC : 1
  [1, 7, 10],
  // TC : 2
  [3, 8, 18],
  // TC :3
  [2, 5, 11],
];

for (let i = 0; i < input.length; i++) {
  console.log(`#${i + 1} ${answer(input[i][0], input[i][1], input[i][2])}`);
}

// #1 4
// #2 13
// #3 8

진짜 오래 걸려서 했는데,,, 너무 중복코드가 많고 더럽다.

sort 정렬 기억하기


function answer(a, b, c) {
  let number = 0;

  // sort
  num = [a, b, c].sort((x, y) => x - y);

  //   구현

  // 1. get d > 등차값 찾기
  let d = 0;
  for (let i = 1; i < num.length; i++) {
    d += num[i] - num[i - 1];
  }
  d /= num.length;

  //2. 빈 Index 찾기
  let index = num[2] - num[1] > num[1] - num[2] ? 2 : 1;

  // 3. 이전 값 + d
  number = num[0] + d * index;
  // 구현 종료
  return number;
}

우와…너무 깔끔해서 말이 안나온다… 등차수열 d는 누적합/갯수로도 구할수 있구나.. 배열 index 초과되지 않기위해 1부터 시작하는 것도 기억해둬야겠다. 와… 진짜 코드 깔끔하고 짱이다….. 구하려는 순서는 똑같았는데 방식이 완전 다르다… 반성하자!



3. 문자열을 정수로 바꾸기

programmers

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

s의 길이는 1 이상 5이하입니다.
s의 맨앞에는 부호(+, -)가 올 수 있습니다.
s는 부호와 숫자로만 이루어져있습니다.
s는 “0”으로 시작하지 않습니다.

예를들어 str이 “1234”이면 1234를 반환하고, “-1234”이면 -1234를 반환하면 됩니다.
str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.

function solution(s) {
    var answer = 0;
    answer = Number(s)
    return answer;
}
  • 문자형은 사칙연산하면 문자형이 된다. answer = s/1
  • int to string > "" + int
  • string to int > +string



4. 짝수와 홀수

programmers

정수 num이 짝수일 경우 “Even”을 반환하고 홀수인 경우 “Odd”를 반환하는 함수, solution을 완성해주세요.

num은 int 범위의 정수입니다.
0은 짝수입니다.

function solution(num) {
    var answer = '';
    answer = num % 2 == 0 ? "Even" : "Odd"
    return answer;
}
  • num % 2 ? "Odd" : "Even"; 0은 false 값을 활용한 코드



5. 2016년

programmers
2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요.
요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT

입니다.
예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 “TUE”를 반환하세요.

2016년은 윤년입니다.
2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

function solution(a, b) {
  let date = new Date(2016, a-1, b);
  const day = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
  return day[date.getDay()];
}

return ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"][new Date(2016, a-1, b).getDay()]



6. 폰켓몬

programmers
당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다.
따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다.
예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다.
이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.

첫 번째(3번), 두 번째(1번) 폰켓몬을 선택
첫 번째(3번), 세 번째(2번) 폰켓몬을 선택
첫 번째(3번), 네 번째(3번) 폰켓몬을 선택
두 번째(1번), 세 번째(2번) 폰켓몬을 선택
두 번째(1번), 네 번째(3번) 폰켓몬을 선택
세 번째(2번), 네 번째(3번) 폰켓몬을 선택
이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은 한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다.
따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다.
N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.

function solution(nums) {
  let set = new Set()
  for (let item of nums) {
      set.add(item)
  }
  return set.size >= nums.length/2 ? nums.length/2 : set.size
}
function solution(nums) {
  let max = nums.length/2
  let choice = new Set(nums).size
  return choice > max ? max : choice
}
function solution(nums) {
  const max = nums.length / 2;
  const arr = [...new Set(nums)];

  return arr.length > max ? max : arr.length
}



7. 가운데 글자 가져오기

programmers

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

s는 길이가 1 이상, 100이하인 스트링입니다.

function solution(s) {
  let arr = [...s];

  return arr.length % 2 == 0
    ? arr[arr.length / 2 - 1] + arr[arr.length / 2]
    : arr[parseInt(arr.length / 2)];
}
👍👍
function solution(s) {
    return s.substr(Math.ceil(s.length / 2) - 1, s.length % 2 === 0 ? 2 : 1);
}
function solution(s) {
    const mid = Math.floor(s.length/2);
    return s.length %2 === 1 ? s[mid] : s[mid-1]+s[mid];
}

굳이 배열로 바꾸지 않아도 됐다. (문자열도 인덱스 접근 가능했는데 왜그랬지……..?)

Math 함수도 있는다는 것 잊지말기

길이 기반의 자르기는 substr