1. 마지막 두 원소
[문제 설명]
정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.
[제한사항]
- 2 ≤ num_list의 길이 ≤ 10
- 1 ≤ num_list의 원소 ≤ 9
[답변]
function solution(num_list) {
let answer = 0;
num_list[num_list.length-1] > num_list[num_list.length-2]
? answer = (num_list[num_list.length-1] - num_list[num_list.length-2])
: answer = (num_list[num_list.length-1] * 2);
num_list.push(answer);
return num_list;
}
💡 삼항연산자를 사용하여 조건에 맞게 계산하여 answer에 대입하고, num_list에 push해주고 return 했다.
[다른 답변]
function solution(num_list) {
const [a, b] = [...num_list].reverse();
return [...num_list, a > b ? (a-b):a*2];
}
💡 이것도 보고 놀란 답변. 이렇게 깔끔한 풀이도 가능하다니!!!
reverse()로 배열을 거꾸로 하고, 구조분해할당을 통해 a와 b에 각각 마지막 원소, 그 전 원소를 대입하고 삼항연산자를 통한 비교 후 return 하기
reverse() + 구조분해할당을 쓸 생각은 전혀 못했다. 분발하자 🤦♀️
2. 수 조작하기 1
[문제 설명]
정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.
- "w" : n이 1 커집니다.
- "s" : n이 1 작아집니다.
- "d" : n이 10 커집니다.
- "a" : n이 10 작아집니다.
위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.
[제한사항]
- -100,000 ≤ n ≤ 100,000
- 1 ≤ control의 길이 ≤ 100,000
- control은 알파벳 소문자 "w", "a", "s", "d"로 이루어진 문자열입니다.
[답변]
function solution(n, control) {
for(let i = 0; i < control.length; i++){
switch(control[i]){
case 'w':
n++;
break;
case 's':
n--;
break;
case 'd':
n += 10;
break;
case 'a':
n -= 10;
break;
}
}
return n;
}
💡 switch case를 활용해 풀어보았다.
[다른 답변]
const operations = {
w: (n) => n + 1,
s: (n) => n - 1,
d: (n) => n + 10,
a: (n) => n - 10,
};
function solution(n, control) {
return [...control].reduce((prev, op) => operations[op](prev), n);
}
💡 연산을 따로 빼서 reduce()를 활용해서 풀었다. 참... 똑똑한 사람이 많다는 걸... 또 한 번 느낌...
3. 수 조작하기 2
[문제 설명]
정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.
- "w" : 수에 1을 더한다.
- "s" : 수에 1을 뺀다.
- "d" : 수에 10을 더한다.
- "a" : 수에 10을 뺀다.
그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.
주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.
[제한사항]
- 2 ≤ log의 길이 ≤ 100,000
- -100,000 ≤ log[0] ≤ 100,000
- 1 ≤ i ≤ log의 길이인 모든 i에 대해 |log[i] - log[i - 1]|의 값은 1 또는 10입니다.
[답변]
function solution(numLog) {
let result = "";
numLog.reduce((acc, curr, idx) => {
switch (curr - numLog[idx - 1]) {
case 1:
result += "w";
break;
case 10:
result += "d";
break;
case -1:
result += "s";
break;
case -10 :
result += "a";
break;
}
});
return result;
}
💡 1번 문제를 활용한 응용버전? 으로 reduce()를 활용했다.
(두번째 원소 - 첫번째원소)를 switch case로 구분하여 문자열에 추가해주는 방식으로 풀이해봤다. 처음에 방향잡기 어려웠음... reduce랑 친해지는 중...
4. 수열과 구간 쿼리 3
[문제 설명]
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.
각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
[제한사항]
- 1 ≤ arr의 길이 ≤ 1,000
- 0 ≤ arr의 원소 ≤ 1,000,000
- 1 ≤ queries의 길이 ≤ 1,000
- 0 ≤ i < j < arr의 길이
[답변] - temp 변수 사용
function solution(arr, queries) {
for(let i = 0; i < queries.length; i++){
let temp = arr[queries[i][0]];
arr[queries[i][0]] = arr[queries[i][1]];
arr[queries[i][1]] = temp;
}
return arr;
}
💡 for문으로 돌리고.. a = b / b = c / c = a 식으로 풀었다.
[답변2] - 구조분해할당
function solution(arr, queries) {
for(let i = 0; i < queries.length; i++){
let [a, b] = [queries[i][0], queries[i][1]];
[arr[a], arr[b]] = [arr[b], arr[a]];
}
return arr;
}
💡 전에 풀었던 문제에서 구조분해할당 사용했었던 답변이 기억나서, 다시 풀어보았다. 뿌듯해 😎
5. 수열과 구간 쿼리 2
[문제 설명]
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.
각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.
[제한사항]
- 1 ≤ arr의 길이 ≤ 1,000
- 0 ≤ arr의 원소 ≤ 1,000,000
- 1 ≤ queries의 길이 ≤ 1,000
- 0 ≤ s ≤ e < arr의 길이
- 0 ≤ k ≤ 1,000,000
[입출력 예]
arr | queries | result |
[0, 1, 2, 4, 3] | [[0, 4, 2], [0, 3, 2], [0, 2, 2]] | [3, 4, -1] |
[입출력 예 설명]
- 첫 번째 쿼리의 범위에는 0, 1, 2, 4, 3이 있으며 이 중 2보다 크면서 가장 작은 값은 3입니다.
- 두 번째 쿼리의 범위에는 0, 1, 2, 4가 있으며 이 중 2보다 크면서 가장 작은 값은 4입니다.
- 세 번째 쿼리의 범위에는 0, 1, 2가 있으며 여기에는 2보다 큰 값이 없습니다.
- 따라서 [3, 4, -1]을 return 합니다.
[답변]
function solution(arr, queries) {
let answer = [];
queries.forEach((query) => {
const [s, e, k] = query;
const subArr = arr.slice(s, e + 1);
const filterArr = subArr.filter(num => num > k);
filterArr.length === 0 ? answer.push(-1) : answer.push(Math.min(...filterArr));
});
return answer;
}
💡 어려웠다... 0레벨에서 헤매다니, 문제를 잘못 이해해서 엄청 헤맸다. 🤦♀️
s와 e는 index와 비교였고, k는 arr[index]의 값과 비교해야 했는데 전부 index랑 비교하느라 시간낭비 펑펑
reduce()도 써보고 for문이랑 if문 떡칠해서도 해보다가 찾아낸... 정답...
배열을 구조분해할당하고, slice(), filter(), 삼항연산자, 전개연산자, Math 함수까지 사용해서 풀었다.
그동안 안썼던 새로운 함수 잔뜩 적용해서 푸니까 재밌었다. 다 기억하고 가야지
📌 slice() : 배열의 일부분을 추출하여 새로운 배열을 생성. 원본 배열을 변경하지 않고 원하는 부분을 잘라낸 새로운 배열을 반환하는 메서드.
📌 filter() : 배열에서 특정 조건을 만족하는 요소들로 새로운 배열을 생성하는 메서드.
📌 전개 연산자 (...) : 배열 앞에 ...을 붙여서 사용. 배열 또는 객채의 값을 펼쳐서 개별 오소로 만들어준다.
📌 Math.min() : 최소값 반환.
프로그래머스 점수 조금 높게 나오면 왜이렇게.. 기분좋지..? 7점 인증샷 ^ㅡ^ v
쿼리 문제 풀 때는 점수 후했는데!!! 더 높은 점수를 노리고 열심히 풀어봐야겠다 😢
[다른 답변]
function solution(arr, queries) {
return queries.map(([s, e, k]) => arr.slice(s, e + 1).filter((n) => n > k).sort((a, b) => a - b)[0] || -1);
}
📌 map() : 배열의 모든 요소에 대해 주어진 함수를 호출하고, 그 함수의 반환값들로 이루어진 새로운 배열 생성.
원본 배열을 수정하지 않고 새로운 배열을 반환하기 때문에 함수형 프로그래밍에서 유용하게 활용된다.
array.map(callback(currentValue, index, array))
- array : map() 함수를 호출할 배열
- callback : 배열의 각 요소에 대해 호출될 함수, 세가지 인자를 받는다.
- currentValue : 현재 처리중인 요소의 값
- index : 현재 처리 중인 요소의 인덱스
- array : map() 함수를 호출한 원본 배열 자체
map() 함수는 배열의 각 요소를 순회하면서 callback 함수를 호출하고, 반환값들로 이루어진 새로운 배열을 생성하여 반환
한다. 원본 배열과 새로운 배열은 길이가 같으며 각 요소들은 대응하는 위치에 따라 매핑된다 !
📌 sort() : 배열의 요소를 정렬하는 메서드. 기본적으로 문자열 기준으로 이루어지고, 숫자는 오름차순으로 정렬된다.
number.sort((a, b) => a - b)
- 반환 값이 0보다 작은 경우: 첫 번째 요소는 두 번째 요소보다 앞에 위치
- 반환 값이 0인 경우: 순서에 변화가 없음
- 반환 값이 0보다 큰 경우: 첫 번째 요소는 두 번째 요소보다 뒤에 위치
다른 문제에서 map이랑 sort도 사용해봐야겠다.
'프로그래머스 > Lv. 0 코딩 기초 트레이닝' 카테고리의 다른 글
[프로그래머스] 코딩 기초 트레이닝 Day 8 / 주사위게임 3 / JS (0) | 2023.07.27 |
---|---|
[프로그래머스] 코딩 기초 트레이닝 Day 7 / JS (0) | 2023.07.26 |
[프로그래머스] 코딩 기초 트레이닝 Day 5 / JS (0) | 2023.07.24 |
[프로그래머스] 코딩 기초 트레이닝 Day 4 / JS (0) | 2023.07.23 |
[프로그래머스] 코딩 기초 트레이닝 Day 3 / JS (0) | 2023.07.22 |