※주의※
저의 풀이가 정답은 아닙니다.
다른 코드가 더 효율적이거나 좋을 수 있습니다.
언제나 다른 사람의 코드는 참고만 하시기 바랍니다.
[문제 풀이 사이트]
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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. AAAA와 10. AAAE를 보면
4번째 자릿수는 6 차이(10 - 4)로 변경이 되는 것을 알 수 있다.
(생략)
28. AAAU
29. AAAUA
30. AAAUE
31. AAAUI
32. AAAUO
33. AAAUU
34. AAE
3. AAA와 34. AAE를 보면
3번째 자릿수는 31 차이(34 - 3)로 변경이 되는 것을 알 수 있다.
(생략)
152. AAUU
153. AAUUA
154. AAUUE
155. AAUUI
156. AAUUO
157. AAUUU
158. AE
2. AA와 158. 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;
}
'PS > Programmers' 카테고리의 다른 글
[Programmers Level2] 게임 맵 최단거리(C++) (0) | 2022.07.31 |
---|---|
[Programmers Level2] 더 맵게(C++) (0) | 2022.07.22 |
[Programmers Level2] N개의 최소공배수(C++) (0) | 2022.07.20 |
[Programmers Level1] 최대공약수와 최소공배수(C++) (0) | 2022.07.20 |
[Programmers Level2] 괄호 회전하기(C++) (0) | 2022.07.19 |
댓글