오늘의 알고리즘 👍
📝 1. 숫자 문자열과 영단어
- 네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
- 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
- 이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다.
- s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
▷ 입출력 예
solution("one4seveneight")
solution("23four5six7")
solution("2three45sixseven")
solution("123")
solution("3twotwoone")
▷ 내 풀이
const En = [ "zero", 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine' ]
const num = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
function solution(s) {
let answer = '';
for(let i = 0; i <= s.length; i++){
s.includes(num[i]) ? answer += num[i] : 0
s.includes(En[i]) ? answer += num[i] : 0
}
return answer;
}
- 위와 같이 풀었지만 위 코드와 같이 풀면 정렬이 되서 나오기 때문에 모든 테스트케이스가 실패했다.
▷ 다시 푼 풀이
function solution(s) {
let answer = s
let num = ['zero','one','two','three','four','five','six','seven','eight','nine']
for(let i = 0; i < num.length; i++) {
let arr = answer.split(num[i])
answer = arr.join(i)
}
return Number(answer);
}
▷ 수업 풀이
const num = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
function solution(s) {
for (let i = 0; i < num.length; i++) {
while (s.includes(num[i])) {
s = s.replace(num[i], i);
}
}
return Number(s);
}
▷ 위의 풀이 리팩토링
const num = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
function solution(s) {
for (let i = 0; i < num.length; i++) {
s = s.replaceAll(num[i], i);
}
return Number(s);
}
▷ split, join 매서드 사용 풀이
const num = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
function solution(s) {
for (let i = 0; i < num.length; i++) {
s = s.split(num[i]).join(i);
}
return Number(s);
}
▷ 정규표현식 사용 풀이
function solution(s) {
s = s.replace(/zero/g, '0');
s = s.replace(/one/g, '1');
s = s.replace(/two/g, '2');
s = s.replace(/three/g, '3');
s = s.replace(/four/g, '4');
s = s.replace(/five/g, '5');
s = s.replace(/six/g, '6');
s = s.replace(/seven/g, '7');
s = s.replace(/eight/g, '8');
s = s.replace(/nine/g, '9');
return Number(s);
}
▷ 정규표현식 RegExp 사용 풀이
const num = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
function solution(s) {
for (let i = 0; i < num.length; i++) {
const regExp = new RegExp(num[i], 'g');
s = s.replace(regExp, i);
}
return Number(s);
}
📝 2. 소수 만들기
- 주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다.
- 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때,
- nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
▷ 입출력 예
solution([1,2,3,4])
solution([1,2,7,6,4])
▷ 내 풀이
▷ 해결 못함 ❌
function solution(nums) {
for (let i = 0; i < nums.length - 2; i++) {
for (let j = i + 1; j < nums.length - 1; j++) {
for (let k = i + 2; k < nums.length; k++) {
if (nums[i] + nums[j] + nums[k]) {
}
}
}
}
}
- 위와 같이 3중포문을 사용하여 주어진 숫자 3개를 더해서 문제에 접근하려고 했는데 시간이 부족해서 해결하지 못하였다.
▷ 수업 풀이
function solution(nums) {
let answer = 0;
for (let i = 0; i < nums.length; i++) {
for (let l = i + 1; l < nums.length; l++) {
for (let j = l + 1; j < nums.length; j++) {
const sum = nums[i] + nums[l] + nums[j];
let count = 0;
for (let o = 1; o <= sum; o++) {
if (sum % o === 0) {
count++;
if (count > 2) {
break;
}
}
}
if (count === 2) {
answer++;
}
}
}
}
return answer;
}
▷ reduce 매서드 사용 풀이
function solution(nums) {
let idx = 0;
return nums.reduce((acc, num1, i) => {
idx = i + 1;
nums.slice(idx).forEach((num2) => {
nums.slice(++idx).forEach((num3) => {
const sum = num1 + num2 + num3;
let count = 0;
if (sum % 2 === 1) {
for (let o = 1; o <= sum; o++) {
if (sum % o === 0) {
count++;
}
if (count > 2) {
break;
}
}
}
if (count === 2) {
acc++;
}
});
});
return acc;
}, 0);
}
출처: 프로그래머스
출처: 코드캠프