본문 바로가기

Algorithm/프로그래머스

[프로그래머스/Java]Comparator와 copyOfRange

728x90
반응형

문제를 보고 하나의 for문을 돌리며 한번에 return 값을 내려고 했다.

조금 쉽게 배열의 범위를 subString과 같이 쉽게 자르는 방법을 생각하다가 문득

copyOfRange 메서드가 생각났다.

//먼저 결과 배열을 선언한다.
int[] result = new int[commands.length];
for(int i=0; i<commands.length; i++) {
	//배열을 길이에 맞게 자른다(copyOfRange 메서드의 마지막 값은 제외되기 때문에 +1해줘야 함)
    int[] subArray = Arrays.copyOfRange(array, commands[i][0] -1, commands[i][1]);
    Arrays.sort(subArray);	//정렬
    int value = subArray[commands[i][2] -1];
    result[i] = value;
    }
    return result;
    
//최대한 짧게 하나의 for문으로 짜려고 노력했는데 가독성이 좋은지 모르겠다..

 

public class cote {
	public static void main(String[] args) {
    	String[] str = {"abce", "abcd", "cdx"};
		int n=2;
        Solution so = new Solution();
        System.out.println(Arrays.toString(so.solution(str, n)));
    }
}
class Solution {
	public String[] solution(String[] str, int n) {
    	Arrays.sort(str, new Comparator<String>() {
        //string 배열을 정렬한다. 커스텀 비교자를 제공하여 문자열을 특정 기준으로 정렬하도록 한다.
        	@Override
            public int compare(String o1, String o2) {
            //인터페이스에서 상속받은 compare메서드를 재정의한다. 두 문자열을 비교하여 정수값을 반환한다.
            int comparison = Character.compare(o1.charAt(n), o2.charAt(n));
            if(comparison == 0) {
            	return o1.compareTo(o2);
            }
            return comparison;
        }
    });
    return str;
}

//Comparator 의 compare 메서드는 정렬 알고리즘이 작동하는 동안 요소 간의 순러를 결정하기 위해
//반복적으로 호출된다. 배열의 길이만큼 호출되면서 모든 인덱스를 비교한다.

매일 같이 코딩테스트를 하다보니 코드와 많이 친해진 느낌이다.

아직 인터페이스 부분이 어렵긴 하지만 문서를 자주 들여다 봐야겠다.

728x90
반응형