본문 바로가기

알고리즘

탐욕알고리즘 - Lv2(조이스틱)-1(completed)

반응형

풀이 성공!.....

다른사람들의 풀이를 보니, 소스코드가 엄청 간단한것들이 많다... 후.....

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

class Solution {
    public int solution(String name) {
     int answer=0; 
		char[] nameToChar=name.toCharArray(); //name을 char[]으로 변환
		int strLength=name.length();
		int[] charCount= new int[strLength]; //각 배열마다 A를 int로 변경하는 값을 기록하기 위함.
		int wordCost=0; //A를 변경한 횟수
		List<Integer> wordCountList = new ArrayList<>(); //A가아닌 문자열들의 인덱스를 기록하는 리스트
        
		//단어변환시 드는 소모값 계산
		for(int i=0; i<strLength; i++) {
			charCount[i] = nameToChar[i]-65; //char형을 아스키코드로 전환, A일때 변환 필요가 없으므로 0이다.
			if(charCount[i]>13) {// A에서 변환하는 횟수가 절반이상이면 반대로 접근하는것이 더빠르다.
				charCount[i] = 26 - charCount[i];
			}
            //A가 아닌 단어들의 갯수 계산
            if(charCount[i]>0){
            	wordCountList.add(i);
            }
            //단어변환 시 드는 비용 계산
			wordCost = wordCost + charCount[i];
		}
        
		//커서움직일때 드는 값 변환
        int cur=0; //nameToChar배열의 현재 가리키는 위치 변수
        int moveCost=0; //커서를 옮긴 횟수
        
        while(wordCountList.size()>0) {
        	Integer[] tmp = new Integer[wordCountList.size()]; //A가아닌 글자로 옮길 소요값 저장하는 임시배열
        	int nearestDistance = strLength/2; // 현재위치에서 가장 작은 소요값을 찾기위한 변수
        	int listIndex = 0; //가장 작은 소요값의 위치를 확인할 인덱스 변수
        	
        	for(int word=0; word<wordCountList.size(); word++) {
        		tmp[word] = Math.abs(wordCountList.get(word)-cur) > strLength/2 ? 
        				strLength-Math.abs(wordCountList.get(word)-cur) :
        					Math.abs(wordCountList.get(word)-cur);
		
    				if(nearestDistance>tmp[word]) {
						nearestDistance = tmp[word];
						listIndex = word;
					}
        	}
        	cur = wordCountList.get(listIndex);
        	wordCountList.remove(listIndex);
        	moveCost+=nearestDistance;
        }
		answer=moveCost+wordCost;
        return answer;
    }
}
반응형