https://programmers.co.kr/learn/courses/30/lessons/42862?language=python
비교적 쉽게 성공
문제가 길어서 어려울 줄 알았는데, 순차적으로 접근하니 생각보다 쉽게 해결되었다.
코드 + 간단한 설명 덧붙이겠다.
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:
elif b in _lost:
return n - len(_lost)
|
[알고리즘 풀이] 프로그래머스 : 가장 큰 수, Level2(정렬) (0) | 2019.04.12 |
---|---|
[알고리즘 풀이] 프로그래머스 : 소수 찾기, Level2(완전탐색) (0) | 2019.04.12 |
[알고리즘 풀이] 프로그래머스 : K번째수, Level1(정렬) (0) | 2019.04.12 |
[알고리즘 풀이] 프로그래머스 : 더 맵게, Level2(Heap) (0) | 2019.04.12 |
[알고리즘 풀이] 프로그래머스 : 전화번호 목록, Level2(해시) (0) | 2019.04.11 |