본문 바로가기
항해99/온보딩 스터디

[항해99] 온보딩 스터디 - 2주차 2일 TIL

by junvely 2023. 3. 15.

🦄 온보딩 스터디 2주차 2일 TIL

✨03/14 : 목표 : 알고리즘 4일차, 5일차 풀이


📒알고리즘 풀이

01 4일차 알고리즘

 

1. 중복된 문자 개수

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.

 

프로그래머스

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

programmers.co.kr

내 첫 풀이) array를 순회하며 일치하면 output을 증가++시킨다.

function solution(array, n) {
    let output = 0;
    
    for(num of array){
        if(num === n){
            output++
        }
    }
    return output;
}

더 나은 풀이) filter를 사용해 새 배열로 뽑은 후, 배열의 length를 구하는 방법으로 더 간단하게 구현 가능하다.

function solution(array, n) {
    const newArray = array.filter(a => a===n)
    return newArray.length 
}

 

2. 배열의 평균값

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.

 

프로그래머스

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

programmers.co.kr

  • .reducer(a,b) =>  배열의 누적값, 현재값, 초기값으로 생성한 새로운 배열 반환

접근방법)

reducer 메소드로 a + b를 더한 값을 a에 누적하여 sum을 구한 후, 배열의 갯수로 나누어 평균값을 구한다.

const sum = numbers.reduce((a, b) => {
      return a + b; // a = a + b
}, 0);
return sum / numbers.length

 

3. 짝수 홀수 개수 

정수가 담긴 리스트 num_list가 주어질 때, num_list의 원소 중 짝수와 홀수의 개수를 담은 배열을 return 하도록 solution 함수를 완성해보세요.

 

프로그래머스

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

programmers.co.kr

접근 방법)

num_list를 filter하여 짝수 배열의 length를 구하고, num_list에서 even을 빼준 갯수를 구해 배열로 리턴한다.

    let even = num_list.filter(a => a % 2===0).length
    return [even, num_list.length-even]

 

4. 배열 자르기

정수 배열 numbers와 정수 num1num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.

 

프로그래머스

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

programmers.co.kr

접근방법 )

slice(num1,num2)메소드를 사용해 num1부터 num2까지 구해보았는데, 요소가 한 개씩 덜 구해졌다. slice는 num2까지 포함되는 것이 아니라 num2 전까지 구해지기 때문에 +1하여 해결했다.

function solution(numbers, num1, num2) {
   return numbers.slice(num1, num2+1) //주의) slice는 num1부터 num2까지 포함이 아니라 num2전 까지가 구해짐
}

 

5. 배열 원소의 길이

문자열 배열 strlist가 매개변수로 주어집니다. strlist 각 원소의 길이를 담은 배열을 retrun하도록 solution 함수를 완성해주세요.

 

프로그래머스

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

programmers.co.kr

접근방법)

1. reduce를 이용한 풀이

1)초기값 a를 빈 배열 []로 셋팅

2) strlist를 순회하며 b요소의 length를 배열 a에 삽입 

3) 다 순회하며 삽입이 끝난 a 배열을 리턴

function solution(strlist) {
    const array = strlist.reduce((a,b) => {
            a.push(b.length) //2. 빈 a라는 배열에 strlist를 순회하여 b요소의 length를 삽입
            return a //3. 삽입된 a배열을 리턴
        },[]) // 1. a는 []빈 배열
	return array
}

2. map을 이용한 더 간단한 풀이

function solution(strlist) {
	return strlist.map(a => a.length)
}

 

6. 최대값 만들기(1)

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

 

프로그래머스

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

programmers.co.kr

접근 방법)

1. 기존 배열의 최대값을 구한 후, 최대값을 제외한 배열에서 다시 최대값 구하기

function solution(numbers) {
    const num1 = Math.max(...numbers)
    numbers = numbers.filter(a => a !==num1)
    const num2 =Math.max(...numbers)
    return num1*num2
}

2. sort를 사용해 내림차순 정렬 후, [0]*[1] 해주기 => sort를 사용해 코드 줄이기

* sort()의 기본값은 문자열 유니코드 순이다. (a,b) => a-b를 해주어야 숫자로 계산하여 판단된다.

function solution(numbers) {
	numbers.sort((a,b) => b-a);
    return numbers[0]*numbers[1]
}

 

 

02 5일차 알고리즘

 

1. 짝수는 싫어요

정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.

 

프로그래머스

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

programmers.co.kr

접근 방법)

여러가지 메소드를 활용 가능할 것 같은데(map, filter, reduce, for문 ... 등등), 우선 이 메소드들은 배열에만 적용할 수 있기 때문에, 그냥 배열을 생성함과 동시에 홀수만 생성 가능하도록 조건을 걸어서 만들어 버렸다.

=> 홀수만이기 때문에 모든 수를 반복할 필요가 없고, 1부터 2씩 증가하게 설정했다.

function solution(n) {
    array = [];
    for(let i =1; i <= n; i+=2){
        array.push(i)
    }
    return array;   
}

 

2. 삼각형의 완성 조건

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

- 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.

 

프로그래머스

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

programmers.co.kr

  • array.shift() => 배열의 첫번째 요소 제거

접근 방법) 

순수 함수로 만들기 위해서 삼각형이 아니라는 전제하에(배열 요소가 random) 각각 최대값과 나머지 배열의 합을 구해 비교하려고 했다.

