[ProblemSolving] 프로그래머스 위클리챌린지 - 7주차 입실 퇴실 (구현) [Level2]
문제 설명은 생략하겠습니다. 링크를 클릭하세요.
문제 링크
입출력 예
enter leave result
[1,3,2] [1,2,3] [0,1,1]
[1,4,2,3] [2,1,3,4] [2,2,1,3]
[3,2,1] [2,1,3] [1,1,2]
[3,2,1] [1,3,2] [2,2,2]
[1,4,2,3] [2,1,4,3] [2,2,0,2]
유형
- 구현?
나의 풀이
별로 맘에 안 드는 코드이지만 포스팅..
퇴실할 사람들을 순서대로 꺼내서 퇴실할 사람보다 앞서 입실한 사람이 있다면! 여기에 기준을 두고 문제를 풀었다.
입실 [1,4,2,3] 퇴실 [2,1,3,4] 결과 [2,2,1,3] 이라고 했을 때,
첫번째 퇴실할 사람은 2, 입실에서 2보다 먼저 들어온 1,4는 2보다 늦게 퇴실하므로,
1,4,2는 서로 만날 수 밖에 없다.
입실[1,4,2] 까지는 서로 만나는 것이므로 answer[i]에 입실[1,4,2]를 더해준다.
여기서 i는 1, 4, 2다. 결국엔 2번이 퇴실하는 것이므로 입실에서 2를 제거하면 [1,4,3]이 된다.
모두 퇴실할 때까지 이과정을 반복하면, answer(각자 만난 사람)를 정리해줘야 한다.
answer는 중복된 사람이 존재할 수 있고, answer[i] = [i, 2,3] 식으로 자기 자신도 만난 사람에 포함되도록 코드가 구현되었다.
중복을 제거
한 후, answer[i]에는 각자 만난 사람의 수-1(자기 자신)
를 저장한다.
중복의 예
입력값 〉 [1, 2, 3, 4], [3, 4, 2, 1]
기댓값 〉 [3, 3, 2, 2]
아쉬운 점
구현이 깔끔하지 않고 의도가 명확하지 않게 표현된 부분이 있다.
퇴실할 사람보다 먼저 입실한 사람들을 가려내어 바로 answer에 반영하고 싶었는데,
코드를 첨부터 다시 짜야해서 마지막에 예외처리 식으로 해주었다. 그래서 효율성 별루인 느린 코드가 됨
깔끔하게 짠 다른 코드도 아래에 첨부한다.
코드
- 나의 코드
def solution(enter, leave):
answer = [[] for _ in range(len(enter))]
for i in range(len(leave)):
idx = enter.index(leave[i])
for k in enter[:idx+1]:
answer[k-1] += enter[:idx+1] # 결과적으로 answer는 중복 존재 가능, 자기 자신도 만날 사람에 포함시킨 형태
del enter[idx] # 퇴실할 사람 제거
# 예외 처리
for i in range(len(answer)):
answer[i] = set(answer[i])
answer[i] = len(answer[i])-1 # answer를 반환하기 위해 길이를 저장
return answer
- 다른 분 코드
def solution(enter, leave):
answer = [0 for x in range(len(enter) + 1)]
connect_idx = -1
for i in leave:
idx = enter.index(i)
if idx > connect_idx:
connect_idx = idx
else:
for j in range(idx + 1, connect_idx + 1):
answer[enter[j]] += 1
answer[i] += 1
answer.pop(0)
return answer
Author And Source
이 문제에 관하여([ProblemSolving] 프로그래머스 위클리챌린지 - 7주차 입실 퇴실 (구현) [Level2]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@redcarrot01/ProblemSolving-프로그래머스-위클리챌린지-7주차-입실-퇴실-구현-Level2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)