문제풀이/프로그래머스

[프로그래머스] 모음사전 Java 풀이

걸음마 개발자 2021. 12. 3. 02:50
반응형

이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.

틀리거나 잘못된 정보가 있을 수 있습니다.

댓글로 알려주시면 수정하도록 하겠습니다.


1. 문제

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

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

2. 입력

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

3. 예제

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

4. 풀이

이번 문제는 2가지 방법으로 풀이가 가능합니다.

  1. 완전 탐색을 이용
  2. 경우의 수를 이용
  • 완전탐색을 이용
    먼저 A, E, I, O, U를 이용하여 만들 수 있는 모든 문자열을 재귀 함수를 통해 만들어야 합니다.

    재귀 함수는 함수로 전달된 파라미터인 이전에 완성된 문자열을 List에 넣은 뒤 해당 문자열 뒤에 A, E, I, O, U 문자를 더하여 재귀를 호출하는 방법으로 모든 문자열을 만들고 List에 추가하였습니다.

    이전에 만들어져 파라미터로 넘어온 문자열의 길이가 5이면 더 이상 뒤에 문자를 추가할 필요가 없으므로 return을 이용하여 함수를 종료하였습니다.

    List는 아직 사전 순서대로 정렬이 되지 않아 Sort를 진행하여 정렬을 한 뒤 List에 정답 단어의 Index를 찾은 뒤 1을 더한 값을 반환하여 문제를 풀 수 있습니다.
    (Index의 경우 0부터 시작하고 사전은 1부터 시작하므로 1을 더해줘야 함)

  • 경우의 수를 이용
    A는 사전 번호로 1번에 있습니다. 그렇다면 E는 사전에서 몇번일까요 예시에서 주어진 I가 1563이므로 E는 782가 될 것입니다.
    A가 1번이고 I가 1563번이므로 정 가운데인 E는 782가 된다. 즉 A로 시작하는 문자는 총 782개가 있다.

    그럼 AA와 AE 사이에는 몇 개의 문자가 있는가?
    그림 처럼 781 / 5를 한 값 만큼 각 수들은 떨어져 있다.

    이러한 조건을 보면 문자가 A, E, I, O, U 총 5개 이므로 정답을 알고자 하는 문자의 가장 왼쪽은 문자 Index * 781 + 1 값 만큼 떨어져 있고 그 다음 문자는 Index * 781 / 5 + 1 값 만큼 떨어져 있고 그 다음 문자 또한 Index * 781 / 5 / 5 + 1 값 만큼 떨어져 있는 것이다.

5. 코드

전체 코드는 Git에 있습니다.

완전탐색 코드

private List<String> list;
private String[] spellings = new String[]{"A", "E", "I", "O", "U"};

public int solution(String word) {
	return answerRecur(word);
}

public int answerRecur(String word) {
	list = new ArrayList<>();

	for (int i = 0; i < spellings.length; i++)
		recur(spellings[i]);

	Collections.sort(list);

	return list.indexOf(word) + 1;
}

public void recur(String result) {
	list.add(result);

	if (result.length() == 5)
		return;

	for (int i = 0; i < spellings.length; i++)
		recur(result + spellings[i]);
}

 

경우의수 코드

private List<String> list;
private String[] spellings = new String[]{"A", "E", "I", "O", "U"};

public int solution(String word) {
	return answerNumberOfCases(word);
}

public int answerNumberOfCases(String word) {
	int numTerm = 781;
	int answer = 0;

	for (int i = 0; i < word.length(); i++) {
		for (int j = 0; j < 5; j++) {
			if (spellings[j].equals(Character.toString(word.charAt(i)))){
				answer += j * numTerm + 1;
				numTerm = numTerm / 5;
				break;
			}
		}
	}

	return answer;
}
반응형