
문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
두 친구는 돈을 모아 아이스크림 가게에 가는 것을 좋아한다. 그들은 항상 두 별개의 맛을 고르고 그들의 모든 돈을 사용한다.
아이스크림 맛의 가격 목록이 주어지고, 그들이 가지고 있는 모든 돈을 소비할 수 있게 두 개를 선택해라.
m = 6, cost = [1, 3, 4, 5, 6]
1달러와 5달러의 두 개의 맛이 기준에 충족한다. 1을 기준으로 인덱싱을 했을 때, 그들은 1과 4에 있다.
icecreamParlor 함수를 완성해라.
icecreamParlor 함수는 아래와 같은 매개변수를 가지고 있다.
처음에 indexOf를 사용하여 해결하려고 했지만, 중복되는 값이 있어서 문제가 해결되지 않았다. 그리고 주어진 배열을 조작하려고 했지만 배보다 배꼽이 더 커질 것 같아서 two point를 사용하여 문제를 해결했다.
먼저 결과를 담을 List<Integer> results를 생성한다. 그리고 정수형 변수 left와 right를 선언하고, 각각 0과 1을 할당한다.
List<Integer> results = new ArrayList<>();
int left = 0;
int right = 1;
그리고 while문을 통해 left가 right보다 작을 때만 실행한다.
while(left < right){
}
이제 while문 안에 if문을 사용해서 arr에서 left와 right 인덱스의 값을 더했을 때, m과 같으면 break를 한다.
while(left < right){
if(arr.get(left) + arr.get(right) == m){
break;
}
}
그리고 while문이 실행할 때마다 right를 증가시켜준다.
while(left < right){
if(arr.get(left) + arr.get(right) == m){
break;
}
right++;
}
if문을 사용해서 right가 arr의 사이즈와 같다면 left를 증가시키고 rithg에 left를 증가시킨 값에 1을 더한 값을 할당한다.
while(left < right){
if(arr.get(left) + arr.get(right) == m){
break;
}
right++;
if(right == arr.size()){
left++;
right = left + 1;
}
}
while문을 빠져나오면 left와 right에 값이 들어가 있고, 이때 문제에서 인덱스는 1을 기준으로 인덱싱했기 때문에 각각 1을 더해서 result에 담아준다. 그리고 반환할 때, 오름차순으로 정렬되어 있어야 하기 때문에 left, right 순으로 한다.
results.add(left + 1);
results.add(right + 1);
마지막으로 results를 반환한다.
return results;
public static List<Integer> icecreamParlor(int m, List<Integer> arr) {
List<Integer> results = new ArrayList<>();
int left = 0;
int right = 1;
while(left < right){
if(arr.get(left) + arr.get(right) == m){
break;
}
right++;
if(right == arr.size()){
left++;
right = left + 1;
}
}
results.add(left + 1);
results.add(right + 1);
return results;
}