이 게시물은 인프런 js 알고리즘 강의를 듣고 배운 점을 기록하는 게시물입니다. 문제 내용은 저작권 때문에 풀이만 올리는거 양해 바랍니다.
function solution(n) {
let answer = 0;
let arr = [25, 23, 11, 47, 53, 17, 33];
for (let x of arr) {
if (String(x).slice(-1) === String(n)) answer += 1;
}
return answer;
}
console.log(solution(3));
function solution(day, arr) {
let answer = 0;
for (let x of arr) {
if (x % 10 == day) answer++;
}
return answer;
}
arr = [25, 23, 11, 47, 53, 17, 33];
console.log(solution(3, arr));
풀이: 10부제 문제인데, 숫자 n이 arr 의 마지막 자리 숫자와 같으면 단속 대상이다. 단속 대상의 자동차 수가 몇인지 구하는 문제인데 나는 일단
arr 를 for of 문을 돌려서 String 으로 치환 한다음 마지막 자리 숫자를 가져와서 String(n) 이랑 같으면 answer 을 +1 하는 식으로 풀었다.
쌤이 푼 방식은 이제 몫과 나머지를 이용한 풀이내용인데,
10으로 나누게 되면 첫째자리 숫자가 몫이되고 나머지는 마지막 자리 숫자가 되는것을 이용한 방법이다.
풀이 내용으로는 arr 의 각 요소를 10으로 나눠서 나머지가 day랑 같으면 answer이 하나씩 증가하게 하여 출력하는 알고리즘이다.
일단 나처럼 String 으로 치환할 필요도 없고 , 되게 깔끔한거 같다.
나중에 이렇게 몫과 나머지를 활용할 수 있는 문제가 나오면 이렇게 풀도록 기억해야겠다.
2.일곱난쟁이
function solution(arr) {
let answer = arr,
sum,
flag = 0;
sum = arr.reduce((a, c) => a + c, 0);
for (let i = 0; i <= arr.length -1; i++) {
for (let j = i + 1; j <= arr.length; j++) {
if (sum - (arr[i] + arr[j]) === 100) {
arr.splice(j, 1);
arr.splice(i, 1);
flag = 1;
break;
}
}
if (flag === 1) break;
}
return answer;
}
let arr = [21, 7, 22, 19, 10, 15, 25, 8, 13];
console.log(solution(arr));
풀이내용: 각 arr에 값을 더해서 숫자 100이 되면 불필요한 요소를 삭제하는 문제이다. 풀이 내용으로는 먼저 불필요한 요소가 무엇인지 알기 위해서 우리는 모두 더한 값인 sum 이 필요하다. sum 에다가 두가지 값을 더해 빼 100이 되는 값을 찾아야 하기 때문에 나는 이중 포문을 이용하여 i 번째 부터 돌게 되면 j 는 i보다 1 더 높은 인덱스 부터 돌게 하기 위해 i+1 을 붙였다.
if 문을 통해 arr[i] + arr[j] 값을 sum 에서 빼 100 이 된다면 불 필요한 요소를 찾은거기 때문에 arr.splice(j,1), (i,1)을 해줬다. 여기서 j부터 splice 한 이유는
array 와 linkedlist와의 차이 때문인데. 간략하게 설명하면 array는 삽입 및 삭제를 하게되면 데이터 구조가 달라지게 된다.
예를 들어보면, i가 5이고 , j가 6이라고 해보자.
arr[5]는 15이다.
arr[6]은 25이다.
근데 i부터 splice를 하게 되었다면?
arr[5]는 15이지만, arr[6] 은 8이 된다.
arr에서 15를 삭제하게 되면 [21,7,22,19,10,25,8,13] 이다. 여기서 6번째는? 8이다. 그렇기 때문에 8이 삭제된다. 그래서 개발자 의도대로 동작하지 않게 된다. 그렇지만 뒷자리 부터 없애게 되면 인덱스는 달라지지 않는다.
arr[6] 인 25를 없앴다고 가정해보자.
[21, 7, 22, 19, 10, 15, 8, 13] 이다. 여기서 arr[5]는 15이다. 그래서 j 부터 splice를 해야한다. 주의하자!
그리고 break를 한 이유는 25,15 가 아닌 다른 경우의 수로 먼저 나오게 될 경우 2개가 지우면 되기 때문에 두개를 찾으면 경우의 수를 더 찾을 필요가 없기 때문에 break 로 멈추고 돌고있는 for문을 또 멈추기 위해서 flag를 만들어 조건문을 걸어서 break 를 했다.
function solution(n) {
let answer;
answer = n.replace(/A/g, '#');
return answer;
}
console.log(solution('BANANA'));
특정 문자열을 찾아 바꿔주는 알고리즘
function solution(n) {
let answer = '';
for (let x of n) {
if (x === 'A') answer += '#';
else answer += x;
}
return answer;
}
console.log(solution('BANANA'));
풀이내용: 1번 알고리즘은 replace 함수를 이용해 특정 문자열을 찾아 바꿔주는 알고리즘이다. replace 는 가장 처음 발견된 문자열만 바꿔주기 때문에 조건식을 걸어 전체로 범위를 넓혔다.
2번째 알고리즘은 특정 문자열을 for문을 돌려서 빈 문자열에 해당 특정 문자열일땐 #으로 치환해 넣어주고 아니면 문자열 그대로 넣어주어 새로운 문자열을 만드는 알고리즘이다.