본문 바로가기
TIL

TIL 240711 - 알고리즘 코드카타 리뷰 - 모음사전

by lemonpie611 2024. 7. 12.

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/84512

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

알파벳 A, E, I, O, U 를 조합한 길이 5 이하의 문자열을 특정 순서로 배치했을 때, 주어진 문자열이 몇번째에 해당하는지 구하는 문제이다.

 

2. 초기 코드

처음엔 규칙을 잘못 보고, 진법 변환을 이용하면 풀릴줄 알았다.... 몇분동안 진법으로 삽질한사람

 

규칙을 따라서 문자열을 써내려가다가 특정 패턴이 반복되는 것을 알게되었다.

네번째 문자열까지 모두 같은 문자열이 6개 연속으로 있고, 세번째까지는 31개.. 계산해보면 두번째까지는 156개, 첫번째만 같은 문자열은 781개가 반복되는 것이다.

따라서 num에 반복되는 개수를 저장하고, 알파벳에 따라 번호를 매긴 다음 자리별 반복되는 수에 해당 번호를 곱해 더해가는 식으로 계산했다.

function solution(word) {
  const num = [781, 156, 31, 6, 1]
  return word.split("").map((cur) => {
    switch (cur) {
      case "A":
        return 0;
      case "E":
        return 1;
      case "I":
        return 2;
      case "O":
        return 3;
      case "U":
        return 4;
    }
  }).reduce((acc, cur, idx, arr) => {
    return acc + cur * num[idx];
  }, 0) + word.length;
}

 

3. 최종 코드

위 코드를 조금 더 간단하게 만든 결과이다.

function solution(word) {
  const num = [781, 156, 31, 6, 1];
  const letter = ['A','E','I','O','U'];
  return word.split("").reduce((acc, cur, idx, arr) => {
    return acc + letter.indexOf(cur) * num[idx];
  }, 0) + word.length;
}