99클럽 코테 스터디 26일차 TIL [LeetCode] Flatten Nested List Iterator (Java)

민경·2024년 6월 23일

문제

[LeetCode] Flatten Nested List Iterator

틀린 코드

public class NestedIterator implements Iterator<Integer> {
    List<Integer> nums = new ArrayList<>();
    int now;

    public NestedIterator(List<NestedInteger> nestedList) {
        for(NestedInteger ni : nestedList) {
            for(int n : ni) {
                nums.add(n);
            }
        }
        now = 0;
    }

    @Override
    public Integer next() {
        return nums.get(now++);
    }

    @Override
    public boolean hasNext() {
        if(now >= nums.size()) {
            return false;
        } else {
            return true;
        }
    }
}

틀린 이유

생성자에서 nums를 초기화하는 부분에서 문제가 발생했다.

  • NestedInteger는 복합 객체로 for (int n : ni)와 같은 단순 반복문으로 탐색이 불가능하다.
    • 내부 요소가 정수일 수도, 또 다른 NestedInteger일 수도 있기 때문에

풀이

생성자

  • 새 메서드를 정의해서 nestedList를 탐색한다.
  • isInteger() 메서드로, ni가 정수일 경우 값을 그대로 nums에 추가한다.
  • 정수가 아닐 경우, 그 내부 리스트를 인자로 넘겨 함수를 재귀적으로 호출합니다.

next()

  • 현재 인덱스를 표시하는 정수 now를 정의한다.
  • 함수가 호출되면 현재 인덱스에 해당하는 값을 반환하고, now를 증가시킨다.

hasNext()

  • nownums의 크기보다 작으면 true를 반환하고, 그렇지 않으면 false를 반환한다.

정답 코드

public class NestedIterator implements Iterator<Integer> {
    List<Integer> nums = new ArrayList<>();
    int now;

    public NestedIterator(List<NestedInteger> nestedList) {
        flattenList(nestedList);
        now = 0;
    }

    private void flattenList(List<NestedInteger> nestedList) {
        for (NestedInteger ni : nestedList) {
            if (ni.isInteger()) {
                nums.add(ni.getInteger());
            } else {
                flattenList(ni.getList());
            }
        }
    }

    @Override
    public Integer next() {
        return nums.get(now++);
    }

    @Override
    public boolean hasNext() {
        if(now >= nums.size()) {
            return false;
        } else {
            return true;
        }
    }
}
profile
강해져야지

0개의 댓글