[SWEA] 음주가문 복도 [PYTHON]

9050 단어 SWEASWEA

고등학교 학생들이 학교에서 수련회를 갔다. 수련회에 간 학생들은 친구들과 음주가무를 즐기다가 밤 12시가 되자 조교들의 눈을 피해 자기방으로 돌아가려고 한다.

제 시간에 자기방으로 돌아가지 못한 학생이 한 명이라도 발견되면 큰일나기 때문에 최단 시간에 모든 학생이 자신의 방으로 돌아가려고 한다.

숙소는 긴 복도를 따라 총 400개의 방이 다음과 같이 배열되어 있다.

모든 학생들은 현재 위치에서 자신의 방으로 돌아가려고 하는데, 만약 두 학생이 자기방으로 돌아가면서 지나는 복도의 구간이 겹치면 두 학생은 동시에 돌아갈 수 없다.

예를 들어 (방1 -> 4) 와 (방3 -> 6) 은 복도 구간이 겹치므로 한 사람은 기다렸다가 다음 차례에 이동해야 한다. 이동하는 데에는 거리에 관계없이 단위 시간이 걸린다고 하자.

각 학생들의 현재 방 위치와 돌아가야 할 방의 위치의 목록이 주어질 때, 최소 몇 단위시간만에 모든 학생들이 이동할 수 있는지를 구하시오.

[입력]
입력은 T(≤10)개의 테스트 케이스로 되어 있다. 각 테스트 케이스의 첫 줄에는 돌아가야 할 학생들의 수 N이 주어진다.

다음 N 줄에는 각 학생의 현재 방 번호(≤400)와 돌아가야 할 방의 번호(≤400)가 주어진다. 주어지는 2N개의 방 번호 중 중복되는 것은 없다.

[출력]
테스트 케이스 T에 대한 결과는 “#T ”을 찍고, 각 테스트 케이스마다 필요한 시간을 한 줄에 하나씩 출력한다.

이런 아이디어 아직 내 짬으로는 풀 수 없었다.


# 세트 번호의 방을 같은 숫자로 바꿔주기 
# ex, 1번 2번 방은 1이 되고
# 3번, 4번 방은 2가 됨
# 그렇게 총 200개의 숫자가 나옴.
def div(num):
    return (int(num)+1) // 2

# 밑에 쓸 max 함수 미리 만들어 두기
def maxmax(data):
    max_value = data[0]
    for i in range(len(data)):
        if data[i] > max_value:
            max_value = data[i]
    return max_value

for tc in range(1, int(input()) +1):
    N = int(input())
    # 학생 방 번호를 받아서 복도의 번호로 바꾸는 작업
    yo = [list(map(div, input().split())) for _ in range(N)]

	# 복도 카운팅 할 빈 리스트 생성
    corridor = [0] * 201

	# 혹시나 하니 swap 해주기
    for i in range(N):
        if yo[i][0] > yo[i][1]:
            yo[i][0], yo[i][1] = yo[i][1], yo[i][0]

	# 드뎌 카운팅 해주기
    
        for k in range(yo[i][0], yo[i][1]+1):
            corridor[k] += 1

	# 카운팅한 아이들 중 가장 큰 아이를 반환
    print('#{} {}'.format(tc, maxmax(corridor)))
    
  • 우선 yo = [list(map(div, input().split())) for _ in range(N)] 이 부분에서 map 안에 int가 아닌 미리 만들어 놓은 div함수로 받았다.

  • 왜냐하면 여기서 홀수 방은 위쪽에 짝수 방은 다 아래쪽에 있기 때문에 1,2 그리고 3,4 이런 식으로 마주보고 있는 아이들을 다 같은 숫자로 묶어 줘야하기 때문이다. 묶어 주는 방법은 (int(숫자) +1) // 2 해주기.

  • 학생들의 이동 방 input을 받았다면 다음으로는 지나간 복도의 번호를 카운팅 해주는 것이다. 학생들이 지나갔던 복도를 카운팅해주면 가장 카운팅이 많이 된 번호를 반환하면 된다.

  • 그 전에! 큰 번호의 방에서 작으 번호의 방으로 가는 학생들이 있을 수도 있으니 그런 경우가 있다면 swap해주기

  • 이후에 카운팅에 체크체크

  • 미리 max 함수를 만들어 두고 카운팅 한 복도의 수 중에 가장 큰 값을 반환하면 끄읕~~

  • 이런 걸 어떻게 생각해내쥐???

좋은 웹페이지 즐겨찾기