국문과 유목민

4. 체육복 본문

알고리즘_코딩테스트/프로그래머스_Level1

4. 체육복

논곰 2020. 9. 9. 16:17

0. 문제

링크) https://programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번�

programmers.co.kr

1. 알고리즘 계획

  1. 모든 학생이 체육복을 가지고 있다고 가정하고 배열 생성
  2. 체육복을 잃어버린 학생들의 번호를 찾아 체육복(값)을 뺀다
  3. 체육복이 없는 학생의 경우 앞, 뒤를 확인해 체육복(값)을 전달받는다


2. 나의 코드

def solution(n, lost, reserve):
    s = [1 for _ in range(0, n)]
    for r in reserve:
        s[r-1] += 1
    for l in lost:
        s[l-1] -=1
    for i, v in enumerate(s):
        if v != 0:
            continue
        else:
            if s[i-1:i] == [2]:
                s[i-1],s[i] = 1, 1
                continue
            elif s[i+1:i+2] == [2]:
                s[i+1], s[i] = 1, 1
                continue
    return s.count(1) + s.count(2)

- enumerate를 사용

- '리스트 슬라이싱'을 통해 for문을 돌게되면 'list index out of bounds' 문제를 벗어날 수 있다. 


3. 다른 사람의 코드

def solution2(n, lost, reserve):
    _reserve = [r for r in reserve if r not in lost]
    _lost = [l for l in lost if l not in reserve]
    for r in _reserve: # 여유가 있는 애들 중
        f = r - 1 # front
        b = r + 1 # back
        if f in _lost:
            _lost.remove(f) # 앞쪽의 여유가 없는 애들
        elif b in _lost:
            _lost.remove(b) # 뒤쪽의 여유가 없는 애들
    return n - len(_lost)

- '리스트 컴프리핸션'을 사용해서 리스트를 생성

- '여유가 있는 학생들'의 리스트(_reserve)를 돌면서, 앞과 뒤에 '여유가 없는 학생들'을 확인하고, (_lost)리스트에서 뺀다.

('여유가 있는 학생'이 '여유가 없는 학생'에게 줬다고 가정) 

# 그런데 이 경우 양 옆으로 여유가 없는 학생들이 둘 다 있다면 오류가 생기지 않나?


4. 정리 및 리뷰

- for문을 돌 때 '리스트 슬라이싱'을 활용할 수 있는 방법을 배웠다. 

코드 만족도: ★★★


'알고리즘_코딩테스트 > 프로그래머스_Level1' 카테고리의 다른 글

6. 2016년  (0) 2020.09.09
5. K번째 수  (0) 2020.09.09
3. 모의고사  (0) 2020.09.09
2. 완주하지 못한 선수  (0) 2020.09.09
1. 크레인 인형뽑기 게임  (0) 2020.09.09
Comments