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

서론

배열과 관련된 문제를 풀 때마다 slice()함수가 정말 많이 유용하게 사용되고 있음에도 불구하고, 쓸 때마다 자꾸 헷갈리는 부분이 있어서 그걸 제대로 잡고자 쓰는 글이다.

 

본론

slice() 함수

  • 생김새 : arr.slice(begin, end) (end는 생략 가능)
  • 배열의 begin index부터 (end-1) index 까지 반환해주는 함수이다.
  • 매개변수로 index의 범위가 넘어가는 수가 들어가면 빈 배열을 반환한다.
  • 원본 배열을 훼손하지 않는 것이 splice()와 가장 큰 차이점이다.
  • 즉, 새로운 배열로 반환해주는 것이다.
  • 개인적으로 slice() 함수에서 헷갈리는 부분이 두 가지가 있었다.
    • end index가 생략될 수도 있다는 점과, end index는 실제로 (end-1) index까지 적용된다는 점이다. end index가 생략된 경우에는 자동으로 해당 배열의 마지막 값까지 자른다는 의미이다.
    • 매개변수로 음수값이 들어갈 수도 있다. 예를 들어, -1은 해당 배열의 가장 마지막 값, -2는 해당 배열의 가장 마지막 값에서 두번째 값 ... 이런식으로 배열의 마지막을 기준으로 1, 2, 3... index로 생각하면 된다. 근데 이게 음수는 좀 예외적으로 이해해야 할 부분이 있다.
  • 다양한 예시를 들어서 이해해보자!
    /* slice함수 연습 */
    let sliceTest = [1, 2, 3];
    console.log(sliceTest.slice(0)); // [1, 2, 3]
    console.log(sliceTest.slice(0, 0)); // []
    console.log(sliceTest.slice(0, 1)); // [1]
    console.log(sliceTest.slice(-1)); // [3]
    console.log(sliceTest.slice(0, -1)); // [1, 2]
    console.log(sliceTest.slice(0, -2)); // [1]
    console.log(sliceTest.slice(0, -3)); // []
    console.log(sliceTest.slice(-1, 1)); // []
    console.log(sliceTest.slice(-3, -1)); // [1, 2]
  • slice() 배열로 활용될 수 있는 다양한 예시들이다. 맨 처음 예시처럼 0만 매개변수로 들어간 경우에는 start = 0 index라는 의미이고, end가 없으니 시작 index인 1부터 자동으로 배열의 끝인 3까지 반환해주는 것이다.
  • 그리고 가장 헷갈렸던 음수값이 들어갔을 때는 다음과 같이 이해하면 쉽다.
    [ 1, 2, 3 ]
      0  1  2  << index
     -3 -2 -1 << index​
  • slice() 함수에서 배열 [1, 2, 3]은 위와 같은 index를 갖게 된다. (실제로 음수 index를 가지는 것은 아니고, 이해를 위해 index라고 표현했다)
  • 이 배열에서 slice(0, -1)을 하면 [1, 2]를 반환하게 된다. 이는 index의 위치를 보면 slice(0, 2)과 비슷하니까 이해가 쉬웠다. 그런데 slice(-1, 1)은 뭔가 [3]이 반환될 것 같았는데 보다시피 [] 빈배열이 반환된다. 왜 그런지 생각해봤더니 slice함수의 매개변수는 내가 적어놓은 index의 오른쪽 방향으로 가는 경우에만 적용이된다는 사실을 알아냈다.
  • 무슨 의미냐면 (0, 1) or (-3, -1) or (1, -1) or (0, -2)와 같이 start index가 end index보다 더 왼쪽에 위치한 경우에는 적용이 되지만, (2, 1) or (1, 0) or (2, 0) or (-1, -3) or (-1, 0) 과 같이 start index가 end index보다 더 오른쪽에 위치한 경우에는 빈 배열이 반환된다.
  • 이 사실을 알고 나니 slice 함수의 매개변수로 어떤 값이 들어가도 이제 헷갈리지 않았다. 이제 이해한 걸 바탕으로 문제 풀 때 잘 적용만 시키면 될 것 같다!
728x90

문제


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

 

코딩테스트 연습 - 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2

programmers.co.kr

 

코드


function solution(num) {
  let answer = 0; //정답 변수
  if (num === 1) return 0; //num이 1이면 코드를 실행할 필요가 없으니 0 return
  while (true) {
    if (num % 2 === 0) {
      num = num / 2;
      answer++;
    } else {
      num = num * 3 + 1;
      answer++;
    }

    if (num === 1) break; //num이 1이 되면 break
    if (answer > 500) return -1; //500번반복해도 안되면 -1 return
  }
  return answer;
}

 

후기


  • 문제는 쉽게 풀었지만 히든 테스트케이스 13번에 막힌 분들이 조금 있을 것 같다
  • num이 1로 주어졌을 때를 예외처리 해주면 바로 해결할 수 있을 것이다

+ Recent posts