Level 0) 문자열, 사칙연산, 시뮬레이션, 2차원배열, 수학, 배열

Doozuu·2023년 1월 23일
0

프로그래머스 (JS)

목록 보기
22/183

📌 문제 1. 숨어있는 숫자의 덧셈 (2)

문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

풀이

정규표현식을 이용해 영어 대소문자를 제거하고 남은 숫자들은 Number로 바꾸어 더해준다.

function solution(my_string) {
   return my_string.split(/[a-z]/i).reduce((a,b) => a + Number(b),0);
}



📌 문제 2. 안전지대 ⭐️

문제 설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

풀이

  1. 지뢰의 위치를 (0,0)이라고 생각할 때, 이를 중심으로 위험지역의 범위를 나타내 range에 담아준다.
  2. 반복문과 조건문을 아용해 지뢰의 위치(=== 1)를 찾아낸다.
  3. 지뢰의 위치에 위험지역의 범위를 모두 더해준다.
  4. 범위 안에 있고 값이 0일 때, 위험지역의 값을 모두 2로 바꾸어 준다.
  5. 지뢰는 1, 위험지역은 2, 안전지역은 0으로 나타내졌으므로 0의 개수를 구해준다.
function solution(board) {
    let count = 0;
    let range = [[0, 1],[0, -1],[1, 0],[1, 1],[1, -1],[-1, 0],[-1, 1],[-1, -1]];
    for (let i = 0; i < board.length; i++) {
        for (let j = 0; j < board[i].length; j++) {
            if (board[i][j] === 1) {
                range.forEach((item) => {
                    let[nextX, nextY] = item;
                    [nextX, nextY] = [i + nextX, j + nextY];
                    if (
                        nextX >= 0 && nextX < board.length &&
                        nextY >= 0 && nextY < board[i].length && 
                        board[nextX][nextY] === 0
                    ){
                    board[nextX][nextY] = 2;
                    }
                })
            }
        }
    }
    board.forEach(a => a.forEach(b => b === 0 ? count++ : 0))
    return count;
}



📌 문제 3. 삼각형의 완성조건(2)

문제 설명

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

가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.

풀이

  1. 긴 변이 b일 때 : b < a + (b보다 같거나 작은 값들)
  2. 긴 변이 새로운 변일 때 : b < 새로운 변 < a + b
function solution(sides) {
    let [a,b] = sides.sort((a,b) => a-b);
    let count = 0;
    for(i=1;i<=b;i++){
        if(b < a+i){
            count++;
        }
    }
    for(i=b+1;i<a+b;i++){
        count++;
    }
    return count;
}

다른 풀이

수학적으로 규칙을 찾으면 가장 긴 변이 b일 때 개수는 가장 작은 변의 길이와 같고, 가장 긴 변이 새로운 변일 때 개수는 가장 작은 변의 길이에 1을 뺀 것과 같다.
ex)
[1, 2] : 1 + 0 = 1
[3, 6] : 3 + 2 = 5
[11, 7] : 7 + 6 = 13
-> 공식 : n + (n - 1) = 2n -1

따라서 배열에서 가장 작은 수를 구하여 거기에 2를 곱하고 1을 빼주면 된다.

function solution(sides) {
    return Math.min(...sides)*2-1
}



📌 문제 4. 외계어 사전

문제 설명

PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.

풀이

spell에 있는 문자들을 중복되지 않게 모두 사용하였는지 확인하려면 정렬해서 똑같은지 비교하는게 제일 확실한 방법이라고 생각하였다.

dic에 있는 문자들과 spell에 있는 문자들을 정렬해서 같으면 1, 다르면 0으로 바꿔주었다. 그래서 1을 포함할 경우 1, 포함하지 않을 경우 2를 return 하였다.(👍🏻)

function solution(spell, dic) {
    return dic.map(n => n.split('').sort().join('') == spell.sort().join('') ? 1 : 0).includes(1) ? 1 : 2;
}
profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글