[프로그래머스(Programmers)][자바(java)] (Lv2) 5주차 - 모음 사전 <위클리 챌린지>

728x90

 

https://programmers.co.kr/learn/courses/30/lessons/84512

 

코딩테스트 연습 - 5주차

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

programmers.co.kr

 

문제 풀이

 

import java.util.HashMap;

public class Solution {

	public static int solution(String word) {
		HashMap<Character, Integer> hm = new HashMap<>();
		hm.put('A', 0);
		hm.put('E', 1);
		hm.put('I', 2);
		hm.put('O', 3);
		hm.put('U', 4);
		int a = 0, n = word.length(), c = 781, i;
		for (i = 0; i < n; ++i) {
			a += hm.get(word.charAt(i)) * c + 1;
			c = (--c) / 5;
		}
		return a;
	}
}

 

  • 우선 사전의 모든 단어를 구함 ( + 몇 번째 단어인지 )
  • 단어( key )와 몇번째의 단어인지( value ) 넣을 TreeMap<String,Integer> tm 생성
  • 단어를 넣을 TreeSet<String> ts 생성  ( TreeSet이므로 기본이 오름차순 정렬 )
  • char data[] = { 'A', 'E', 'I', 'O', 'U' } 생성 후 1개~5개씩 뽑은 조합을 ts에 넣음
  • ts을 차례로 탐색하며 tm에 몇번째인지 값과 함께 넣어주고 확인

  • 규칙을 찾음
  • 첫 번째 글자는 data[] 배열에서의 인덱스 번호 값 * 781을 곱한 후 1을 더한 값을 더해주고,
  • 두 번째 글자는 data[] 배열에서의 인덱스 번호 값 * 156을 곱한 후 1을 더한 값을 더해주고, ( (781-1) / 5 = 156 )
  • 세 번째 글자는 data[] 배열에서의 인덱스 번호 값 * 31을 곱한 후 1을 더한 값을 더해주고, ( (156-1) / 5 = 31 )
  • 네 번째 글자는 data[] 배열에서의 인덱스 번호 값 * 6을 곱한 후 1을 더한 값을 더해주고, ( (31-1) / 5 = 6 )
  • 다섯 번째 글자는 data[] 배열에서의 인덱스 번호 값 * 1을 곱한 후 1을 더한 값을 더해준다. ( (6-1) / 5 = 1 )
  • HashMap<Character,Integer> hm에 모음( key )과 인덱스번호값( value )을 넣어줌
  • 입력받은 단어를 순차적으로 탐색
  • hm에서 찾아 c( 초기값은 781이고, 이후 1을 빼고 5를 나누는 연산을 반복 )를 곱한 후 1을 더해줌 
  • 모두 더한 값 리턴

 

 

반응형