본문 바로가기
프로그래머스 코딩 테스트

프로그래머스 : JavaScript 알고리즘 100일 챌린지 21일차

by dongjin6539 2023. 6. 5.
728x90
반응형

프로그래머스 : JavaScript 알고리즘 100일 챌린지 21일차

 

코딩테스트 입문 Day21

 

 

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

function solution(my_string) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
my_string result
"aAb1B2cC34oOp" 37
"1a2b3c4d123Z" 133

 

답 확인하기
function solution(my_string) {
  let sum = 0;
  let currentNumber = '';
  
  for (let i = 0; i < my_string.length; i++) {
    const char = my_string[i];
    
    if (!isNaN(char)) {
      // 문자가 숫자인 경우
      currentNumber += char;
    } else {
      // 문자가 숫자가 아닌 경우
      if (currentNumber !== '') {
        // 이전까지 만들어진 숫자가 있으면 합산
        sum += parseInt(currentNumber);
        currentNumber = ''; // currentNumber 초기화
      }
    }
  }
  
  // 마지막 숫자가 있는 경우 합산
  if (currentNumber !== '') {
    sum += parseInt(currentNumber);
  }
  
  return sum;
}

 

2. 안전지대 : 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

function solution(board) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
board result
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] 16
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] 13
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]]
0

 

답 확인하기
function solution(board) {
  // 위, 아래, 좌, 우, 대각선 칸 확인을 위한 셋팅입니다.
  const dx = [1, 0, -1, 0, 1, 1, -1, -1];
  const dy = [0, 1, 0, -1, 1, -1, 1, -1];

  // 정사각형이기 때문에 코드 간소화를위해 길이를 셋팅해줍니다.
  const n = board.length;

  // 초기 안대지대를 모든 칸으로 답을 설정해둡니다.
  let answer = n * n;

  // 지뢰가 있는 곳을 확인해주기 위한 셋팅입니다.
  const ch = [];

  // 이중 for문을 이용해 모든 칸을 확인해줍니다.
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      if (board[i][j] === 1) {
        // 지뢰를 발견했다면 ch에 그 칸의 위치를넣어줍니다.
        ch.push([i, j]);
        // 그리고 안전지대에서 -1을 해줍니다.
        answer--;
      }
    }
  }

  // 예시 3번 처럼 모든 지대가 지뢰지역이면 0을 반환합니다.
  if (answer === 0) return 0;

  // 위험지역 확인을 위해 지뢰의 위치를 forEach()메서드를 통해 확인해줍니다.
  ch.forEach((w) => {
    // 위, 아래, 좌, 우, 대각선 총 8곳의 위치를 확인합니다.
    for (let k = 0; k < 8; k++) {
      // 위에 설정해둔 dx와 dy를 활용합니다.
      // ex) 만안 w가 [0, 0]일 경우
      // w[0] + dx[0] = nx = 1
      // w[1] + dy[0] = ny = 0
      // 즉, 현재 위치의 board[nx][ny]는 현재 위치의 우측을 확인하는 것 입니다.
      const nx = w[0] + dx[k];
      const ny = w[1] + dy[k];

      // 만약 nx ny의 위치가 지대의 안쪽이고
      // 이미 확인한 위험지역이나 지뢰의 위치가 아니라면
      if (nx >= 0 && ny >= 0 && nx < n && ny < n && board[nx][ny] === 0) {
        // 현재 위치를 위험지대로 설정하고
        board[nx][ny] = 1;
        // 안전지대 갯수에서 -1을 해줍니다.
        answer--;
      }
    }
  });

  // 최종 확인 결과를 반환해줍니다.
  return answer;
}

 

3. 삼각형의 완성조건(2) : 선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.

function solution(numbers) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
sides result
[1, 2] 1
[3, 6] 5
[11, 7] 13

 

답 확인하기
function solution(sides) {
  // 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

  // 주어진 두 변이 최대 길이의 변이 아닌 경우
  // 가장 긴 변(x)의 길이가 다른 두 변의 길이의 합보다 작은 경우

  // 주어진 두 변 중에 최대 길의 변이 있는 경우
  // 주어진 두 변 중 긴 변의 길이가 나머지 한 변의 길이와 나머지 한 변의 길이보다 작은 경우

  // x < side1 + side2
  // max(side) < x + min(side)
  // max(side) - min(side) < x < side1 + side2

  let maxNum = Math.max(...sides);
  let minNum = Math.min(...sides);
  let sum = sides.reduce((a, c) => a + c, 0);
  return sum - (maxNum - minNum) - 1; // 시작지점으로 개수를 새기 때문에 -1를 해준다
}

 

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

function solution(spell, dic) {
    var answer = 0;
    return answer;
}

길라잡이

  • 데이터를 수정해서 답을 구해보세요.
  • 예시
spell dic result
["p", "o", "s"] ["sod", "eocd", "qixm", "adio", "soo"] 2
["z", "d", "x"] ["def", "dww", "dzx", "loveaw"] 1
["s", "o", "m", "d"]
["moos", "dzx", "smm", "sunmmo", "som"] 2

 

답 확인하기
function solution(spell, dic) {
  const isExist = [];

  dic.forEach((e) => {
    let cnt = 0;
    spell.forEach((i) => {
      if (e.includes(i)) cnt++;
    });

    if (cnt === spell.length) isExist.push(e);
  });
  return isExist.length === 0 ? 2 : 1;
}

 

728x90
반응형