일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 블록체인
- JavaScript
- join
- 프로그래머스
- array
- MySQL
- 재귀함수
- 코드스테이츠
- array.slice()
- 코딩테스트
- 최강의 인생
- 개발자의 책장
- for문
- Algorithms
- SQL
- Developer_JoyKim
- node.js
- 자바스크립트
- 코딩공부
- select
- Programmers
- Where
- 역행자
- Hackerrank
- 알고리즘
- 개발자_조이킴
- 코플릿
- 배열
- 정규표현식
- array.push()
- Today
- Total
CodingSpace
모음사전 본문
Problem. 모음사전
Link.
https://programmers.co.kr/learn/courses/30/lessons/84512
Description.
사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용할 수 있는, 길이 5이하의 모든 단어가 수록되어 있습니다.
단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 작성하세요.
※ 제한사항
- word의 길이는 1 이상 5 이하이다.
- word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있다.
Approach.
1) 모든 문자열을 생성하고 사전식으로 정렬하여 매개변수 word를 indexOf 메소드로 찾기 (간단하고 무식한 방법!)
- DFS 방식으로 모든 경우의 수를 고려하여 문자열을 생성해 배열에 삽입
- 이후 sort 메소드를 사용하여 배열내 요소들을 사전식으로 정렬
- 정렬된 배열에서 indexOf 메소드를 사용해 매개변수 word의 위치를 찾아냄 (인덱스)
- 배열의 인덱스가 0부터 시작했으므로 찾아낸 인덱스에 1을 더해 최종적으로 반환!
2) 규칙을 찾아서!
모든 경우의 수를 먼저 살펴보자
① 문자열 5자리: 5×5×5×5×5 = 3125
② 문자열 4자리: 5×5×5×5 = 625
③ 문자열 3자리: 5×5×5 = 125
④ 문자열 2자리: 5×5 = 25
⑤ 문자열 1자리: 5 = 5
따라서 모든 문자열의 개수는 아래와 같다:3125 + 625 + 125 + 25 + 5 = 3905
본격적으로 규칙을 찾아보자!
- 문자열 5번째 자리가 바뀌는 경우: 1씩 바뀐다
AAAAA = 5
AAAAE = 6
AAAAI = 7
AAAAO = 8
AAAAU = 9
3905/3125 = 1.25
Math.floor(3905/3125) = 1
- 문자열 4번째 자리가 바뀌는 경우: 6씩 바뀐다
AAAA = 4
AAAE = 10
AAAI = 16
AAAO = 22
AAAU = 28
3905/625 = 6.25
Math.floor(3905/625) = 6
- 문자열 3번째 자리가 바뀌는 경우: 31씩 바뀐다
AAA = 3
AAE = 34
AAI = 65
AAO = 96
AAU = 127
3905/125 = 31.24
Math.floor(3905/125) = 31
마찬가지로 문자열 2번째와 1번째 경우를 구해보면 각각
3905/25 = 156.2
Math.floor(3905/25) = 156
3905/5 = 781
Math.floor(3905/5) = 781
위의 규칙을 종합해보면,
각 자리수가 바뀌는데 필요한 횟수를 각각 구한 후
모두 더해주면 우리가 원하는 답이 나온다!
프로그래머스 입출력 예시로 위의 규칙이 맞는지 확인해보자!
#1. word = "AAAE"
첫번째 자리수 A이므로: +1
두번째 자리수 A이므로: +1
세번째 자리수 A이므로: +1
네번째 자리수 E이므로 A에서 한번 바뀌었다: (6×1)+1=7
총합: 1+1+1+7 = 10
#2. word = "I"
첫번째 자리수 I이므로 A에서 두번 바뀌었다: (781×2)+1=1563
총합: 1563 = 1563
#3. word = "EIO"
첫번째 자리수 E이므로 A에서 한번 바뀌었다: (781×1)+1=782
두번째 자리수 I이므로 A에서 두번 바뀌었다: (156×2)+1=313
세번째 자리수 O이므로 A에서 세번 바뀌었다: (31×3)+1=94
총합: 782+313+94 = 1189
My Answer.
1) 모든 문자열을 생성한 방법
function solution(word) {
let answer = [];
let list = ['A', 'E', 'I', 'O', 'U']
// 만들어진 문자열을 stack에 쌓는다
const dfs = (list, depth, num, arr) => {
if(depth === num) {
answer.push(arr.join(""))
return
}
else {
for(let i = 0; i < 5; i++) {
arr.push(list[i])
dfs(list, depth + 1, num, arr)
arr.pop()
}
}
}
for(let i = 1; i <= 5; i++) {
dfs(list, 0, i, [])
}
return answer.sort().indexOf(word) + 1
}
2) 규칙을 찾아 구현한 방법
function solution(word) {
let match = {
A: 0,
E: 1,
I: 2,
O: 3,
U: 4,
}
return word.split("").reduce((acc, cur, idx) => acc + match[cur]*[781, 156, 31, 6, 1][idx] + 1, 0)
}
References.
https://velog.io/@cjh951114/JavaScriptProgrammers-%EB%AA%A8%EC%9D%8C-%EC%82%AC%EC%A0%84
https://programmers.co.kr/questions/25140
'프로그래머스 > Level2' 카테고리의 다른 글
멀리 뛰기 (0) | 2022.09.14 |
---|---|
단어 변환 (0) | 2022.09.12 |
JadenCase 문자열 만들기 (0) | 2021.12.27 |
프로그래머스#7(Lv.2)_구명보트 (0) | 2021.12.02 |
프로그래머스#6(Lv.2)_기능개발 (0) | 2021.11.30 |