[코테] 구명보트

이종호·2021년 2월 23일
0

알고리즘

목록 보기
1/10
post-thumbnail

문제

1. 어떠한 방식으로 접근했는지

  • 입력과 출력을 적고, 조건을 봤다.
    • 입력은 people과 limit이며 숫자배열과 숫자이다.
    • 출력은 최소한의 구명보트를 타는 사람의 수이다.
    • 조건: 최대 2, 최소 1명식 구명보트를 탈 수 있다. 못 타는 경우는 없다고 한다.
  • 처음엔 정렬하지 않고 찾아볼까 하다가. 정렬을하면 start와 end인덱스를 통해 더 단순하게 로직을 구현할 수 있을 것 같았다.
  • 만약 정렬을 하지 않았더라면?전체 배열을 계속해서 검사했어야만 했다(마치 버블 정렬처럼). 배열이 매우 작지 않은 이상(작더라도) 정렬을 하는 것이 좋을 듯 하다.

2. 내가 작성한 코드에 대한 설명

  • people배열을 정렬 후 맨 앞과 맨 뒤의 값을 확인해 가면서 구명보트를 2이서 탈 수 있는 pair의 개수를 찾는다.

3. 내가 푼 답

def solution(people, limit):
    answer = 0
    # 먼저 people을 오름차순으로 정렬한다
    people.sort();

    # 초기값 설정.
    start = 0;
    end = len(people) - 1
    pair_count = 0;

    while(True):
      if start >= end:
        break;
      weight = people[start] + people[end]
      if weight <= limit:
        pair_count+=1
        start+=1
        end-=1
      else:
        end-=1

    answer = len(people) - (pair_count*2) + pair_count
    return answer

4. 다른 사람 풀이

def solution2(people, limit) :
    answer = 0
    people.sort()

    a = 0
    b = len(people) - 1
    while a < b :
        if people[b] + people[a] <= limit :
            a += 1
            answer += 1
        b -= 1
    return len(people) - answer

5. 고친 풀이

def solution3(people, limit):
    answer = 0
    people.sort();

    start = 0;
    end = len(people) - 1
    pair_count = 0;

    while(start < end):
      if people[start] + people[end] <= limit:
        pair_count+=1
        start+=1
      end-=1

    answer = len(people) - pair_count
    return answer

6. 느낀 점:

1) 아주 똑같은 로직이지만, 코드를 얼마나 줄일 수 있는지,
2) 변수 명은 명시적으로 한 내가 더 괜찮은 것 처럼 보이지만 몇 줄 되지도 않는데 의미가 있을까싶지만, 항상 습관화 하기 위한 방법이라고 생각한다.

7. 개선 점:

1) 무한 루프는 피하는게 좋은데, 당연히 break되는 것을 첫 조건문으로 적었으면 되었음
2) 불필요한 변수(weight) 자제하기
3) 동일한 반복이라면 밖에 두고 한줄로 줄이기 end -= 1

8. 칭찬할 만한 점?:

  • 과도한 줄이기보다 적당히 변수를 활용하는 것이 더 가독성이 좋지 않을까?
profile
코딩은 해봐야 아는 것

0개의 댓글