본문 바로가기
lecture.js/algorithm.log

#018 배열조각하기

by malda 2023. 6. 14.

문제 풀이 사전 과정

  • 짝수 인덱스일 때에는
    • 배열 arr의 query[i]의 인덱스 뒷부분을 잘라서 버림.
  • 홀수 인덱스일 때에는
    • 배열 arr의 query[i]의 인덱스 앞부분을 잘라서 버림.

 

문제 풀이 세부 과정

  • 주어진 Array를 List로 변환한다.
  • arr을 for문 돌면서 index가 짝수/홀수인지 분기한다.
  • 짝수/홀수일 때에 뒷부분/앞부분을 잘라서 버리기 때문에 List.subList를 사용한다.

 

주의 사항

  • java에서 subList할 때 인자값(parameter)에 대한 결과를 체크해본다.
    • 두번째 파라미터(잘라내는 마지막 값)에다가 values.size()-1했다가 삽질함.
  • 테스트 실행 시에는 모두 성공해서 금방 끝났었는데, 제출하면 일부 문제가 계속 런타임 실패로 나와서 삽질함.
    • query값 중 일부 데이터가 인덱스를 벗어나는 값이 있는 것으로 예상되어 보정 조건 추가

 

package programmers.level0;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 힌트,
 * - for문을 지속해갈 수록 초기에 지정했던 원소의 위치가 달라지게 되면서 생기는 문제
 * - 문제가 인덱가 홀수/짝수 일때를 의미한듯.
 *  - 쿼리 값이 홀수/짝수라 생각함.
 */
public class ArraySubList {

    public static void main(String[] args){
        //System.out.println(0%2 == 0);

        List<Integer> values = Arrays.asList(1, 2, 3, 4 ,5);
        System.out.println(values.subList(3, values.size()));
        //Solution solution = new Solution();
        //System.out.println(Arrays.toString(solution.solution(new int[]{0, 1, 2, 3, 4, 5, 6, 7}, new int[]{4, 1, 2})));
    }
}

class Solution {
    public int[] solution(int[] arr, int[] query) {
        List<Integer> values = Arrays.stream(arr).boxed().collect(Collectors.toList());
        for(int i=0; i<query.length; i++){
            int queryValue = query[i];
            if(values.size() == 0){
                break;
            }
            if(values.size() < queryValue){
                continue;
            }
            System.out.println("[before] query:"+queryValue + ", values: "+values);
            if(isEven(i)){
                values = values.subList(0, queryValue + 1);//짝수면, 뒷부분을 잘라서 버림
            }else{
                values = values.subList(queryValue, values.size());//홀수면, 앞부분을 잘라서 버림
            }
            System.out.println("[after] query:"+queryValue + ", values: "+values);
        }
        System.out.println("result: " + values);

        return values.stream().mapToInt(Integer::intValue).toArray();
    }

    private boolean isEven(int value){
        return (value % 2) == 0 ? true : false;
    }
}

 

 

출처: 프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/181893?language=java

'lecture.js > algorithm.log' 카테고리의 다른 글

#017 퀵 정렬  (0) 2017.07.18
#015 힙 정렬  (0) 2017.07.18
#014 삽입 정렬  (0) 2017.07.18
#013 선택 정렬  (0) 2017.07.18
#012 버블 정렬  (0) 2017.07.18