행궁동 데이터 엔지니어

반응형

https://programmers.co.kr/learn/courses/30/lessons/42862?language=python

 

알고리즘 연습 - 체육복 | 프로그래머스

실행 결과가 여기에 표시됩니다.

programmers.co.kr

비교적 쉽게 성공

문제가 길어서 어려울 줄 알았는데, 순차적으로 접근하니 생각보다 쉽게 해결되었다.

코드 + 간단한 설명 덧붙이겠다.

 

1. 통과한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def solution(n, lost, reserve):
    answer = 0
    
    s_arr = [1 for i in range(n)] # 초기 값 모두 1개씩
    #lost and reserve
    M_lost = [i-1 for i in lost] # 인덱스로 사용하기 위해 -1
    M_reserve = [i-1 for i in reserve] # 위와 동일
    
    #s_arr에 lost는 -1, reserve는 +1
        #lost
    for i in M_lost :
        s_arr[i] = s_arr[i] - 1
        #reserve
    for j in M_reserve :
        s_arr[j] = s_arr[j] + 1
        
    #빌려주는 코드    
    for i,j in enumerate(s_arr) :
        if j == 2 : # 체육복 2개 일때
            try : 
                if s_arr[i-1== 0 : # 왼쪽부터
                    s_arr[i-1+=1 
                    s_arr[i] -=1
                    # print(s_arr)
                else :
                    if s_arr[i+1== 0 :
                        s_arr[i+1+=1
                        s_arr[i] -=1
            except : 
                print("예외처리")
    
    print(s_arr)
    for i in s_arr :
        if i != 0 :
            answer +=1
            
    return answer
 

2. 간단한 설명

 - 문제풀이 과정은 크게 3가지

 A. 현재 체육복 현황을 확인한다.

   - 모든 학생의 초기값 1로 설정  

   - lost의 경우 -1, reserve의 경우 +1 

 B. 체육복 여유분을 빌려준다. 

   - 체육복이 2개인사람은 자신의 왼쪽부터 0인지 확인해서 0이면 +1 해주고 자신은 -1 한다.

   - 왼쪽이 0이 아니면 오른쪽이 0인지 확인해서 0이면 +1 해주고 자신은 -1

   - 배열의 양끝에 체육복이 2개인사람이 존재하면 배열 범위를 벗어날 수 있으므로 예외처리 넣어줌

 C. 체육복을 가지고 있는 학생을 카운트 한다.

 

아래는 다른사람 코드 1개 (배열을 생성하지 않고 해결해서, 결과적으로 간결하다)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
def solution(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]
    print(_reserve)
    print(_lost)
    for r in _reserve:
        f = r - 1
        b = r + 1
        if f in _lost:
            _lost.remove(f)
        elif b in _lost:
            _lost.remove(b)
    return n - len(_lost)

 

반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band