[JavaScript] 부스트캠프 웹·모바일 자가진단 : 함수구현

전인혁·2022년 6월 24일
1

부스트캠프

목록 보기
1/1
post-thumbnail

문제 분류

함수구현

문제

https://www.boostcourse.org/selfcheck/lecture/1410049

자연수가 들어있는 배열 arr가 매개변수로 주어집니다.

배열 arr안의 숫자들 중에서 앞에 있는 숫자들부터 뒤에 중복되어 나타나는 숫자들 중복 횟수를 계산해서 배열로 return 하도록 solution 함수를 완성해주세요.

만약 중복되는 숫자가 없다면 배열에 -1을 채워서 return 하세요.


입력
숫자 세 개가 주어진다. 이 숫자는 1보다 크거나 같고, 1,000,000보다 작거나 같다. 이 숫자는 모두 다르다.

출력
제일 작은 수, 그 다음 수, 제일 큰 수를 차례대로 출력한다.


예제 입력 1

[1, 2, 3, 3, 3, 3, 4, 4]

예제 출력 1

[4, 2]

예제 입력 2

[3, 2, 4, 4, 2, 5, 2, 5, 5]

예제 출력 2

[3, 2, 3]

예제 입력 3

[3, 5, 7, 9, 1]

예제 출력 3

[-1]

제한사항

- 배열 arr의 길이는 1 이상 100 이하의 자연수입니다.

- 배열 arr의 원소는 1 이상 100 이하의 자연수입니다.

Solution

  • 입력 데이터 가공
    1. 입력 값 가공을 위해 입력 값(input)에서 대괄호( [ ] )와 쉼표( , )를 모두 제거하고 정수형 배열로 변환한다.

    1. input 배열에서, 중복 제거된 비교 대상 배열을 만들기 위해, 원소들을 Set에 담는다.
      3. 자바스크립트 배열의 메소드 filter를 활용하기 위해, Set를 배열(setArray)로 변환한다.
  • 중복 횟수 계산
    1. setArray의 각 원소를 input 배열을 비교하여, 일치하는 원소 개수를 result 배열에 담는다.
    2. 그 다음, result 배열에서 중복 값이 없는 단일 값, 즉 원소 1을 모두 제거한다.

  • 결과 출력
    만약, 모든 원소가 제거되어 result[ ]가 빈배열이 라면, [-1]을 출력한다.
    반대로, 원소가 하나라도 있다면, [원소1, 원소2, ...]을 출력한다.

코드

// 입력 모듈 "fs" 불러오기
const fs = require("fs");
let input = fs.readFileSync("이론/code/dev/stdin").toString();

// 입력 값 가공을 위해 입력 값(input)에서 "[", "]", "," 를 모두 제거하고, 정수형 배열로 변환한다.
input = input
  .replace("[", "")
  .replace("]", "")
  .replace(",", "")
  .split(" ")
  .map((el) => parseInt(el));

// Solution 함수
function Solution(input) {
  let set = new Set();
  let setArray = [];
  let result = [];

  // 중복 제거를 위해 원소들을 Set에 담는다.
  for (let i = 0; i < input.length; i++) {
    set.add(input[i]);
  }

  // 배열 메소드 filter를 활용하기 위해 Set를 중복 제거된 배열로 만든다.
  set.forEach((el) => setArray.push(el));

  // setArray의 각 원소를 input 배열의 원소와 비교하여, 원소 개수를 result 배열에 담는다.
  for (let i = 0; i < setArray.length; i++) {
    result.push(input.filter((el) => el === setArray[i]).length);
  }

  // 이 중, 중복 값이 없는 단일 값을 걸러낸다.
  result = result.filter((el) => el > 1);

  // 만약, 모든 원소가 제거되어 result[]가 빈배열이 되면, [-1]을 출력한다.
  if (result.length === 0) console.log("[" + -1 + "]");
  // 만약 result[]에 원소가 하나라도 있다면, [원소1, 원소2, ...]을 출력한다.
  else console.log("[" + result.join(", ") + "]");
}

// Solution 실행
Solution(input);

느낀 점

6월 27일 응시할 부스트캠프 1차 코딩테스트를 앞두고, 급하게 풀어보았다.

문제 자체는 쉬운 편에 속해서, 빠르게 풀어낼 수 있었다.
풀어보면서, 입력을 가공하고 필터링하여 결과를 원하는 모양으로 출력할 수 있는지를 평가하는 문제라는 생각이 들었다.

좋았던 점은, 내가 자바스크립트 배열의 기본적인 메소드를 잘 활용할 수 있는지, Set의 특성을 잘 알고 있는지 스스로 테스트 해볼 수 있었다.


세 가지 정도 아쉬웠던 점이 있었다.

1. 최초 입력 데이터를 가공할 때, replace 함수를 3번 사용하는 것이 아니라, 정규식을 활용했더라면 더욱 효과적이었을 것 같다.

2. Array filter 메소드를 활용하기 위해 Set를 배열로 변환했는데, 그냥 Set의 has 메소드를 활용했으면 배열로의 변환이 필요없었다..

3. 모든 로직을 Solution 함수에 작성했는데, 기능별로 함수화하여 코드 가독성을 높였어야 했다.

간단한 문제였지만 코드에 대해 여러 방면으로 고민해볼 수 있게해준 좋은 문제였다.

profile
Front-end Developer

0개의 댓글