728x90

문제


https://school.programmers.co.kr/learn/courses/30/lessons/17677

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드


function solution(str1, str2) {
  str1 = str1.toUpperCase();
  str2 = str2.toUpperCase();

  const strToSet = (str) => {
    let set = [];

    for (let i = 1; i < str.length; i++) {
      if (/^[a-z|A-Z]+$/.test(str[i - 1]) && /^[a-z|A-Z]+$/.test(str[i])) {
        set.push(str[i - 1] + str[i]);
      }
    }

    return set;
  };

  const jaccard = (arr1, arr2) => {
    let similarity = 0;

    // arr1, arr2 모두 공집합이면 J(A, B) = 1
    if (arr1.length === 0 && arr2.length === 0) similarity = 1;
    else {
      let union = []; // 합집합
      let intersection = []; // 교집합

      for (let i = 0; i < arr2.length; i++) {
        // arr2의 각 요소에 대해 arr1에도 존재한다면
        if (arr1.indexOf(arr2[i]) >= 0) {
          // 교집합에 해당 요소 넣고 arr1에서 해당 요소 삭제
          intersection.push(arr1.splice(arr1.indexOf(arr2[i]), 1));
        }
        // 합집합에 arr2의 요소 모두 넣기
        union.push(arr2[i]);
      }

      // 합집합에 교집합에서 삭제된 요소 외의 arr1의 요소 모두 넣기
      for (let i = 0; i < arr1.length; i++) {
        union.push(arr1[i]);
      }

      similarity = intersection.length / union.length;
    }

    return similarity;
  };

  let set1 = strToSet(str1);
  let set2 = strToSet(str2);
  let answer = jaccard(set1, set2);

  return parseInt(answer * 65536);
}

 

후기


  • 입력으로 받는 문자열을 집합으로 묶는 함수와, 자카드 유사도를 return하는 함수 두개를 만들어 코드를 짰다. 다른 부분은 쉽게 코드를 짰지만 다중집합에서의 합집합, 교집합을 구하는 데는 생각의 시간이 조금 필요했다. 
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀
728x90

문제


https://school.programmers.co.kr/learn/courses/30/lessons/64065?language=javascript 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드


function solution(s) {
  let answer = [];
  let sArr = [];

  // 문자열로 된 튜플 처리
  s = s.slice(2, s.length - 2).split(/},{/g);
  for (let i of s) {
    i = i.split(",").map((num) => Number(num));
    sArr.push(i);
  }
  // 길이순으로 오름차순 정렬
  sArr.sort((a, b) => a.length - b.length);

  for (let i of sArr) {
    for (let num of i) {
      if (!answer.includes(num)) answer.push(num);
      else continue;
    }
  }

  return answer;
}

 

후기


  • 문제의 규칙을 찾으면 쉽게 풀 수 있는 문제였다. 입력으로 받는 문자열로 된 튜플은 간단한 문자열 처리 과정을 통해 해겨했다. 
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/72411

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

 

코드


function solution(orders, course) {
  let answer = [];
  const list = {};

  // 조합
  const getCombination = (arr, selectNumber) => {
    const result = [];
    if (selectNumber === 1) return arr.map((value) => [value]);

    arr.forEach((fixed, index, origin) => {
      const rest = [...origin.slice(index + 1)];
      const combinations = getCombination(rest, selectNumber - 1);
      const attached = combinations.map((combination) => [
        fixed,
        ...combination,
      ]);

      result.push(...attached);
    });
    return result;
  };

  // 각 주문에 대해
  orders.map((order) => {
    const orderArr = order.split("").sort();

    for (let i = 2; i <= orderArr.length; i++) {
      // 원하는 조합구성 개수가 아닌 경우 넘어가기
      if (!course.includes(i)) continue;

      // 각 주문에 대한 모든 알파벳 조합 구하기
      const combs = getCombination(orderArr, i);
      combs.map((comb) => {
        const string = comb.join("");
        // 알파벳 조합에 대한 개수 구하기
        list[string] = list[string] ? list[string] + 1 : 1;
      });
    }
  });

  // 객체 list의 key, value를 배열로 구하기
  let listArr = Object.entries(list);
  course.map((amount) => {
    // 조합구성의 개수와 길이가 맞는 알파벳 중에서 2개이상인 것들은 후보로 담기
    const candidates = listArr.filter(
      (el) => el[0].length === amount && el[1] > 1
    );

    if (candidates.length > 0) {
      // 후보 중에서 가장 많이 주문된 조합을 정답에 담기
      let max = Math.max(...candidates.map((el) => el[1]));
      candidates.map((el) => {
        if (el[1] === max) answer.push(el[0]);
      });
    }
  });

  // 사전순으로 정렬하여 return
  return answer.sort();
}

 

후기


  • 조합과 객체, 배열의 특징을 잘 이용하여 풀 수 있는 문제였다.
  • 조합이나 순열이 약하거나 객체, 배열의 쓰임새에 대한 연습이 필요하면 풀기 좋은 문제인 것 같다. 
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/62048

 

코딩테스트 연습 - 멀쩡한 사각형

가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을

programmers.co.kr

 

코드


function solution(w, h) {
  let answer = w * h;
  let GCD = 0;

  // 유클리드호제법으로 최대공약수 구하기
  const getGCD = (num1, num2) => {
    if (num2 === 0) return num1;
    else return getGCD(num2, num1 % num2);
  };

  GCD = getGCD(w, h);
  answer = answer - (w + h - GCD);

  return answer;
}

 

후기


  • 이 문제를 풀기 위해서 최대공약수를 이용해야하고, 시간복잡도를 생각해 유클리드호제법을 사용하였다.
  • 사각형의 꼭짓점을 이었을 때, 지나치는 사각형의 개수는 (사각형의 가로 + 사각형의 세로 - 가로 세로의 최대공약수) 공식으로 구할 수 있다.
  • 해당 공식이 적용되는 이유는, 가로 세로가 서로소인 경우에는 항상 (가로 + 세로 - 1) 의 공식이 적용된다.
  • 하지만 서로소가 아닌 경우에는 최대공약수만큼 (가로 + 세로 - 1) (이 때, 가로 세로는 서로수) 을 적용시킬 수 있다.

잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀

+ Recent posts