1. 최대값 구하기

2. 최대값을 제외한 배열 구하기

2. 최대값과 나머지 배열의 합을 비교하여 1 or 2 리턴하기

근데 테스트 3개에서 실패가 뜬다. 예외 사항이 뭐가 있는지 잘 모르겠다..

function solution(sides) {
    const max = Math.max(...sides);
    const array = sides.filter((a) => a !== max);
    let arraySum = 0;
        for (a of arraySum) {
          sum += a;
        }
    return arraySum > max ? 1 : 2
}

>> 팀원님의 도움을 받아 문제를 찾았다. 배열 안에 최대값 요소가 중복되는 경우 filter에서 최대값이 전부 제외되고 배열이 생성된다.. 따라서 아예 그냥 배열을 오름차순 정렬하여 최대값으로 [0]를 뽑고, 첫번째 요소(최대값 한개)만 삭제시켰다! 역시 혼자 푸는 것 보다 도움을 받으면 내가 예상치 못한 문제를 발견할 수 있어 좋은 것 같다. 

 

리팩토링 후 코드)

function solution(sides) {
//1. 가장 큰변 구하기
//2. 큰변 < 가장 큰변을 제외한 나머지 두변 합
    // 1,2,3,4,4
    sides.sort((a,b)=> b-a)
    const max = sides[0]; //최대값
    
    //첫번째 요소 제거
    sides.shift()
    //배열의 요소 제거
    // sides.splice(0,1)
    
    let arraySum = 0;
    for (a of sides) {
      arraySum += a;
    }
    return arraySum > max ? 1 : 2
}

 

삼각형이라는 전제 하에, 가장 간단한 방법으로 푼 방법.

1. 삼각형은 변이 3개 이기 때문에, 배열을 내림차순 정렬 하면 최대값은 무조건 [0]번째에 오게 된다.

2. 나머지 [1]과 [2]를 더해준 값이 최대값[0]보다 크다면 1 아니면 2를 리턴한다.

sides.sort((a,b)=> b-a);
return sides[0] < sides[1] + sides[2] ? 1 : 2

 

 

03 개미군단 풀어보기

개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.

 

프로그래머스

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

programmers.co.kr

접근 방법) 순수 함수, 사이드이펙트(외부 변수로 인한 예상치 못한 사이드 이펙트)를 고려하며 풀어보기

개미수를 가장 큰 공격력 순으로 나눈 몫으로 갖고, 나눈 나머지 값을 다시 다음 공격력 순으로 나눠주는 과정을 반복해 몫의 합으로 총 개미수를 구해준다.

1. reduce 함수 사용하기 위해 개미군단의 공격력을 배열로 할당한다(어떤 값이 들어오더라도 재사용 가능한 순수함수로 만들기 위함)

2. 개미수 = (hp / 공격력)을 할당하고, hp는 나머지 (hp = hp % 공격력) 으로 재할당하여 다시 다음 공격력 순으로 나눠 개미수를 구하도록 배열을 순회하며 반복한다.

3. return 값은 초기값 a = 0 에 + count(hp/공격력)를 누적하여 더한 값을 리턴해 준다.

4. 만약 나머지가 없고 값이 떨어질 경우, 바로 누적된 a를 리턴하도록 if문(!hp = 0 일경우)을 걸어준다.

function solution(hp) {
   const arrays = [5,3,1] //배열이 매개변수로 주어질경우, 매개변수로 배열을 생성해 준다.
   
   const result = arrays.reduce((a,b) => {
       if(!hp) return a
       let count = Math.trunc(hp/b)
       hp = hp % b
       return a += count
   },0)
   
   return result;
}

 

 

✅배운 점

 

1. 용도에 맞게 메소드를 잘 활용하면, 코드를 더 간편하게 줄일 수 있다. ex) filter와 length / sort 등

2. 항상 예외사항을 주의하여 코드를 작성한다. ex) 0일 경우, 중복값이 있을 경우... 등

3. reduce를 잘 활용하면 => map or filter or for문 + if문 + 새로운 값이나 배열 새로 가공 등의 과정을 한 번에 처리할 수 있다.

4. var 호이스팅 , var와 let, const의 차이

=> var = a : var는 선언만 했을 시, undefined 된다.(할당 전) 

1) var는 할당 전에도 참조 가능하다. (근데 결과는 undefined이다. let이나 const 초기화 전에는 아예 참조 자체가 불가능 하다.)

2) let과 const는 초기화 전에 참조 불가하다.

3) let은 미리 선언만 하고 값을 따로 할당이 가능. const는 선언과 동시에 값 할당하여 초기화 해야 한다.

5. 실행 컨텍스트 개념에 대해 공부해 보자 => https://m.youtube.com/watch?v=pfQfEwnJHRs

6. 외부 변수에 의해 예상치 못한 결과가 나오는 것을 사이드 이펙트라고 한다. 이를 고려하여 순수 함수(재사용 가능한)를 생성하는 연습을 해보자. => 순수함수, 사이드 이펙트 공부해 보기

7. 페어 프로그래밍 하면서 새로 알게된 코드 => replace(regex, ) : replace에 regex 정규표현식을 사용하면 정규표현식에 포함되는 모든 코드를 삭제시켜 준다.