이노캠 5주차(월)-알고리즘 문제풀이

rimhye·2023년 6월 20일
0

이노캠

목록 보기
17/39

📌알고리즘 문제 풀이 리뷰

1. 최소 직사각형

[문제설명]
명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.
아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다. 모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.

[제한사항]
-sizes의 길이는 1 이상 10,000 이하입니다.
-sizes의 원소는 [w, h] 형식입니다.
-w는 명함의 가로 길이를 나타냅니다.
-h는 명함의 세로 길이를 나타냅니다.
-w와 h는 1 이상 1,000 이하인 자연수입니다.

명함번호가로길이세로길이
16050
23070
36030
48040

📖문제풀이

1)팀원풀이

function solution(sizes) {
    const w = []; //가로 길이 배열지정 
    const h = []; //세로 길이 배열 지정

   for(let i = 0; i < sizes.length; i++) {
       const max = Math.max(sizes[i][0], sizes[i][1]); //sizes[i]의 요소 최댓값
       const min = Math.min(sizes[i][0], sizes[i][1]); //sizes[i]의 요소 최소값
       w.push(max);
       h.push(min);
   }
    return Math.max(...w) * Math.max(...h);
    } //spread로 배열 풀어서 곱하기

2)팀원풀이

function solution(sizes) {
    // 긴 길이 요소 중 "가장 긴 요소"
    // 짦은 길이 요소 중 "가장 긴 요소"
    let long = [];
    let short = [];
    
    for(let i = 0; i < sizes.length; i++) {
        // 요소 중 큰 수, 작은 수 분리해서 새로운 배열
        if(sizes[i][0] > sizes[i][1]) {
            long.push(sizes[i][0])
            short.push(sizes[i][1])
        }else {
            long.push(sizes[i][1])
            short.push(sizes[i][0])
        }
    }
    
    // Math.max(long) 을 하면 NaN이 나오는 이유: long의 type은 object라서 전개구문(...)을 사용
    return Math.max(...long) * Math.max(...short)

2.두개 뽑아서 더하기

[문제설명]
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

[제한사항]

  • numbers의 길이는 2 이상 100 이하입니다.
  • numbers의 모든 수는 0 이상 100 이하입니다.

문제풀이

1)내가 푼 풀이

function solution(numbers) {
    let answer = [];
      for(let i=0; i<numbers.length; i++) {
         
        for(let j=0;j<numbers.length-1;j++){
           if(j!==i){    
          answer.push(numbers[i]+numbers[j]); 
         } }
      }  // numbers의 i번째와 j번째 숫자를 더해서 push함
         //j!==i는 같은 인덱스값이 더해지는 일이 있어 제외하도록 함 
  
      const unique = answer.filter((element, index) => {
      return answer.indexOf(element) === index;
  }); //push한 것 중에 중복된 것 없애줌 
      return unique.sort((function(a, b)  {
    return a - b;
  })); //배열을 오름차순으로 정렬
  }

🔨시행착오

맨 처음에 i와 j로 answer.push가 되도록 만든 직후 중복 숫자를 없애고 나서 다른 숫자가 왜 나왔나 고민을 했었다. 그러다 같은 인덱스를 더해서 생긴 문제인걸 알고 그걸 없앨 수 있는 코드를 추가했다. 나는 j!==i로 같은 인덱스를 더하는 문제를 없앴는데 다른 팀원들을 보니 애초에 if문을 돌릴 때 let j=i+1; j<numbers.length; j++)을 집어넣어 더 깔끔하게 만드셨다.

3.같은 숫자는 싫어

[문제풀이]
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,
-arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
-arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

📖문제풀이

나는 처음엔 중복된 숫자를 없애는 것만 생각하다 뒤에 남아있어야 되는 숫자를 남기는 방법에 대해 고민했다. 그러다 포기했는데 팀원분께서 깔끔한 풀이를 발견하셨다.

팀원 풀이

function solution(arr)
{
    let answer = [];
    
    for(let i=0; i<arr.length; i++) {
        if(arr[i]!==arr[i+1]){ //양 옆의 요소를 비교해서 같지 않으면 숫자를 넣도록 함 
            answer.push(arr[i]); //answer.push
        }        
    }
    return answer;
}

✍️느낀점

우리는 페어 프로그래밍을 다같이 해서 challenge과정에 도전했는데, 코드가 비슷하게 나오는 것부터 제각각인 것까지 볼 수 있었다. 정석적인 페어 프로그래밍은 아니지만 다들 어떤 의도로 코드를 짰는지 설명해주는 시간을 가지니 더 이해가 잘 가고 배워야겠다는 의욕이 들었다.
나는 알고리즘 문제를 풀 때 지역변수를 정해놓고 전역변수로 결과를 보려고 하거나, if문이나 for문에서 어디에서 결과를 return해야하는지 헷갈려서 실수하는 일이 많아 기술매니저님께 상담했었다. 내가 기본기가 부족한 것같다고 코드테스트를 하는 것보다 강의를 다시 보며 공부하는게 나을 것 같다고 말씀드리자, 내 말을 듣고는 기본기부족이 아닌 개념의 확립이 안된 것 같다고 말씀하셨다. 그래서 강의를 듣는 것보단 풀어보면서 개념을 익히는게 좋을 것 같다고 알려주셨다.
듣고 보니 맞는 말이였다. 나는 함수의 기능을 대략적으로 기억하고 쓰고 있어, 사용되는 데이터타입이나 true나 false일 시 어떤 값이 반환되는 지 헷갈려 자주 난항을 겪었다. 알기야 아는데 잘 모르는 상황이라는 거다. 그래서 다음부터는 매니저님께서 주신 몇 가지 팁을 사용해서 공부를 해야겠다.

🔔참고사항

  • 구조가 헷갈릴 것 같으면 먼저 글로 로직을 쓰고 나서 코드 짜보기
  • 못 푼 문제는 풀이법을 보고 이해한 다음 다음 날 풀어보고, 안 풀리면 또 다음날 풀어보기

🔔문제 풀며 정리해둔 알아야 할 것들

1.slice() 사용 시 begin index나 end index가 음수이면,배열의 끝에서부터의 길이를 잘라낼 수 있음. 배열 끝까지 잘라내고 싶다면 end index생략하기

참고사이트
[Javascript] 배열 자르기 - slice()

2.정규식

function hide_numbers(s){
  return s.replace(/\d(?=\d{4})/g, "*");
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log("결과 : " + hide_numbers('01033334444'));

참고사이트
JavaScript 정규 표현식 문법 총정리 + 응용 예제

3.행렬의 덧셈

let resultArr = [],
        i;
    for(i = 0; i < a.length; i += 1){
      resultArr.push(a[i].map((x, y) => a[i][y] + b[i][y]));
    }
    return resultArr;

다차원배열에서 map이용

참고사이트
자바스크립트-두-배열의-합-Matrix-Addition

+map함수, 화살표 함수 제대로 이해하기
+배열 오름차순 유니코드 문제 이해하기

profile
개발자가 되고 싶어요

0개의 댓글