1. 수열과 구간 쿼리 4
[문제 설명]
정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 i가 k의 배수이면 arr[i]에 1을 더합니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
[제한사항]
- 1 ≤ arr의 길이 ≤ 1,000
- 0 ≤ arr의 원소 ≤ 1,000,000
- 1 ≤ queries의 길이 ≤ 1,000
- 0 ≤ s ≤ e < arr의 길이
- 0 ≤ k ≤ 5
[입출력 예]
arr | queries | result |
[0, 1, 2, 4, 3] | [[0, 4, 1], [0, 3, 2], [0, 3, 3]] | [3, 2, 4, 6, 4] |
[입출력 예 설명]
각 쿼리에 따라 arr가 다음과 같이 변합니다.
arr |
[0, 1, 2, 4, 3] |
[1, 2, 3, 5, 4] |
[2, 2, 4, 5, 4] |
[3, 2, 4, 6, 4] |
[답변]
function solution(arr, queries) {
for (const [s, e, k] of queries){
arr = arr.map((curr, i) => s <= i && i <= e && i % k === 0 ? curr + 1 : curr);
}
return arr;
}
💡 forEach 대신에 for ...of 루프를 사용하고, 어제 공부한 map() 함수를 사용해서 풀어보았다. 깔끔하게 적은 것 같아서 기분이 좋았다~
📌 for...of : 배열이나 이러터블 객체의 요소들을 순회하기 위해 사용되는 반복문. for문보다 간단하고 가독성이 좋음. 요소나 객체의 값을 직접 접근하여 사용할 수 있음.
for (const element of iterable) { //반복적으로 실행될 코드 }
- element : 각 반복에서 현재 요소의 값이 할당되는 변수
- iterable : 반복할 대상인 배열 또는 이터러블 객체
* 이터러블 객체 : 배열과 비슷하지만 배열이 아니더라도 반복 가능한 객체 / ex) 문자열, Set, Map 등...
2. 배열 만들기 2
[문제 설명]
정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.
[입출력 예]
l | r | result |
5 | 555 | [5, 50, 55, 500, 505, 550, 555] |
10 | 20 | [-1] |
[입출력 예 설명]
입출력 예 #1
- 5 이상 555 이하의 0과 5로만 이루어진 정수는 작은 수부터 5, 50, 55, 500, 505, 550, 555가 있습니다. 따라서 [5, 50, 55, 500, 505, 550, 555]를 return 합니다.
입출력 예 #2
- 10 이상 20 이하이면서 0과 5로만 이루어진 정수는 없습니다. 따라서 [-1]을 return 합니다.
[답변]
function solution(l, r) {
let answer = [];
for(let i = l; i <= r; i++){
if(!String(i).match(/[^50]+/)) answer.push(i);
}
return answer.length ? answer : [-1];
}
💡 l부터 r까지 for문을 이용해 순회하고, if문으로 비교하여 answer에 push해주는 방식으로 풀어봤다.
변수 'i'를 문자열로 변환하고, 문자열이 '5' 와 '0'이 아닌 다른 문자로 이루어져 있는지 검사한다. 그리고 부정연산자(!)를 사용해 5와 0으로만 이루어진 문자열만 answer에 push해주고, 삼항연산자로 answer이 0이면 -1 반환해줬다.
📌 match() : 주어진 정규식과 문자열에 대해 매칭되는 부분 문자열들을 찾아 배열로 반환하는 메서드
string.match(regexp)
- string : 매칭을 찾을 대상 문자열
- regexp : 정규식 패턴을 나타내는 객체
만약 매칭되는 부분이 없다면 null을 반환한다.
3. 카운트 업
[문제 설명]
정수 start와 end가 주어질 때, start부터 end까지의 숫자를 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
[답변]
function solution(start, end) {
let answer = [];
for(let i = start; i <= end; i++){
answer.push(i);
}
return answer;
}
💡 귀여운 for문으로 간단하게 풀었다.
4. 콜라츠 수열 만들기
[문제 설명]
모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다.
그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.
계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.
임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.
[답변] while + 삼항연산자 활용
function solution(n) {
var answer = [];
answer.push(n);
while(n !== 1){
n % 2 === 0 ? n = n / 2 : n = 3 * n + 1;
answer.push(n);
}
return answer;
}
[답변2] while + if문 활용
function solution(n) {
var answer = [];
answer.push(n);
while(n !== 1){
if(n % 2 === 0){
n = n / 2;
answer.push(n);
} else {
n = 3 * n + 1;
answer.push(n);
}
}
return answer;
}
[다른 답변] 재귀호출
function solution(n, arr = []) {
arr.push(n)
if (n === 1) return arr
if (n % 2 === 0) return solution(n / 2, arr)
return solution(3 * n + 1, arr)
}
💡 재귀 호출 (Recursion) : 함수가 자기 자신을 호출하는 프로그래밍 기법. 반복적인 작업을 간단하고 효율적으로 할 수 있다. 복잡한 문제를 간단하게 풀기 위해 or 트리구조, 그래프 등의 자료구조 탐색 시 유용하게 사용.
이렇게도 풀 수 있구나... 재귀 호출 메모......
5. 배열만들기 4
[문제 설명]
정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk를 만드려고 합니다.
변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.
- 만약 stk가 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
- stk에 원소가 있고, stk의 마지막 원소가 arr[i]보다 작으면 arr[i]를 stk의 뒤에 추가하고 i에 1을 더합니다.
- stk에 원소가 있는데 stk의 마지막 원소가 arr[i]보다 크거나 같으면 stk의 마지막 원소를 stk에서 제거합니다.
위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해 주세요.
[입출력 예]
arr | result |
[1, 4, 2, 5, 3] | [1, 2, 3] |
[입출력 예 설명]
- 각 작업을 마친 후에 배열의 변화를 나타내면 다음 표와 같습니다.
i | arr[i] | stk |
0 | 1 | [] |
1 | 4 | [1] |
2 | 2 | [1, 4] |
2 | 2 | [1] |
3 | 5 | [1, 2] |
4 | 3 | [1, 2, 5] |
4 | 3 | [1, 2] |
- | - | [1, 2, 3] |
- 따라서 [1, 2, 3]을 return 합니다.
[답변]
function solution(arr) {
let stk = [];
let i = 0;
while(i<arr.length) {
if (stk.length === 0) {
stk.push(arr[i]);
i++;
} else if (stk[stk.length-1] < arr[i]) {
stk.push(arr[i]);
i++;
} else if (stk[stk.length-1] >= arr[i]) {
stk.pop();
}
}
return stk;
}
'프로그래머스 > Lv. 0 코딩 기초 트레이닝' 카테고리의 다른 글
[프로그래머스] 코딩 기초 트레이닝 Day 9 / JS (0) | 2023.07.28 |
---|---|
[프로그래머스] 코딩 기초 트레이닝 Day 8 / 주사위게임 3 / JS (0) | 2023.07.27 |
[프로그래머스] 코딩 기초 트레이닝 Day 6 / JS (0) | 2023.07.25 |
[프로그래머스] 코딩 기초 트레이닝 Day 5 / JS (0) | 2023.07.24 |
[프로그래머스] 코딩 기초 트레이닝 Day 4 / JS (0) | 2023.07.23 |