2023-04-11 알고리즘 TIL

정승원·2023년 4월 11일
0
post-thumbnail
post-custom-banner

📒 목차

📌 숫자 문자열과 영단어
📌 소수 만들기
📌 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: 1478

s: "23four5six7"
result: 234567

s: "2three45sixseven"
result: 234567

s: "123"
result: 123


<입출력 예 설명>
입출력 예 #1

문제 예시와 같습니다.
입출력 예 #2

문제 예시와 같습니다.
입출력 예 #3

"three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.
입출력 예 #4

s에는 영단어로 바뀐 부분이 없습니다.

✅ 풀이 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: 1

nums: [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);
}

📌 TIPS

✅ 적용 시점 조절하기 (++, --)

idx = 0;
++idx; => 즉시 적용

idx = 0;
idx++; => 선언 이후 적용
idx;

post-custom-banner

0개의 댓글