CodeWars 일흔 아홉 번째 문제

Updated:

Sum consecutives

public static List<Integer> sumConsecutives(List<Integer> s) {

    List<Integer> sumList = new ArrayList<Integer>(s);

    int sum = 0;
    int index = 0;

    for(int i = 1 ; i < sumList.size() ; i++) {

        if(sumList.get(i-1) == sumList.get(i)) {
            sum += sumList.get(i);
            sumList.remove(i);
            i--;
        } else {
            sumList.set(index, sumList.get(index) + sum);
            sum = 0;
            index = i;
        }
    }

    return sumList;
}
  • Best 코드는 ListList의 pollLast 메소드를 사용했다.
  • pollLast()는 해당 list의 맨 마지막 node의 값을 제거하고 그 값을 return하는 메소드이다.
  • stack의 pop이라고 보면 될 것 같다.
  • 그런데 나는 단순 List의 메소드를 이용하기 위해서 위와 같이 같은 값이 나오면 처음 나왔던 위치에 계속해서 더해주며 검색한 node를 삭제하는 방식으로 코드를 작성했다.
public static List<Integer> sumConsecutives(List<Integer> s) {
    int previous = Integer.MAX_VALUE;
    LinkedList<Integer> l = new LinkedList<>();
    
    for (Integer v: s){
        l.add(v == previous? l.pollLast() + v : v); 
        previous = v;
    }
    
    return l; 
}
  • 아래는 best 코드를 보고 pollLast 느낌이 나도록 작성해봤는데 처음 내가 작성했던 코드보다 보기 좋은 것 같다.
public static List<Integer> sumConsecutives(List<Integer> s) {

    List<Integer> sumList = new ArrayList<Integer>();
    int previous = Integer.MAX_VALUE;

    for(int i = 0 ; i < s.size(); i++) {

        if(s.get(i) == previous) {
            sumList.set(sumList.size()-1, sumList.get(sumList.size()-1) + s.get(i));
        } else {
            sumList.add(s.get(i));
            previous = s.get(i);
        }
    }

    return sumList;
}