[프로그래머스][Level2][Java] 구명보트

2022. 6. 11. 14:48·프로그래머스/Level 2

문제

https://programmers.co.kr/learn/courses/30/lessons/42885

 

코딩테스트 연습 - 구명보트

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5

programmers.co.kr

 

풀이코드

public int solution(int[] people, int limit) {  //구명보트
    int answer = 0;
    int first = 0;
    List<Integer> list = new ArrayList<>();
    for(int i : people){            // Arraylist에 몸무게 정보 대입
        list.add(i);
    }
    Collections.sort(list);         // 사람들을 몸무게 순으로 오름차순으로 정렬
    while(list.size() != 0){        // 사람들이 없을때까지 반복
        if(list.size() == 1){       // 사람이 1명 남았을 경우
            list.remove(0);   // 보트에 태워보낸다.
            answer += 1;
        }else{
            if(list.get(first) + list.get(list.size()-1) <= limit){ //제일 가벼운 사람 + 무거운 사람이 제한 무게보다 작거나 같을 경우
                list.remove(first);                 // 제일 가벼운 사람과 무거운 사람을 보트에 태워 보낸다.
                list.remove(list.size()-1);
            }else{                                  // 제한 무게보다 무거울 경우
                list.remove(list.size()-1);   // 무거운 사람만 보트에 태워보낸다.
            }
            answer++;
        }
    }
    return answer;
}

처음에는 ArrayList에 구명보트에 태울 사람들을 다 넣은 뒤 오름차순으로 정렬을 해서

제일 가벼운 사람과 제일 무거운 사람을 태웠을때, 그 무게가 제한무게보다 가벼우면 그대로 그 2명을 구명보트에 태워보내고, 만약 그 무게가 제한무게보다 무거우면 무거운 사람만 보트에 태워보내는 알고리즘으로 풀었었다.

이렇게 푼 이유는 구명보트에 2명만 탈 수 있고, 오름차순으로 바꾼 뒤, 제일 가벼운 사람과 제일 무거운 사람을 태웠을 때, 그 무게가 제한무게보다 무거우면 어차피 제일 무거운 사람은 보트에 누구랑도 같이 탈 수 없으므로 혼자태워보내야된다라는 생각이 들었기 때문이다.

근데 이렇게 알고리즘을 짜니

보다시피 문제는 맞았지만 효율성에서 시간초과가 났다. 그래서 다시 생각해보니 굳이 ArrayList를 사용할 필요없이 배열만 이용해도 충분히 풀 수가 있었다. 그래서 다시 풀었던 코드가

public int solution(int[] people, int limit) {          //구명보트
    int answer = 0;
    Arrays.sort(people);                                //가벼운 사람에서 무거운 사람순으로 정렬
    int min = 0;
    int max = people.length - 1;
    for (int m = max; min <= m; m--) {
        if (people[min] + people[m] <= limit){          // 제일 가벼운 사람과 무거운 사람의 무게 합이 제한무게보다 작을 경우
            min++;                                      // 두 사람다 태워보낸다.
        }                                               // 아니면 무거운 사람만 태워보낸다.
        answer++;
    }

    return answer;
}

이것이다. 원리는 똑같지만 훨씬 더 계산들을 줄일 수 있었고 이렇게 풀었더니

보다시피 효율성도 통과하게 되었다.

저작자표시 비영리 (새창열림)

'프로그래머스 > Level 2' 카테고리의 다른 글

[프로그래머스][Level2][Java] 하노이의 탑  (0) 2022.08.26
[프로그래머스][Level2][Java] 멀리 뛰기  (0) 2022.06.14
[프로그래머스][Level2][Java] 예상대진표  (0) 2022.06.11
[프로그래머스][Level2][Java] 전화번호 목록  (0) 2022.06.11
[프로그래머스][Level2][Java] 2xn 타일링  (0) 2022.06.04
'프로그래머스/Level 2' 카테고리의 다른 글
  • [프로그래머스][Level2][Java] 하노이의 탑
  • [프로그래머스][Level2][Java] 멀리 뛰기
  • [프로그래머스][Level2][Java] 예상대진표
  • [프로그래머스][Level2][Java] 전화번호 목록
BvrPark
BvrPark
코드 퍼즐과 개발 일상
  • BvrPark
    비버의 개발 일지
    BvrPark
  • 전체
    오늘
    어제
    • 분류 전체보기 (121)
      • JAVA (7)
        • 메서드 외울 것 (2)
      • 프로그래머스 (56)
        • 총 풀이 코드(깃허브) (1)
        • Level 1 (22)
        • Level 2 (33)
      • 백준 알고리즘(단계 별) (16)
        • 총 풀이 코드(깃허브) (1)
        • 1. 입출력과 사칙연산 (2)
        • 2. if 문 (2)
        • 3. for문 (1)
        • 4. while문 (2)
        • 5. 1차원 배열 (3)
        • 6. 함수 (1)
        • 7. 문자열 (1)
        • 8. 기본수학 1 (3)
      • 백준 알고리즘(solved.ac) (9)
        • 총 풀이 코드(깃허브) (1)
        • class2 (8)
      • LeetCode 문제 풀이 (4)
        • 총 풀이 코드(깃허브) (1)
        • Easy (3)
      • 코드업 알고리즘 (7)
      • git과 github사용법 (4)
      • html, css, javaScript (2)
      • 프로젝트 (11)
        • 순수 Java 프로젝트 (2)
        • 쇼핑몰 프로젝트 (2)
        • 게시판 프로젝트 (5)
        • 근태관리 프로젝트 (2)
      • 커피타임 (2)
        • 2023년 (2)
        • 2024년 (0)
  • 블로그 메뉴

    • 링크

      • 포트폴리오
      • 깃허브
    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • Designed By정상우
    BvrPark
    [프로그래머스][Level2][Java] 구명보트
    상단으로

    티스토리툴바