[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

좋은 웹페이지 즐겨찾기