항해99 - 5주차 알고리즘 주차(4)

Charley1013·2022년 4월 10일
0

알고리즘

목록 보기
4/5

🐭 이번 주는 뭐 했어?

자바스크립트 알고리즘

알고리즘 마지막 주차는 기본적인 이진 탐색과 DP에 관련해 공부 했었지만 자바스크립트의 기본적인 내장함수에 대한 복습하는 시간을 가질 겸 프로그래머스 1, 2레벨에 있는 문제를 전체적으로 풀어보는 시간을 가졌었다 이번 포스팅에서는 내장함수를 이용해 자료구조 관련된 문제 중 괜찮았던 문제들을 공유하도록 하겠습니다

프로그래머스 Lv.1

- 두 개 뽑아서 더하기

정수 배열에 담긴 숫자들 중 두 개를 뽑아서 더해서 나오는 숫자들을 오름차순으로 출력하는 문제였습니다 더해서 나오는 숫자가 결과 배열에 들어가 있는지 확인하기 위한 indexOf() 와 그 조건에 맞으면 결과 배열에 push() 하고 마지막으로 오름차순으로 출력하기 위해 sort() 내장함수를 사용했습니다

function solution(numbers) {
    const answer = [];
    for(let i=0; i<numbers.length -1; i++) {
        for(let j=i+1; j<numbers.length; j++) {
            const sum = numbers[i] + numbers[j];
            if(answer.indexOf(sum) == -1) {
                answer.push(sum);
            }
        }
    }
    answer.sort((a,b) => a-b);
    return answer;
}

- 가운데 글자 가져오기

string 값에서 가운데 글자를 출력하는 문제였습니다 단어의 길이가 짝수라면 가운데 두 글자를 반환해야 했기 때문에 floor소수점을 제거한 가운데 길이를 구하고 slice() 내장함수를 사용해 가운데를 출력하는 문제였습니다

function solution(n) {
  let al = n.length;
  let num = Math.floor(al / 2);
  if (al % 2 === 1) {
    return n.slice(num, num + 1);
  } else {
    return n.slice(num - 1, num + 1);
  }
}

- 문자열 내림차순으로 배치하기

이 문제는 내장함수만으로 문제를 풀 수 있어서 한번 가져와 봤습니다 split()으로 문자열을 나누고 sort().reverse()내림차순다시 join()을 사용해 문자열로 만들었습니다

function solution(s) {
    return s
        .split('')
        .sort()
        .reverse()
        .join('');
}

- 소수 찾기 Lv.1

일반적인 소수 찾는 알고리즘을 사용하면 시간초과가 나오는 문제였기 때문에 구글링해본 결과 에라토스테네스의 체라고 2부터 시작해 본인을 제외한 배수를 제거하고 이미 제거된 숫자의 배수는 계산하지 않아도 그 숫자는 소수가 아니라는 것을 증명한 소수 찾기 알고리즘입니다 모든 숫자를 계속해서 검사하지 않아 시간을 절약할 수 있었습니다

function solution(n) {
  let arr = Array(n + 1)
    .fill()
    .map((_, i) => i);

  for (let i = 2; i <= n; i++) {
    if (arr[i] === 0) continue;

    for (let j = i * 2; j <= n; j += i) {
      arr[j] = 0;
    }
  }

  return arr.filter((v) => v !== 0).length - 1;
}

- 정수 제곱근 판별

입력한 값이 제곱근이라면 2 제곱한 값의 +1의 제곱 값을 구하는 문제였습니다 Math 함수 중에 sqrt()을 사용해 루트 값을 구하고 해당 값이 정수를 출력하는 루트 값이 맞다면 pow()를 사용해 +1한 제곱 값을 구합니다

function solution(n) {
  let result = Math.sqrt(n);
  return Math.floor(result) === result ? Math.pow(result + 1, 2) : -1;
}

- 하샤드 수

하샤드 수는 해당하는 양의 정수가 나누어진 양의 정수의 더한 값으로 나누어져야 합니다
우선 문자열로 만들어 자릿수를 나누고 parseInt()로 다시 숫자로 만들고 reduce() 내장 함수를 사용해 자릿수를 더하고 입력된 양의 정수에 나눴을 때 나머지 유무를 리턴해줬습니다

function solution(x) {
  let test = x
    .toString()
    .split("")
    .map((num) => parseInt(num));
  let r = test.reduce((a, b) => a + b);
  let s = x % r === 0 ? true : false;
  return s;
}

