230411_Algorithm

majungha·2023년 4월 27일
1

알고리즘

목록 보기
22/71

오늘의 알고리즘 👍

📝 1. 숫자 문자열과 영단어

  • 네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
  • 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
    1478 → "one4seveneight"
    234567 → "23four5six7"
    10203 → "1zerotwozero3"
  • 이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다.
  • s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

▷ 입출력 예

solution("one4seveneight") // 1478
solution("23four5six7") // 234567
solution("2three45sixseven") // 234567
solution("123") // 123
solution("3twotwoone") // 3221

▷ 내 풀이

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'); // 슬래시(/)안쪽으로 검증하고 싶은 문자를 적어준다. /g => 모든 문자를 찾겠다.
  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]) // 1
solution([1,2,7,6,4]) // 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;
  // 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) {
              // 약수가 두개를 초과한다 === 소수가 아니다
              break;
            }
          }
        }
        if (count === 2) {
          // 약수가 2개라면 === 소수가 맞다.
          answer++;
        }
      }
    }
  }
  return answer;
}

▷ reduce 매서드 사용 풀이

function solution(nums) {
  let idx = 0; // 배열을 자르기 위한 인덱스값

  // 1. 첫번째 숫자를 가져오는 과정
  return nums.reduce((acc, num1, i) => {
    idx = i + 1;
    // 2. 두번째 숫자를 가져오는 과정
    nums.slice(idx).forEach((num2) => {
      // 3. 세번째 숫자를 가져오는 과정
      nums.slice(++idx).forEach((num3) => {
        // ++가 뒤에 들어오면 바로 적용되는 것이 아니라 밑에부터 적용이 된다. ++를 앞에 넣으면 바로 적용이 된다.
        const sum = num1 + num2 + num3;

        let count = 0;
        if (sum % 2 === 1) {
          // 세개의 숫자의 합이 홀수인 경우만 for문을 돌린다.
          for (let o = 1; o <= sum; o++) {
            if (sum % o === 0) {
              count++;
            }

            if (count > 2) {
              break;
            }
          }
        }
        if (count === 2) {
          acc++;
        }
      });
    });
    return acc;
  }, 0);
}

출처: 프로그래머스
출처: 코드캠프

profile
개발자 블로그 / 항상 겸손한 자세로 배우면서 성장하자 할 수 있다!

0개의 댓글