function solution(dartResult) {
// 1. 숫자일 경우
// 2. 보너스일 경우
// 3. 옵션일 경우
let score = 0;
let bonus = [];
for(let i = 0 ; i < dartResult.length ; i++){
// 10점일 때
// 전 인덱스가 1이면 10임 그러면
// true면 10 넣어주고 false면 dartResult[i]
if(!isNaN(dartResult[i])){
score = Number(dartResult[i-1]) === 1 ? 10 : Number(dartResult[i]);
} else if(dartResult[i] === "S"){ // 보너스 S일 때
bonus.push(score);
} else if(dartResult[i] === "D"){ // 보너스 D일 때
bonus.push(Math.pow(score, 2));
} else if(dartResult[i] === "T"){ // 보너스 T일 때
bonus.push(Math.pow(score, 3));
} else if(dartResult[i] === "*"){ // 옵션 *일 때
bonus[bonus.length-2] = bonus[bonus.length-2] * 2; // 기회는 3번이기 때문에 두번째나 세번째 기회일 때 앞에 점수를 중첩으로 *2 해 줘야됨
bonus[bonus.length-1] = bonus[bonus.length-1] * 2;
} else if(dartResult[i] === "#"){ // 옵션 #일 때(해당 점수 마이너스)
bonus[bonus.length-1] = -1 * bonus[bonus.length-1];
}
}
let result = 0;
result = bonus.reduce((a, c) =>{
return a + c;
}, 0);
return result;
}
내가 풀었던 방식... 다트 게임 결과 한 문자씩 돌면서 숫자/보너스/옵션일 때를 하나씩 if문으로 돌려 주었다 인덱스 주는 부분은 아직도 헷갈림....ㅎ 그리고 10일 경우에 대해서 어떻게 설정해 줘야 될지 많이 고민했던 문제! 구글링 참고해서 풀었다... 따흑~
/*
다트 기회 3번
S,D,T라는 영역이 존재, s = 1제곱 d = 2제곱 t = 3제곱
*, #라는 옵션이 존재 * = 전에 얻은 점수를 2배로 만듦, # = 마이너스2배
총 연산값을 리턴하기
*/
function solution(dartResult) {
var numArr = [];
var number = 0;
var answer = 0;
for (var i=0; i<dartResult.length; i++) {
// 점수
if (/[0-9]/.test(dartResult[i])) {
if (dartResult[i] == 1 && dartResult[i+1] == 0) {
number = 10;
i++;
} else {
number = dartResult[i];
}
}
// 보너스
if (dartResult[i] == 'S') numArr.push(number ** 1);
if (dartResult[i] == 'D') numArr.push(number ** 2);
if (dartResult[i] == 'T') numArr.push(number ** 3);
// 옵션
if (dartResult[i] == '#') numArr[numArr.length-1] *= -1;
if (dartResult[i] == '*') {
numArr[numArr.length-1] *= 2;
numArr[numArr.length-2] *= 2;
}
}
// 계산
numArr.map((item) => {
answer += Number(item);
})
return answer;
인상 깊었던 동원님 코드 조건을 걸어 줄 때 .test를 쓰셔서 신기했다!! 그럼 바아로 뭔지 알아 봐야지
저 코드에서는 0-9까지 숫자인지 판별하는 조건으로 .test()를 쓰셔서 신기했다
function solution(a, b, n) {
let get = 0; // 마트에서 받은 콜라의 수
let remain = n; // 남은 콜라의 수(가진 빈 병의 수)
let result = 0; // 받은 콜라의 합계를 구하기 위한 변수
// 보유 중인 빈 병(남은 콜라)이 a개 미만일 때까지 반복
while(remain >= a){
// 1. 빈 병을 주고 콜라를 받는다
// (내가 가진 빈 병 / 마트에 줘야 되는 수) * 받는 콜라의 수(받는 콜라의 수가 1이 아닐 수도 있음)
get = Math.floor(remain / a) * b;
// 2. 남은 콜라를 구한다
// 남은 콜라(내가 가진 빈 병): 받은 콜라 + 아까 안 주고 남은 콜라
remain = get + (remain % a);
// 3. 받은 콜라 누적
result += get;
}
return result;
}
남은 콜라가 a 미만이라고 해서 조건 줄 때 살짝 헷갈렸던 문제..... 그림으로 그려서 어떻게 풀지 이해하면서 하니까 나름 잘 풀렸다
function solution(a, b, n) {
// 돌려받는 병 수 : 전체에서 a만큼 나눈 몫 * b
// 다음 전체 병 수 : 이전 병수의 나머지 + 이전 돌려 받은 병 수
// 종료 조건 : 더 이상 돌려받을 병이 없을 때
let answer = 0;
const startNum = n;
const divider = a;
const giveNum = b;
let tempNum = startNum;
while(true){
const cashback = Math.floor(tempNum / divider) * giveNum;
console.log(cashback);
if(cashback === 0){
break;
}
answer += cashback;
tempNum = cashback + tempNum % divider;
}
return answer;
}
나랑 비슷하지만 while에 true로만 주시고 break로 걸어두신 방법도 좋아보여서 가지고 옴...
function solution(lottos, win_nums) {
const ranking = [6, 5, 4, 3, 2, 1];
let result = [];
// 맞힌 번호로만 구성된 배열의 길이를 구해서 맞힌 번호의 수를 구한다
let same = lottos.filter( ele => win_nums.includes(ele)).length;
// 0으로만 구성된 배열의 길이를 구해서 0의 개수를 구한다
let zero = lottos.filter( ele => ele === 0).length;
// 최고 순위 구하기(최고 순위는 내가 맞힌 번호의 수 + 0의 개수)
let best = same + zero
best === 1 || best === 0 ? result.push(ranking[0]) : result.push(ranking[best-1])
// 최저 순위 구하기
same === 1 || same === 0 ? result.push(ranking[0]) : result.push(ranking[same-1]);
return result;
}
ranking이라는 배열에서 6 6 5 4 3 2 1 주면 됐는데 6등이 2개일 때라 인덱스 설정하는 게 살짝 까다로웠던 문제, 인덱스 번호가 곧 맞힌 개수로 생각하긴 했지만 6 6으로 줄 생각을 못했어서... 코드 리뷰하면서 아쉬움이 남았다 아!!!! 6 6으로 줄걸,,, 하고 ㅋㅋㅋ 그래도 인덱스값 넣는 연습했다치고 ㅎㅎ
const LOTTORANK = new Map([[6,1],[5,2],[4,3],[3,4],[2,5]]);
function solution(lottos, win_nums) {
// 가려진 부분을 0으로 표시
// 최고순위 0으로 된 부분만큼 다 맞는 것
// 최저순위 0으로 된 부분만큼 다 틀리는 것
// 기존의 것 카운트 하고 0으로 된 것 +, -
// 순위 찾기
const answer = [];
const baseCountNum = lottos.filter(value=>isMatch(value,win_nums)).length;
const zeroCount = lottos.filter(isZero).length;
console.log(baseCountNum, zeroCount);
// a ?? b
//a가 null도 아니고 undefined도 아니면 a
//그 외의 경우는 b
answer.push(LOTTORANK.get(baseCountNum + zeroCount) ?? 6);
answer.push(LOTTORANK.get(baseCountNum) ?? 6);
return answer;
}
function isMatch(value, win_nums){
return win_nums.includes(value);
}
function isZero(value){
return value === 0;
}
/*
const rank = [6, 6, 5, 4, 3, 2, 1]; 이런식으로 할 수도 있음.
*/
answer.push(LOTTORANK.get(baseCountNum + zeroCount) ?? 6);
의 ??을 굉장히 오랜만에 봐서.... 아 저런게 있었지... 한 코드
??(논리 연산자)를 기준으로 왼쪽 피연산자가 null 또는 undefined나 falsy한 값일 때 오른쪽 피연산자를 반환하고, 그렇지 않을 때는 왼쪽의 피연산자를 반환한다.