프로그래머스 Lv.2

- 올바른 괄호

해당 괄호가 '('과 ')'로 하나의 괄호로 만들어져야 하는 게 문제였습니다 우선은 괄호가 하나로 완성되려면 짝수로 구성돼야 했고 처음 괄호가 ')' 인지 마지막 괄호가 '(' 인지 등을 검사해 올바른 괄호에 대한 유무를 리턴해줬습니다

const solution = (n) => {
  let r = n.split("");
  let sum = 0;
  if (r[0] === ")" || r[0] === r[r.length-1] || r[r.length -1] === "(") {
    return false
  }
  for (let i in r) {
    if (r[i] === "(") {
      sum += 1;
    } else if (r[i] === ")") {
      sum -= 1;
    }
    if (sum < 0) {
      return false
    }
  }
  if (sum > 0) {
    return false;
  } else if (sum === 0) {
    return true;
  }
};

- 최댓값과 최솟값

문자열에서 최댓값과 최솟값을 찾아 문자열로 다시 출력하는 문제였습니다 우선 숫자 마다 공백으로 구분했기 때문에 배열로 만들어 min.apply()max.apply()를 사용해 최댓값과 최솟값을 구했습니다 여기서 apply()는 배열 값에서 최소 최대를 구할 수 있었기 때문에 사용했습니다

function solution(s) {
  let num = s.split(" ");
  return (
    String(Math.min.apply(null, num)) + " " + String(Math.max.apply(null, num))
  );
}

- JadenCase 문자열 만들기

입력된 값을 확인해 공백을 구분해 각 앞자리는 대문자로 출력하는 문제였습니다 우선 공백으로 단어가 나누어져 있기 때문에 각 단어끼리 배열로 만들고 해당 문자를 다시 분리해 0번째 indextoUpperCase()대문자나머지는 toLowerCase()소문자로 만들고 다시 단어를 합쳤습니다 마지막으로 각 값의 마지막은 공백으로 만들어야 했는데 마지막 단어에서는 공백이 필요 없기 때문에 조건부를 만들어 마지막은 공백을 만들지 않도록 문제를 풀었습니다

function solution(s) {
  let n = s.split(" ");
  let arr = [];
  console.log(n);
  n.map((data, index) => {
    for (let i = 0; i < data.length; i++) {
      if (i === 0) {
        arr.push(data[i].toUpperCase());
      } else {
        arr.push(data[i].toLowerCase());
      }
    }
    if (index !== n.length - 1) {
      arr.push(" ");
    }
  });
  return arr.join("");
}

- 가장 큰 수

입력된 배열에 들어간 숫자로 가장 큰 숫자를 만드는 문제였습니다 앞자리와 뒷자리를 더했을 때 더 큰 숫자가 맞는지 확인하기 위해 숫자를 문자로 먼저 만들고 sort() 함수에서 서로 더한 값 중에 더 큰 순서대로 정렬시켜서 마지막으로 나온 값은 join()으로 합쳤습니다 여기서 만약에 배열에 [0,0,0] 이런 식이었다면 결괏값이 "000"이 나오기 때문에 이런 경우는무조건 0이기 때문에 조건부를 만들어줬습니다**

function solution(n) {
  let a = n
    .map((v) => v + "")
    .sort((a, b) => (b + a) - (a + b))
    .join("");
  return a[0] === "0" ? "0" : a;
}

- 124 나라의 숫자

기존에 존재하는 1~10을 표현을 124 나라에서는 1,2,4로만 숫자를 표현했기 때문에 10진법의 숫자가 들어갔을 때 나오는 124 나라의 숫자를 구하는 문제였습니다 1,2,4의 패턴이 존재했었는데

숫자 나머지
1 0 1
2 0 2
3 1 0
4 1 1
5 1 2
6 2 0

나머지가 1,2,0 으로 그때의 124 숫자는 4,1,2가 마지막 자리인 것이라는 패턴을 확인할 수 있었습니다 그 공식을 활용해 3배 배수마다 자릿수를 올려주고 순서대로 4,1,2를 출력해주는 코드를 작성했습니다

function solution(n) {
  let num = ["4", "1", "2"];
  let answer = "";
  while (n > 0) {
    answer = num[n % 3] + answer;
    n = Math.floor((n - 1) / 3);
  }
  return answer
}
profile
프론트엔드 개발자 김찰리

0개의 댓글