본문 바로가기
코딩 테스트

[프로그래머스] Lv1 두 개 뽑아서 더하기(월간 코드 챌린지 시즌1) - Java

by 그리득 2024. 4. 9.
728x90

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/68644

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 설명

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • numbers의 길이는 2 이상 100 이하입니다.
    numbers의 모든 수는 0 이상 100 이하입니다.

입출력 예

numbers result
[2,1,3,4,1] [2,3,4,5,6,7]
[5,0,2,7] [2,5,7,9,12]

코드

  1. 중복되는 수를 없애기 위해 HashSet을 생성.
  2. for문을 통해 서로 다른 인덱스의 합을 Set에 담아주기.
  3. Set의 크기와 같은 answer 배열 생성.
  4. answer에 Set의 값들을 모두 담아주기.
  5. answer배열을 오름차순으로 정렬.

사담

문제를 풀면서 Iterator가 생각났는데 iterator 선언하는 법을 까먹어서 forEach문을 써서 풀었다.

과거에 문제를 풀었을 때 Iterator를 썼을 때와 향상된 for문을 썼을 때의 차이를 공부했었는 데 이번 기회에 다시 알아가서 좋았다. 그러면 Iterator에 대해 간단하게 알아보고 가겠다.

Iterator는 ArrayList, HashSet과 같은 컬렉션을 반복하는 데 사용하는 객체다.
반복의 뜻을 담고 있기에 반복자라고도 한다.

 

그렇다면 여기서 의문이 들 수 있다.

컬렉션의 데이터에 접근하기 위해서 for, while같은 반복문을 써도 충분히 가능할텐데 왜 Iterator를 써서 접근을 할까?

 

stackoverflow.com/questions/22267919/iterator-vs-for

 

Iterator vs for

I was asked in an interview what is the advantage of using iterator over for loop or what is the advantage of using for loop over iterator? Can any body please answer this?

stackoverflow.com

글을 정리해보면

 

리스트는 인덱스를 통해 요소에 접근할 수 있지만, Set은 순서가 정해져 있지 않기 때문에 인덱스를 사용할 수 없습니다. 반면, iterator를 사용하면 for-each 반복문으로는 할 수 없는 작업들을 수행할 수 있습니다. 예를 들어, 반복 도중에 요소를 제거하는 것이 가능합니다. 또한, 리스트는 양방향으로 반복할 수 있는 iterator를 제공하여, for-each 반복문이 제공하지 않는 처음부터 끝까지만의 단방향 반복보다 더 유연한 작업을 할 수 있습니다. 배열을 기반으로 한 컬렉션에서는 인덱스를 사용해 요소에 접근하는 것이 약간 더 효율적입니다.

Iterator의 장점

  1. 컬렉션에서 요소를 제거하는 기능
  2. next() 및 previous()를 사용하여 앞뒤로 이동할 수 있다.
  3. hasNext()를 사용하여 추가 요소가 있는지 확인하는 기능

 

Iterator 사용예시)

Iterator <Integer> it = set.iterator();
while(it.hasNext()){
	
    answer[index++] = (int)it.next()
    코드 동일...
    
} 

 

정리

주어진 컬렉션의 요소를 반복해서 접근하는 방법중에 최선의 방법을 사용해야 한다.

Iterator의 기능이 꼭 필요한 경우가 아니라면 for문을 사용하는 것을 권장.(성능)

단, 반복하는 동안 요소를 수정, 제거해야 한다면 Iterator를 사용.(오류 발생 가능성, 기능)