문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
//내 코드
function solution(my_string){
return [...my_string].map(v => Number(v)).join("").split(NaN).filter(v => v!=="").reduce((a,b) => a+Number(b),0);
}
//map으로 요소들을 number타입으로 형변환, join으로 문자열로 다시 만들었다가
//NaN요소를 기준으로 요소를 배열로 만들고, filter로 빈문자열 제거 -> 문자타입인 숫자만 배열에 남는다.
//reduce로 총합을 구하면 된다. 초기값0을 설정하지 않으면,
//number타입으로 바뀌지 않은 배열의 첫번째 값이 초기값이 되므로 초기값은 0을 설정해준다.
//[...my_string].map(v => Number(v))여기서 .filter(v => !isNaN(v)) 코드를 쓰면
//[null, 1,5,null,1] -> [15,1]이 되어야 하는데 ->[1,5,1]이 된다. 그러므로 저 코드는 쓸 수 없다.
//내 코드2
function solution(my_string){
return my_string.toLowerCase().replace(/[a-z]/g, " ").split(" ").map(v => Number(v)).reduce((a,b) => a+b);
}
//replace(/[a-z]/g, " ")으로 알파벳을 모두 공백으로 바꾸고, 공백을 기준으로 나누어 배열로 만든다.
//이러면 빈 문자열이 생기는데, 빈문자열을 number타입으로 형변환하면 0으로 바뀐다.
//0이 있어도 총합을 구하는데는 문제없기에 따로 filter쓰지 않고 바로 더해준다.
//.replace(/[A-z]/g, " ")를 하면 대문자, 소문자 모두 포함되기에 toLocalCase를 쓸 필요 없다고 한다.
//다른 사람 코드
function solution(my_string) {
return my_string.split(/\D+/).reduce((acc, cur) => acc + Number(cur), 0);
}
// 정규표현식 /\D+/는 숫자가 아닌 문자에 대한 전역검색을 수행한다.
//문자를 기준으로 요소를 나누어 배열에 담는다.
선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.

//내 코드
function solution(sides) {
let a = Math.max(...sides); //sides에서 큰 수
let b = Math.min(...sides); //sides에서 작은 수
let result = [];
for(let i=1; i<a+b; i++){
if(b+i>a && i<a) result.push(i);
//가장 긴 변이 Math.max(sides)인 경우 : 나머지한변+작은변>긴변, 나머지한변<긴변
else if(a+b>i && i>=a) result.push(i);
//가장 긴 변이 나머지 한 변인 경우 : 긴변+작은변>나머지한변, 나머지한변>=긴변(같을 수도 있다!)
}
return result.length;
}
//다른 사람 코드
function solution(sides) {
return Math.min(...sides)*2-1
}
//sides = [a,b] 이고(a>b라고 가정) 새로 주어지는 변의 길이를 c라고 했을 때,
//a가 가장 긴변인 경우 즉 a > c인 경우 b + c > a > c 이므로 a > c > a-b 이기 때문에
//c의 정수 갯수는 b-1개 / c가 가장 긴변인 경우도 이런식으로 하면 되고
//a=c 인경우 한가지 이므로 2b-1이 나온다.
//다른 사람 코드
function solution(sides) {
sides.sort((a,b) => b - a);
return sides[1] + sides[1] -1;
}
//이 코드는 좀 신기했다. 규칙을 찾아낸건거 같은데, result는 항상 sides의 작은 수*2에 -1을 한 값과 같다.
PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.

