220901에 보았던 코딩테스트 문제 4개 관련 코드 및 풀이
- 아래 그림과 같이 공연을 관람하기 위한 100,000 x 100,000 크기의 격자 모양의 좌석이 있습니다.
- 이 공연장의 표를 구매하기 위해
K
명의 관람객이 매표소에 한 줄로 서 있습니다. 이때, 관람객은 자신이 원하는 좌석에만 공연을 관람하려고 합니다.- 각 관람객은 매표소에서 자신이 원하는 좌석의 좌표를 말하고, 아직 아무도 구매하지 않은 좌석이면 해당 좌석의 표를 삽니다. 그러나 만약 이미 구매된 좌석이면 공연 관람을 포기하고 집으로 돌아갑니다.
- 줄을 서 있는 사람들이 구매하려는 좌석의 좌표가 순서대로 담겨있는 배열
seat
가 매개변수로 주어질 때, 표를 구매하는데 성공한 사람의 수를return
하도록solution
함수를 완성해주세요.
- 줄을 서 있는 관람객의 수는 1 이상 100,000 이하입니다.
- seat에는 관람객이 구매하려는 좌석의 좌표가 가장 앞에 있는 사람부터 순서대로 들어있습니다.
- seat의 각 원소는 관람객이 구매하려는 좌석의 좌표이며, [가로 좌표, 세로 좌표] 순입니다.
- 가로 좌표, 세로 좌표의 범위는 1 이상 100,000 이하의 정수입니다.
seat result [[1,1],[2,2],[3,3]] 3 [[1,1],[2,1],[1,2],[3,4],[2,1],[2,1]] 4
- 입출력 예 #1
- 가장 앞사람부터 순서대로 (1,1), (2,2), (3,3) 위치의 좌석을 구매하여 총 3명의 관람객이 구매에 성공했습니다.
- 입출력 예 #2
- 가장 앞사람부터 순서대로 (1,1), (2,1), (1,2), (3,4) 위치의 좌석을 구매하였습니다.
- 5,6번째 관람객이 구매하려는 좌석은 2번째 관람객이 이미 구매하였으므로 5,6번째 관람객은 집으로 돌아갑니다.
- 따라서 총 4명의 관람객이 구매에 성공했습니다.
seat = [[1,2], [2,2], [1,2], [2,3], [1,2]]
seat.sort
# seat = [[1,2], [1,2], [1,2], [2,2], [2,3]]
# → [1,2]에 해당하는 좌석은 맨 앞의 것만 구매한 것으로 간주하여 카운트하면 됨.
# 그 다음의 두 개는 따로 연산하지 않고 넘어감!
여러개 들어 있는 동일 좌표는 어떻게 구분할 것인가?
→ target이라는 변수를 지정하여 seat 리스트에서 순서대로 추출하게 될 각 좌표들이 target과 동일한지 판단하여 구분
좌석을 구매할 때 카운트는 어떻게 할 것인가?
→ 동적 계획법 사용.
- dp라고 하는 0으로 구성된 리스트를 생성 후, 좌석을 구매하게 되면 해당 좌표의 index에 해당하는 dp 내의 요소를 1로 변경해줌.
- 마지막 좌석까지 확인 후, dp의 요소를 모두 더하면 그 값이 바로 좌석의 총 구매 갯수
def solution(seat):
seat.sort()
length = len(seat)
dp = [0] * length
target = None
for i in range(length):
if seat[i] != target:
dp[i] = 1
target = seat[i]
else:
continue
return sum(dp)
※ 잘 안보이는 경우, 그림 우클릭 → '새 탭에서 이미지 열기' 클릭하여 확인하면 됨!
if seat[i] not in success
부분에서 success
리스트를 모두 탐색하기 때문에 시간 초과가 발생하는 것으로 생각되었다.success.append(seat[i])
부분에서도 append를 하게 되면 메모리인가 시간인가를 더 잡아먹는다고 어디서 주워들었던거 같은데.. 이 부분은 정확하지 않아서 스터디 하면서 다른 분들께 물어볼 생각이다.def solution(seat):
seat.sort()
length = len(seat)
success = []
for i in range(length):
if seat[i] not in success:
success.append(seat[i])
return len(success)