[프로그래머스/Kotlin]Lv2 - 모음사전

2025. 1. 3. 15:13프로그래머스/Kotlin | Level2

728x90
반응형
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제

문제 설명

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.

단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • word의 길이는 1 이상 5 이하입니다.
  • word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.

입출력 예

word result
"AAAAE" 6
"AAAE" 10
"I" 1563
"EIO" 1189

입출력 예 설명

입출력 예 #1

사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA", "AAA", "AAAA", "AAAAA", "AAAAE", ... 와 같습니다. "AAAAE"는 사전에서 6번째 단어입니다.

 

입출력 예 #2

"AAAE"는 "A", "AA", "AAA", "AAAA", "AAAAA", "AAAAE", "AAAAI", "AAAAO", "AAAAU"의 다음인 10번째 단어입니다.

 

입출력 예 #3

"I"는 1563번째 단어입니다.

 

입출력 예 #4

"EIO"는 1189번째 단어입니다.


풀이

풀이 접근 과정

처음에 문제가 이해 안됐다.

A 다음에 E여야 하는거 아닌가?
A 다음에 AA라고??
그럼 AAAE 다음엔 AAAI인거야? 아니면 AAAEA인거야??

그러다가 프로그래머스 [질문하기] 제일 첫 질문에서 힌트를 얻었다.

aeiou를 대충 1,2,3,4,5로 바꿔서 소수점으로 만들어서
**A = 0.1, AA= 0.11, AAE = 0.112, AAEAA = 0.11211**
이런식으로 만들어서 크기 비교로 생각하면 쉬울 것 같아요

최종 소스코드

class Solution {
    fun solution(word: String): Int {
        val array = arrayListOf<Double>()

        for (i in 1 .. 55555) {
            val c = i.toString()
            if (!c.contains('0') && !c.contains('6') && !c.contains('7') && !c.contains('8') && !c.contains('9')) {
                array.add("0.$c".toDouble())
            }
        }

        array.sort()

        val newWord = word.replace('A', '1')
            .replace('E', '2')
            .replace('I', '3')
            .replace('O', '4')
            .replace('U', '5')

        return array.indexOf("0.$newWord".toDouble()) + 1
    }
}
  1. 1부터 55555까지의 값들 중에서 1,2,3,4,5만 포함되어 있는 범위로 소수점을 만든다.
  2. 소수점을 만든 걸 arrayList에 넣고 오름차순 정렬한다.
  3. 입력받은 word를 소수로 바꾸어서 위치를 찾아내 리턴한다.

Comment

그냥 힌트 그대로 풀었는데 풀리긴 풀림…

근데 워낙 거지같이 풀어서 그런가 꼴랑 1점 주네.

대부분 DFS로 푼걸 봐서는 그게 정석 풀이인가보다~~

728x90
반응형