📌 숫자 문자열과 영단어
📌 소수 만들기
📌 TIPS
<문제 설명>
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자 영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine
<제한사항>
1 ≤ s의 길이 ≤ 50
s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.
<입출력 예>
s: "one4seveneight"
result: 1478s: "23four5six7"
result: 234567s: "2three45sixseven"
result: 234567s: "123"
result: 123
<입출력 예 설명>
입출력 예 #1문제 예시와 같습니다.
입출력 예 #2문제 예시와 같습니다.
입출력 예 #3"three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.
입출력 예 #4s에는 영단어로 바뀐 부분이 없습니다.
✅ 풀이 1. split과 join을 활용한 풀이
function solution(s) { let answer = s; let en = [ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", ]; for (let i = 0; i < en.length; i++) { let spl = answer.split(en[i]); answer = spl.join(i); } return Number(answer); }
✅ 풀이 2. replaceAll을 활용한 풀이
let numbers = [ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", ]; function solution(s) { for (let i = 0; i < numbers.length; i++) { s = s.replaceAll(numbers[i], i); // 해당하는 모든 문자열 바꾸기 // while( s.includes(numbers[i]) ){ // s = s.replace( numbers[i], i) // } // replace() //문자열 변경 메서드 //공통된 것이 있다면 제일 앞에 있는 것만 바뀐다. } return Number(s); }
✅ 풀이 3. 정규표현식을 활용한 풀이
// 풀이 3. let numbers2 = [ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", ]; function solution(s) { // 정규표현식 사용하기 for (let i = 0; i < numbers.length; i++) { const regExp = new RegExp(numbers[i], "g"); // console.log(regExp) s = s.replace(regExp, i); } // 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); }
<문제 설명>
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
<제한사항>
nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
<입출력 예>
nums: [1,2,3,4]
result: 1nums: [1,2,7,6,4]
result: 4
<입출력 예 설명>
입출력 예 #1
[1,2,4]를 이용해서 7을 만들 수 있습니다.입출력 예 #2
[1,2,4]를 이용해서 7을 만들 수 있습니다.
[1,4,6]을 이용해서 11을 만들 수 있습니다.
[2,4,7]을 이용해서 13을 만들 수 있습니다.
[4,6,7]을 이용해서 17을 만들 수 있습니다.✅ 풀이 1. for문을 활용한 풀이
function solution(nums) { let answer = 0; // 서로 다른 숫자 구하기 // 1. 첫번째 숫자를 가져오는 과정 for (let i = 0; i < nums.length; i++) { // 2. 두번째 숫자를 가져오는 과정 for (let l = i + 1; l < nums.length; l++) { // 3. 세 번째 숫자를 가져오는 과정 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) { // 약수가 2개를 초과한다. = 소수가 아니다. break; } } } if (count === 2) { // 약수가 2개가 맞다면 = 소수가 맞다. answer++; } } } } return answer; }
✅ 풀이 2. reduce와 forEach를 활용한 풀이
function solution(nums) { let idx = 0; // 배열을 자르기 위한 인덱스 값 // 1. 첫번째 숫자를 가져오는 과정 return nums.reduce((acc, num1, i) => { idx = i + 1; // 2. 두 번째 숫자를 가져오는 과정 nums.slice(idx).forEach((num2) => { // console.log(num1. num2); // idx++; // 3. 세 번째 숫자를 가져오는 과정 nums.slice(++idx).forEach((num3) => { const sum = num1 + num2 + num3; let count = 0; if (sum % 2 === 1) { // 세개의 숫자의 합이 홀수인 경우만 for (let o = 1; o <= sum; o++) { // console.log(sum, o, sum%o) if (sum % o === 0) { count++; } if (count > 2) { break; } } console.log(sum, count); if (count === 2) { acc++; } } }); }); return acc; }, 0); }
✅ 적용 시점 조절하기 (++, --)
idx = 0;
++idx; => 즉시 적용idx = 0;
idx++; => 선언 이후 적용
idx;