프로그래머스 Day - 6

ᵁ-ᴷᴺᴼᵂᴺ·2023년 5월 22일
post-thumbnail

1. 마지막 두 원소

목표 : 배열에서 마지막 원소와 이전 원소를 비교하여 출력

//입력
[2, 1, 6]
//출력
[2, 1, 6, 5]
function solution(num_list) {
    let length = num_list.length-1;
    if(num_list[length] > num_list[length-1]){
        num_list.push(num_list[length] - num_list[length-1]);
    } else {
        num_list.push(num_list[length]*2);
    }
    return num_list
}
  • 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 추가후 반환
  • 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가후 반환
  • if문을 사용하여 배열(num_list)의 마지막 원소와 이전 원소를 비교한다.
  • 문제 조건에 따라 연산한 다음, push()를 사용하여 num_list의 마지막 원소로 추가후 반환한다.

2. 수 조작하기 1

목표 : 문자열의 문자종류에 따라 연산후 출력

//입력(n, control)
0, "wsdawsdassw"
//출력
-1
function solution(n, control) {
    const table={
        "w":+1,
        "s":-1,
        "a":-10,
        "d":+10
    }
    for(let x of control ){
        n += table[x]
    }
    return n
}
  • "w" → n+1
    "s" → n-1
    "d" → n+10
    "a" → n-10
  • 문자열의 문자들에 따라 인수로 받은 n의 수를 증가시키거나, 감소시켜야한다.
  • 따라서 key : value의 형식으로 조건문을 대신하는 변수 table을 생성한다
  • 인수로 받은 control 문자열만큼 반복하며 n에 대한 연산을 수행 후 반환한다.

3. 수 조작하기 2

목표 : 2차원 배열에 따라 정수배열을 재배열

//입력(arr, queries)
[0, 1, 2, 3, 4], [[0, 3],[1, 2],[1, 4]]
//출력
[3, 4, 1, 0, 2]
function solution(numLog) {
    const table = {
        "1" : "w",
        "-1" : "s",
        "10" : "d",
        "-10" : "a"
    }
    let str = "";
    for(var i = 1; i<numLog.length; i++){
        str += table[(numLog[i]-numLog[i-1]).toString()];
    }
    return str;
}
  • +1 → "w"
    -1 → "s"
    +10 → "d"
    -10 → "a"
  • numLog의 정수배열의 0번 인덱스와, 1번인덱스를 비교하여 값을 알아낸 후, 문자열을 출력해야한다.
  • key : value 형식인 table과 return할 문자열 str을 선언한다.
  • numLog의 길이만큼 반복하고, for문의 초깃값은 1부터 시작한다.(0부터하고 0+1을 비교하면, 마지막 인덱스에서 범위에러가 나오기 때문)
  • 각 인덱스들을 순차적으로 비교해가면서 table에서 문자를 받아와, strpush()해준다.

4. 수열과 구간 쿼리 3

목표 : 2차원 배열에 따라 정수배열을 재배열

//입력(arr,  queries)
[0, 1, 2, 3, 4],  [[0, 3],[1, 2],[1, 4]]
//출력
[3, 4, 1, 0, 2]
function solution(arr, queries) {
    for(let [i, j] of queries) {
        [arr[i], arr[j]] = [arr[j], arr[i]];
    }
    return arr;
}
  • 주어진 2차원배열 queries에 담긴 값에 따라 정수배열인 arr을 재배치 해야한다.
  • 먼저 2차원배열의 queries의 값을 받아올 i, j를 선언한다.
  • queries의 길이만큼 반복하고, i, j를 사용하여 arr배열에 존재하는 요소의 위치를 바꿔준다.

5. 수열과 구간 쿼리 2

목표 : 2차원 정수배열을 사용해, 1차원 정수배열에서 조건에 맞는 값 찾기

//입력(arr,  queries)
[0, 1, 2, 4, 3],  [[0, 4, 2],[0, 3, 2],[0, 2, 2]]
//출력
[3, 4, -1]
function solution(arr, queries) {
    let res =[];
    for(let [s, e, k] of queries){
        let buffer = Math.min(...arr.slice(s,e+1).filter(el => el>k));
        res.push(buffer !==Infinity ? buffer : -1)
    }
    return res
}
  • queries의 원소는 각각 하나의 query를 나타내며, [s, e, k]꼴이다.
  • s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾는다.
  • 특정 쿼리의 답이 존재하지 않으면 -1을 저장한다.
  • return할 배열 res를 선언하고, queries의 길이만큼 반복문을 진행한다.
  • buffer라는 변수를 정의하는데, buffer에 들어갈 data의 설명은 아래와 같다.
    • arr.slice(s,e+1) : 인수로 받아온 arrs인덱스부터 e+1의 인덱스 까지 자른다.(e로 하게되면, 자르려고 하는것보다 -1만큼 덜 잘린다)
    • filter(el => el>k) : filter()는 배열에서 k보다 큰 값을 찾는다.
    • Math.min() : 배열에서 가장 작은 값을 찾는다.(정확히는 파라미터로 받은 데이터에서 가장 작은 값을 찾아준다)

  • 한 줄로 요약하자면, 주어진 배열을 s,e+1만큼 자르고, filter()를 이용해 조건에 맞는 값을 찾아내고, 찾은 값에서 Math.min()을 이용해 가장 작은 값을 반환한다.
  • 마지막으로 3항 연산자를 이용하여 buffer에 든 값이 없는가를 판단해, respush한다.
profile
ΔIM ΩΠ ҒULLSTΔCҜ

0개의 댓글