코딩테스트 21일차
숨어있는 숫자의 덧셈 (2)
문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
function solution(my_string) {
var answer = 0;
var num = "";
for (var i = 0; i < my_string.length; i++) {
var char = my_string[i];
if (/[0-9]/.test(char)) {
// 현재 문자가 숫자인 경우
num += char;
} else {
// 현재 문자가 숫자가 아닌 경우
if (num !== "") {
// 숫자가 쌓여있는 경우
answer += parseInt(num, 10);
num = "";
}
}
}
if (num !== "") {
// 문자열이 끝나기 전에 숫자가 남아있는 경우
answer += parseInt(num, 10);
}
return answer;
}
✏️풀이
변수 answer를 0으로 초기화하고, 숫자를 임시로 저장할 변수 num을 생성합니다.
문자열 my_string을 인덱스 i를 이용하여 순회합니다.
현재 문자 char가 숫자인지 확인합니다. 정규식 /[0-9]/을 사용하여 숫자 패턴과 일치하는지 확인합니다.
현재 문자 char가 숫자인 경우, num에 해당 문자를 덧붙입니다.
현재 문자 char가 숫자가 아닌 경우, num에 숫자가 쌓여있는지 확인합니다.
num이 비어있지 않은 경우, 숫자가 쌓여있는 상태이므로 해당 숫자를 정수로 변환하여 answer에 더합니다. 그리고 num을 초기화합니다.
반복문이 종료된 후에도 num에 숫자가 남아있는지 확인합니다.
num이 비어있지 않은 경우, 문자열이 끝나기 전에 숫자가 남아있는 상태이므로 해당 숫자를 정수로 변환하여 answer에 더합니다.
최종적으로 answer를 반환합니다.
안전지대
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
function solution(board) {
var answer = 0;
var n = board.length;
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
if (board[i][j] === 0) {
var safe = true;
// 현재 칸의 상하좌우 대각선 칸을 확인
for (var dx = -1; dx <= 1; dx++) {
for (var dy = -1; dy <= 1; dy++) {
var nx = i + dx;
var ny = j + dy;
// 인덱스가 유효하고 해당 칸에 지뢰가 있는 경우
if (nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx][ny] === 1) {
safe = false;
break;
}
}
if (!safe) {
break;
}
}
if (safe) {
answer++;
}
}
}
}
return answer;
}
✏️풀이
변수 answer를 0으로 초기화하고, 배열의 크기 n을 구합니다.
이중 반복문을 사용하여 배열 board의 각 칸을 순회합니다. 현재 위치를 (i, j)라고 합니다.
현재 칸의 값이 0인 경우, 해당 칸은 지뢰가 없는 지역입니다. 안전한 지역인지 확인해야 합니다.
안전한 지역인지 확인하기 위해 상하좌우 대각선의 칸을 확인합니다. 이를 위해 두 개의 반복문을 사용하여 현재 위치 (i, j) 주변의 칸을 순회합니다. 주변 칸의 위치를 (dx, dy)라고 합니다.
현재 위치 (i, j)와 주변 칸의 위치 (dx, dy)를 이용하여 실제 배열 board에서 주변 칸의 인덱스를 계산합니다. 계산한 인덱스가 유효한지 확인하고, 해당 칸에 지뢰가 있는지 확인합니다.
주변 칸 중 하나라도 지뢰가 있는 경우, 현재 위치 (i, j)는 위험지역이므로 안전한 지역이 아닙니다. safe 변수를 false로 설정하고 반복문을 종료합니다.
반복문을 모두 순회한 후, safe 변수가 여전히 true인 경우, 현재 위치 (i, j)는 지뢰와 인접한 칸이 없는 안전한 지역입니다. 따라서 answer를 1 증가시킵니다.
모든 칸을 순회한 후, 최종적으로 answer를 반환합니다.
삼각형의 완성조건 (2)
선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.
function solution(sides) {
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를 해준다
}
✏️풀이
코드에서는 주어진 선분의 배열 sides에서 가장 긴 변의 길이를 maxNum 변수에 저장하고, 가장 짧은 변의 길이를 minNum 변수에 저장합니다. 이를 위해 Math.max(...sides)와 Math.min(...sides)를 사용합니다.
그리고 sides 배열의 모든 요소를 더하여 합을 sum 변수에 저장합니다. 이를 위해 sides.reduce((a, c) => a + c, 0)를 사용합니다.
마지막으로, sum - (maxNum - minNum) - 1을 계산하여 나머지 한 변이 될 수 있는 정수의 개수를 구합니다.
maxNum - minNum은 가장 긴 변과 가장 짧은 변의 차이를 나타냅니다.
sum - (maxNum - minNum)은 가장 긴 변과 가장 짧은 변의 길이를 합한 값입니다.
-1을 하는 이유는 시작 지점으로부터 정수의 개수를 세기 때문에, 실제 가능한 정수의 개수보다 1이 작아야 합니다.
외계어 사전
PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.
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;
}
✏️풀이
isExist라는 빈 배열을 선언합니다. 이 배열은 조합하여 만든 단어를 저장할 것입니다.
dic 배열의 각 요소를 반복하면서 조합할 수 있는 단어를 찾습니다. forEach 메소드를 사용하여 dic의 각 요소를 순회합니다.
각 단어에 대해 cnt라는 변수를 선언하고 0으로 초기화합니다. 이 변수는 spell의 알파벳이 단어에 포함되는 개수를 세기 위해 사용됩니다.
spell 배열의 각 요소를 반복하면서 단어에 해당 알파벳이 포함되어 있는지 확인합니다. forEach 메소드를 사용하여 spell의 각 요소를 순회합니다.
단어에 알파벳이 포함되어 있다면, cnt를 1씩 증가시킵니다.
cnt의 값이 spell 배열의 길이와 동일한지 확인합니다. 만약 동일하다면, 모든 알파벳을 한 번씩 사용하여 단어를 만들었다는 의미입니다.
조건이 만족되는 경우, 해당 단어를 isExist 배열에 추가합니다.
모든 dic의 요소에 대해 위 과정을 반복합니다.
isExist 배열의 길이가 0이라면, 조합하여 만들 수 있는 단어가 존재하지 않는 것이므로 2를 반환합니다.
그렇지 않으면, 조합하여 만들 수 있는 단어가 존재하는 것이므로 1을 반환합니다.