JavaScript - 프로그래머스 레벨 : 2(10) - ORDER BY '정답률'

먹보·2023년 3월 28일
0
post-thumbnail

1. n^2 배열 자르기

문제 설명

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
=> 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
4. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.

예제

코드

//런타임 에러 풀이법
function solution(n, left, right) {
    const result = [];
    for (let i = 1 ; i <= n ; i++){
      for (let j = 1 ; j <= n ; j++){
        result.push(Math.max(i,j))
      }
    }
    return result.slice(left,right+1);
}
//런타임 개선 풀이법
function solution(n, left, right) {
  const result = new Array(right - left + 1);
  for (let i = left; i <= right; i++) {
    const row = Math.floor(i / n);
    const col = i % n;
    result[i - left] = Math.max(row, col) + 1;
  }
  return result;
}

🗒️코멘트

gif가 없었다면 문제를 이해하는데 꽤 오랜 시간이 걸렸을 것 같다.

우선 Gif가 있기 때문에 바로 손코딩을 시작했고 다음과 같은 규칙을 발견하였다.

행과 열이 3인 정사각형의 배열이 주어졌을 때,

1x1 = 1, 1x2 = 2, 1x3 = 3, 2x1 = 2, 2x2 = 2, 2x3 = 3...의 패턴을 보았고

행과 열이 숫자로 주어졌을 때 그것의 최대값이 그 위치의 원소가 될 수 있다는 점을 깨닫고 바로 이중 for문을 사용해서 구현을 했더니..역시나 runtime 에러가 발생. 접은을 달리해야 될 것 같다는 생각이 들었다.

그래서 접근 법을 달리했는데 바로, 배열의 크기를 제한한 후 그 배열안에 해당 요소를 직접 넣어주는 방식을 택한 것이다.

손코딩을 하여 left와 right을 기준으로 열과 행에 대한 값을 계산을 해보니 역시나 규칙이 있었고 그걸 적용한 것이 for문 내부에 있는 row와 col이다.

for (let i = left; i <= right; i++) {
    const row = Math.floor(i / n);
    const col = i % n;
    result[i - left] = Math.max(row, col) + 1;
  }

2. 위장

문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

예제

코드

function solution(clothes) {
    const clothesSet = new Map();
    clothes.forEach((el) => {
        clothesSet.get(el[1]) ? clothesSet.set(el[1],clothesSet.get(el[1])+1) : clothesSet.set(el[1],1)
    })
    if(clothesSet.size === 1){
      return [...clothesSet.values()][0]
    } else {
      const numOfClothes = [...clothesSet.values()]
      return numOfClothes.reduce((a,b) => (a)*(b+1),1)-1 
    }
}

🗒️코멘트

생각보다 간단했던 문제였다.

쉽게 말해 이 문제는 중학교 때 풀었던 조합문제랑 동일 선상에 놓았고 그 문제를 풀기 위해서는 각 옷의 종류에 갯수를 구하는데

이 때 해시맵을 사용해서 옷의 가지수를 담고 조합 공식을 reduce 메서드에 적용해 값을 반환해주었다.


profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글