[Programmers] 체육복 (Python)

Mino·2021년 10월 1일
0

Programmers

목록 보기
5/8
post-thumbnail

문제

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


접근 방식

  1. 길이가 n이고 값이 1인 리스트 생성 (s)
  2. 체육복을 도난당했으면 s에서 도난당한 학생 번호 값 - 1
  3. 여분의 체육복이 있으면 학생 번호 값 + 1
    ex) n = 5, lost = [2, 4], reserve = [1, 3, 5]
  4. 2 주변에 0이 있으면 2 -> 1, 0 -> 1로 변경
  5. s 전체 길이에서 0의 개수를 뺀 값 리턴



제출 코드

def solution(n, lost, reserve):
    #길이=n, 값=1인 배열 생성
    s = [1 for i in range(n)]
    #체육복 도난
    for i in lost:
        s[i - 1] -= 1
    #체육복 여분
    for i in reserve:
        s[i - 1] += 1
    #체육복 빌려주기
    for i in range(len(s)):
        left = i - 1
        right = i + 1
        if left >= 0:
            if s[i] == 2 and s[left] == 0:
                s[i - 1] += 1
                s[i] -= 1
        elif right <= len(s):
            if s[i] == 2 and s[right] == 0:
                s[i + 1] += 1
                s[i] -= 1
    #체육복 있는 학생 최대값 return
    return len(s) - s.count(0)



제출 결과

약 40%의 테스트 케이스를 통과하지 못함.
처음 접근 방식으로 더 풀기에는 아직 내 실력이 받쳐주지 못해 접근 방식부터 수정해서 코드를 작성하기로 결정.




접근 방식 2

  1. 도난 당한 학생 번호 리스트와 여분 체육복 갖고있는 학생의 번호 리스트를 생성
    -> 새로 생성하는 이유 : 2개의 체육복을 갖고 있는 학생이 1개를 도난당하면 1개만 남음. 즉 중복 제거를 해주면 불필요한 연산이 필요 없게 됨
  2. 도난 당한 번호의 +-1의 번호에서 여분의 체육복을 갖고 있으면 여분 체육복 리스트에서 삭제하고 리턴 값 += 1



최종 코드

def solution(n, lost, reserve):
	lost_s = list(set(lost) - set(reserve))
	reserve_s = list(set(reserve) - set(lost))
    
	result = n - len(lost_s)
	for i in lost_s:
		if i - 1 in reserve_s:
			result += 1
			reserve_s.remove(i - 1)
		elif i + 1 in reserve_s:
			result += 1
			reserve_s.remove(i + 1)
	return result



느낀점

알고리즘에 대해 아무것도 모르고 무작정 풀려고만 하니 슬슬 밑천이 드러나는 것 같다. 프로그래머스 lv.1 만 올클리어 하고 알고리즘에 대해 공부해야 할 것 같다.

profile
코린이

0개의 댓글