1. 코드 처리하기
[문제 설명]
문자열 code가 주어집니다.
code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다.
mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.
mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.
- mode가 0일 때
- code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
- code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다.
- mode가 1일 때
- code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
- code[idx]가 "1"이면 mode를 1에서 0으로 바꿉니다.
문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.
단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.
[답변]
function solution(code) {
let mode = 0;
let ret = "";
for(let idx=0; idx<code.length; idx++){
if(code[idx] === "1") mode === 0 ? mode = 1 : mode = 0;
if(mode === 0)
(code[idx] !== "1") && ((idx % 2 === 0) && (ret += code[idx]));
else
(code[idx] !== "1") && ((idx % 2 !== 0) && (ret += code[idx]));
}
return ret === "" ? "EMPTY" : ret;
}
💡 진짜... if문을 떡칠할까 하다가 삼항연산자도 써보고 여러 고민을 많이 한 문제. 기초가 부족함을 많이 느꼈다. 여러가지 시도를 많이 한 문제.
처음엔 이렇게 삼항연산자를 이용해서 풀어보려 했다.
if(mode === 0)
idx % 2 === 0 ? ret += code[idx] : null;
else
idx % 2 !== 0 ? ret += code[idx] : null;
하지만 else문이 필요하지 않은데 null을 넣어가면서까지 사용하는 건 비효율적일 것 같아서 열심히 찾아봤고, and연산을 사용해서 풀어보았다.
정보처리기사 준비할 때 연산자 부분 열심히 봤다고 생각했는데, boolean(true, false)값으로 반환되는 줄 알았다. 바보...
💡 and 연산 (&&) : 앞 표현식이 falsy하게 평가되면 앞 반환, 아니면 뒤 반환
💡 or 연산 (||) : 앞 표현식이 truthy하게 평가되면 앞 반환, 아니면 뒤 반환
프론트엔드 초보 개발자 오픈채팅방에서 새로운 지식을 하나 더 배울 수 있었다 👍
내가 제출한 정답이 깔끔하고 완벽한 코드라고 하진 못하겠지만, 새로운 정보를 배울 수 있었고,
맨날 1~3점만 받다가 6점을 받아봤다... 이런 거에 감격하는 코린이 😎
다른 답변도 정독하고 참고하여 머릿속에 꼭꼭 집어넣어야겠다.
2. 등차수열의 특정한 항만 더하기
[문제 설명]
두 정수 a, d와 길이가 n인 boolean 배열 included가 주어집니다. 첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때, 이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는 solution 함수를 작성해 주세요.
[제한사항]
- 1 ≤ a ≤ 100
- 1 ≤ d ≤ 100
- 1 ≤ included의 길이 ≤ 100
- included에는 true가 적어도 하나 존재합니다.
[답변]
function solution(a, d, included) {
let answer = 0;
included.forEach(function(i){
(i === true) && (answer += a);
a += d;
});
return answer;
}
💡 배운 건 바로바로 써먹어야 해서 조건부 and 연산을 사용해서 풀어봤다. forEach()로 배열을 순회하고, 값을 더해주기
[다른 답변]
function solution(a, d, included) {
return included.reduce((acc, flag, i) => {
return flag ? acc + a + d * i : acc
}, 0)
}
이렇게 깔끔하게도 풀 수 있다니, reduce() 함수를 사용하여 푼 답안이다.
💡 arr.reduce(callback[, initialValue]), 배열의 각 요소를 순회하며 callback함수의 실행 값을 누적하여 하나의 결과값을 반환하는 함수
- 파라미터
- accumulator - 반환값 누적
- currentValue - 배열의 현재 요소
- index(선택) - 배열의 현재 요소의 인덱스
- array(선택) - 호출할 배열
함수의 반환값은 accumulator에 할당되고 순회 중 계속 누적되어 최종적으로 하나의 값을 반환한다.
3. 주사위 게임 2
[문제 설명]
1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.
세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
[답변]
function solution(a, b, c) {
let answer = 0;
if(a !== b && a !== c && b !== c){
answer = a + b + c;
} else if (a === b && a === c && b === c) {
answer = (a + b + c) * (Math.pow(a,2) + Math.pow(b,2) + Math.pow(c,2)) * (Math.pow(a,3) + Math.pow(b,3) + Math.pow(c,3));
} else {
answer = (a + b + c) * (Math.pow(a,2) + Math.pow(b,2) + Math.pow(c,2));
}
return answer;
}
💡 Math.pow() 함수를 활용해 제곱했음... 근데 너무 길어져서 마음에 들지 않는다!
[다른 답변]
const solution = (a, b, c) => {
const set = new Set([a, b, c]);
switch ([...set].length) {
case 1: return calculate([a, b, c], 3);
case 2: return calculate([a, b, c], 2);
case 3: return calculate([a, b, c]);
}
};
const calculate = (inc, n=1) => {
const [a, b, c] = inc;
let result = 1;
for (let i = 1; i <= n; i++) {
result *= Math.pow(a, i) + Math.pow(b, i) + Math.pow(c, i)
}
return result;
};
💡 Set 객체를 사용한 답변... 계산식을 calculate 함수로 따로 빼서 작성한 답변이었다. 기억해둬야지
set 객체는 중복되지 않는 유일한 값들의 집합으로 동일한 값을 포함할 수 없고, 요소 순서의 의미가 없다.
수학적 집합을 구현하기 위한 자료구조로 교집합, 합집합, 차집합, 여집합 등을 구현할 수 있다.
4. 원소들의 곱과 합
[문제 설명]
정수가 담긴 리스트 num_list가 주어질 때, 모든 원소들의 곱이 모든 원소들의 합의 제곱보다 작으면 1을 크면 0을 return하도록 solution 함수를 완성해주세요.
[제한사항]
- 2 ≤ num_list의 길이 ≤ 10
- 1 ≤ num_list의 원소 ≤ 9
[답변]
function solution(num_list) {
let mul = num_list.reduce((accumulator, currentNumber) => accumulator * currentNumber);
let sum = num_list.reduce((accumulator, currentNumber) => accumulator + currentNumber);
return mul <= (sum*sum) ? 1 : 0;
}
💡 오늘 학습한 reduce() 함수를 이용하여 풀어보았다. 뿌듯 😎
5. 이어 붙인 수
[문제 설명]
정수가 담긴 리스트 num_list가 주어집니다. num_list의 홀수만 순서대로 이어 붙인 수와 짝수만 순서대로 이어 붙인 수의 합을 return하도록 solution 함수를 완성해주세요.
[제한사항]
- 2 ≤ num_list의 길이 ≤ 10
- 1 ≤ num_list의 원소 ≤ 9
- num_list에는 적어도 한 개씩의 짝수와 홀수가 있습니다.
[답변]
function solution(num_list) {
let odd = "";
let even = "";
num_list.forEach(function(num){
num % 2 === 0 ? even += num : odd += num;
});
return Number(odd) + Number(even);
}
💡 forEach()를 활용하여 배열을 탐색하고, 짝수면 even에 추가, 홀수면 odd에 추가하여 Number()로 형변환하여 return 했다.
'프로그래머스 > Lv. 0 코딩 기초 트레이닝' 카테고리의 다른 글
[프로그래머스] 코딩 기초 트레이닝 Day 7 / JS (0) | 2023.07.26 |
---|---|
[프로그래머스] 코딩 기초 트레이닝 Day 6 / JS (0) | 2023.07.25 |
[프로그래머스] 코딩 기초 트레이닝 Day 4 / JS (0) | 2023.07.23 |
[프로그래머스] 코딩 기초 트레이닝 Day 3 / JS (0) | 2023.07.22 |
[프로그래머스] 코딩 기초 트레이닝 Day 2 / JS (0) | 2023.07.21 |