[알고리즘] 탐욕법(Greedy) 프로그래머스 1단계 - 체육복

minidoo·2020년 10월 3일
0

알고리즘

목록 보기
25/85
post-thumbnail
def solution(n, lost, reserve):
    
    # 1. 임의의 배열 stack을 만든다.
    stack = []
    for r in reserve:
        if r in lost:
            stack.append(r)
    for s in stack:
        lost.remove(s)
        reserve.remove(s)

    # 2. 여벌 체육복이 있는 학생은 다른 학생에게 체육복을 빌려준다.
    for r in reserve:
        if r-1 in lost:
            lost.remove(r-1)
            continue
        if r+1 in lost:
            lost.remove(r+1)
            continue
    
    # 3. lost에는 빌리지 못한 학생이 남아있다.
    result = n - len(lost)
    return result

풀이과정

1. 임의의 배열 stack을 만든다.

  • 여벌 체육복을 가져온 학생이 체육복을 도난당한 경우를 빼주기 위해 만든다.
  • reserve 배열을 돌면서, lost에 원소가 들어있으면 stack에 넣어준다.
  • stack에 있는 원소가 lost, reserve에 있으면 제거한다.

2. 여벌의 체육복이 있는 학생은 다른 학생에게 체육복을 빌려준다.

  • 앞 번호 학생에게 먼저 빌려주는 것이 최대한 많은 학생이 수업을 듣는 방법이다.

3. lost에는 빌리지 못한 학생이 남아있다.


새로 배운 내용

for r in reserve[:]:

for문을 돌릴 때, 구문 안에서 배열의 원소를 remove하면 인덱스가 달라지는 문제가 발생한다. 따라서 stack 배열을 따로 만들어 둔 것이다.

이럴때, reserve[:] 을 사용하면 된다.
reserve 배열을 복사한다고 생각하면 된다!

# origin code

stack = []
  for r in reserve:
      if r in lost:
          stack.append(r)
  for s in stack:
      lost.remove(s)
      reserve.remove(s)
# change code

for r in reserve[:]:
    if r in lost:
        lost.remove(r)
        reserve.remove(r)

0개의 댓글