CodeWars 일백 열 여덞 번째 문제

Updated:

Pick peaks

public static Map<String,List<Integer>> getPeaks(int[] arr) {
    	
    Map<String,List<Integer>> map = new HashMap<String,List<Integer>>();
    List<Integer> posS = new ArrayList<Integer>();
    List<Integer> peaksS = new ArrayList<Integer>();

    for(int j = 0, i = 1, k = 2; i < arr.length - 1; j++, i++, k++) {
        if(arr[j] < arr[i] && arr[i] > arr[k]) {
            posS.add(j+1);
            peaksS.add(arr[j+1]);
        } else if(arr[j] < arr[i] && arr[i] == arr[k]) {
            j--;
        } else {
            j = i-1;
        }
    }

    map.put("pos", posS);
    map.put("peaks", peaksS);

    return map;
}
  • 나의 경우 배열을 비교할 index 변수를 3개를 사용했다.
  • 그러나 Best 코드의 경우 Boolean 변수를 통해서 전, 후 값을 비교하여 넣었다.
  • Best 코드가 더 깔끔한 것 같다.
public static Map<String,List<Integer>> getPeaks(int[] arr) {
        
    Map<String,List<Integer>> ans = new HashMap<String,List<Integer>>() ;
    int posMax = 0;
    boolean matchAsc = false;

    for (int i = 1 ; i < arr.length ; i++) {
        if (arr[i-1] < arr[i]) {
            matchAsc = true;
            posMax = i;
        }
        if (matchAsc && arr[i-1] > arr[i]) {
            matchAsc = false;
            ans.get("pos").add(posMax);
            ans.get("peaks").add(arr[posMax]);
        }
    }
    return ans;
}