//내 코드
function solution(spell, dic) {
for(let j of spell){
dic = dic.map(v => v.indexOf(j)===-1 ? v="" : v);
}
return dic.join("") !== "" ? 1:2;
}
//spell을 하나씩 돌면서 spell의 index가 dic의 요소에 있는지 확인
//없다면 -1이 나오고, -1이 나오면 바로 dic의 요소는 빈문자열로 만든다.
//dic에는 spell의 요소가 다 있는 문자열을 제외하면 나머지 요소는 빈문자열이 될 것이다.
//요소를 다 합쳐 문자열로 만들 때 빈 문자열만 있다면 2, 아니면 1
//내 코드(처음 코드)
function solution(spell, dic) {
for(let i=0; i<dic.length; i++){
for(let j of spell){
if(dic[i].indexOf(j)===-1) dic[i]="";
}
}
return dic.filter(v => v!=="").length !==0 ? 1:2;
}
//처음에 어떻게 시작해야 될지 감이 안잡혀서 이중 for문을 돌려서 위의 코드와 똑같이 빈문자열과 문자열이 있는 배열을 만들고
//빈 문자열을 필터링한 후 배열의 길이가 0이 아니면 1, 맞으면 2
//다른 사람 코드
function solution(p, d) {
return d.some(s => p.sort().toString() == [...s].sort().toString()) ? 1 : 2;
}
//some() 메서드는 배열 안의 어떤 요소라도 주어진 판별 함수를 적어도 하나라도 통과하는지 테스트하고 boolean값 반환한다.
//그러니까 dic요소들 중 하나라도 정렬한 spell과 정렬한 dic요소가 서로 같다면 true, 아니면 false를 반환
//sort를 사용하여 알파벳순서대로 배열하게 만들어 일치하는 값을 찾는 방법을 사용했다.
//다른 사랍 코드
function solution(spell, dic) {
return dic.filter(t => {
return spell.every(k => t.includes(k))
}).length > 0 ? 1 : 2;
}
//every() 메서드는 배열 안의 모든 요소가 주어진 판별 함수를 통과하는지 테스트하고 Boolean 값을 반환한다.
//dic 요소를 필터링 할건데,
//spell.every(k => t.includes(k)) : spell의 모든 요소가 dic의 요소에 포함되는 것만 남기고 제거한다.
//배열에 요소가 1개라도 있다면 1, 아니면 2
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

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


//내 코드
function solution(board) {
let idx=[]; //지뢰인덱스들이 push될 2차원배열
//지뢰인덱스 찾기
for(let i=0; i<board.length; i++){
for(let j=0; j<board[i].length; j++){
if(board[i][j]===1){
idx.push([i,j]);
}
}
}
let result = board.slice(); //board 복제해서 1을 업데이트 해줄 result에 부여
for(let k of idx){ //1이 있는 idx배열 차례로 반복
[x,y] = k; //x,y배열은 반복때마다 k로 바뀐다.
//지뢰인덱스에 그 주변 8개 모두 1로 만들기
//(x-1,y-1), (x-1, y), (x-1,y+1), (x,y-1), (x,y+1), (x+1,y-1), (x+1,y), (x+1,y+1)
result = result.map((el,idx) => idx===x-1 || idx===x || idx===x+1 ? el.map((v,idx)=>idx===y-1 || idx===y || idx===y+1 ? 1:v):el);
}
//전체에서 1의 개수를 빼기
return board.length*board.length - (result.join([]).split("").filter(v=>v==="1").length);
}
//다른 사람 코드
//지뢰를 기준으로 주변을 보는게 아니고 주변에 지뢰가 있는지 확인하는 접근방식
//하나씩 인덱스 접근, 주변에 지뢰가 없다면 safezone++
function solution(board) {
let outside = [[-1,0], [-1,-1], [-1,1], [0,-1],[0,1],[1,0], [1,-1], [1,1]];
let safezone = 0;
board.forEach((row, y, self) => row.forEach((it, x) => {
if (it === 1) return false;
return outside.some(([oy, ox]) => !!self[oy + y]?.[ox + x])
? false : safezone++;
}));
return safezone;
}
//forEach(row, y, self) = item,index,arr
//board.forEach로 배열 하나씩 꺼내고 또 forEach로 요소를 하나씩 꺼내는데,
//그 요소가 1이라면 무시
//0이라면, outside.some의 결과가 false라면 safezone하나씩 더해주기
//outside요소를 변수 [oy, ox]에 담아준다.
//!!self[oy + y]?.[ox + x]
//board[outside요소들 중 처음인덱스+board의 인덱스]
//[outside요소들 중 나중인덱스+board[y]의 인덱스
//some : 배열 안의 어떤 요소라도 주어진 판별 함수를 적어도 하나라도 통과하는지 테스트해서 통과하면 true
//safezone은 위험구역을 제외한 나머지 구역이다.