프로그래머스_구명보트

LeeYulhee·2023년 9월 18일
0

💻 문제 출처 : 프로그래머스_구명보트

👉 내가 작성한 답


import java.util.Arrays;

class Solution {
    public int solution(int[] people, int limit) {
        
        int right = people.length - 1;
        int answer = 0;
        
        Arrays.sort(people);
        
        for(int i = 0; i < people.length; i++) {
            int left = i;
            
            if(right < left) break;
            
            while(left < right) {
                
                if(people[left] + people[right] <= limit) {
                    answer++;
                    people[left] = 0;
                    people[right] = 0;
                    right--;
                    break;
                }
                right--;
            }
        }
        
        for(int i : people) {
            if (i != 0) answer++;
        }
        
        return answer;
    }
}
  • 📌 접근 방식
    • 오름차순으로 정렬했을 때, 가장 작은 수와 가능한 큰 수를 더했을 때 limit 이하가 되는 모든 경우를 찾고, 아니면 각각 하나씩 세야 함
    • 그래서 오름차순 정렬 후 가장 작은 수와 가장 마지막 수를 더해서 limit이 넘으면 마지막 수를 1칸씩 앞으로 당겨서 limit 이하가 되는 경우에 해당 값들을 0으로 바꾸고 answer++
    • 만약 작은 수와 큰 수의 인덱스가 같아지는 순간에는 반복문 종료
  • 📌 문제 풀이 설명
    • int 변수 right에 people의 길이 - 1을 넣어 마지막 인덱스를 대입
    • int 변수 answer를 선언하고 0을 대입
    • Arrays.sort로 배열을 오름차순 정렬
    • for문으로 0부터 people의 길이 미만까지 1씩 증가하며 순회
      • int 변수 left를 i로 초기화
      • 만약 right가 left보다 크다면 break로 for문 종료
      • while문으로 left가 right보다 작은 경우 순회
        • 만약 people[left] + people[right] 가 limit 이하라면
          • answer에 1 증가
          • people[left]와 people[right]에 각각 0 대입
          • right를 1 감소하고 break로 while문 종료
        • right 1 감소
    • for문 종료 후 향상된 for문으로 people 배열 순회
      • people 배열의 요소가 0이 아니면 answer 1 증가
        • 두 수를 더했을 때 limit 이하가 되지 못한 수들
    • for문 종료 후 return answer



👉 다른 사람이 작성한 답


import java.util.Arrays;

class Solution {
    public int solution(int[] people, int limit) {
        Arrays.sort(people);
        int i = 0, j = people.length - 1;
        for (; i < j; --j) {
            if (people[i] + people[j] <= limit)
                ++i;
        }
        return people.length - i;
    }
}
  • 📌 접근 방식
    • 배열을 오름차순으로 정렬하고 가장 큰 수부터 1씩 감소하며 가장 작은 수와 더했을 때 limit 이하가 되는 경우를 찾음
    • 만약 limit 이하가 되면 가장 작은 수의 인덱스를 1 증가하며 순회
    • 사람 수(people의 길이)에서 가장 작은 수의 인덱스(더했을 때 limit 이하가 되는 경우)를 뺀 값을 return
  • 📌 문제 풀이 설명
    • Arrays.sort로 people 배열 오름차순으로 정렬
    • int 변수 i에 0을 대입하고 j에 people의 길이 - 1을 대입
    • for문으로 i가 j보다 작을 때 j를 1씩 감소하며 순회
      • 만약 people[i] + people[j]를 더한 값이 limit 이하라면
        • i에 1 증가
    • for문 종료 후 people의 길이에서 i를 뺀 값을 return
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글