PS/Programmers

[Programmers Level2] 모음사전(C++)

박땅콩 2022. 7. 21.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

 

[문제 풀이 사이트]

 

 

 

프로그래머스

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

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번째 단어입니다.

 

 

[문제 풀이]

 

 

절규

 

 

문제를 보고 규칙 구히다가 공책에 순서를 잘못적는 바람에 !!!!!!!!!!!!!!!!!!!! 할말하않^^...

 

일단 진정하고..

우선 규칙을 구해보자.

 

1.  A

2.  AA

3.  AAA

4.  AAAA

5.  AAAAA

6.  AAAAE

 

5. AAAAA와 6. AAAAE를 보면

5번째 자릿수는 1 차이(6 - 5)로 변경이 되는 것을 알 수 있다.

 

7.  AAAAI

8.  AAAAO

9.  AAAAU

10. AAAE

 

4. AAAA10. AAAE를 보면

4번째 자릿수는 6 차이(10 - 4)로 변경이 되는 것을 알 수 있다.

 

(생략)

 

28. AAAU

29. AAAUA

30. AAAUE

31. AAAUI

32. AAAUO

33. AAAUU

34. AAE

 

3. AAA34. AAE를 보면

3번째 자릿수는 31 차이(34 - 3)로 변경이 되는 것을 알 수 있다.

 

 

(생략)

 

152. AAUU

153. AAUUA

154. AAUUE

155. AAUUI

156. AAUUO

157. AAUUU

158. AE

 

2. AA158. AE를 보면

2번째 자릿수는 156 차이(158 - 2)로 변경이 되는 것을 알 수 있다.

 

 

1번째 자리수는

입출력 예#3을 통해 알 수 있었는데

1. A 이고 1563. I 이면, A와 I 사이는 1562 차이이다.

하지만 A와 I 사이에 알파벳 E가 있으므로 E의 위치는 782이라는 것을 알 수 있다.

그래서 1. A와 782. E

1번째 자릿수는 781차이(782 - 1)로 변경이 되는 것을 알 수 있다.

 

위 규칙을 기반으로 자릿수 별로 계산을 했다.

 

자릿수 배열을 만들고

첫번째 자릿수 : 781

두번째 자릿수 : 156

세번째 자릿수 : 31

4번째 자릿수 : 6

5번쨰 자릿수 : 1

 

'A' = 0 , 'E' = 1 , 'I' = 2, 'O' = 3, 'U' = 4를 의미하도록 또 다른 배열을 만들었다.

 

입출력 예#2 "AAAE"의 위치를 찾으려면

 

첫번째 자릿수 'A'

1 + (781 X 0)

두번째 자릿수 'A'

1+ (156 X 0)

세번째 자릿수 'A'

1 + (31 X 0)

네번째 자릿수 'E'

1 + (6 X 1)

 

자릿수 별로 나온 결과 더해주기

= 1 + 1 + 1 + 7

위치 10

 

 

입출력 예#4 EIO의 위치를 찾으려면

 

첫번째 자릿수 'E'

1 + (781 X 1)

두번째 자릿수 'I'

1 + (156 X 2)

세번째 자릿수 'O'

1 + (31 X 3)

 

자릿수 별로 나온 결과 더해주기

= 782 + 313 + 94

위치 1189

 

 

[최종 코드]

 

 

[GitHub]

 

 

 

GitHub - SmallPeanutPark/Programmers: Study Programmers for Coding Test

Study Programmers for Coding Test. Contribute to SmallPeanutPark/Programmers development by creating an account on GitHub.

github.com

 

 

#include <string>
#include <vector>

using namespace std;

int solution(string word) {
    int answer = 0;
    /*
    첫째 자리 : 781
    둘째 자리 : 156
    셋째 자리 : 31
    넷째 자리 : 6
    다섯째 자리 : 1
    */
    int arr[5] = { 781, 156, 31, 6, 1 };
    char value[5] = { 'A', 'E', 'I', 'O', 'U' }; // 0 , 1, 2, 3, 4

    int len = word.size();
    for (int i = 0; i < len; ++i) {
        for (int j = 0; j < 5; ++j) {
            if (word[i] == value[j]) {
                answer += (1 + (arr[i] * j));
                break;
            }
        }
    }
    return answer;
}

 

728x90

댓글