SWEA 13038. 교환학생 (Python, 완전탐색, D3)

전승재·2023년 10월 9일
0

알고리즘

목록 보기
56/88

SWEA 13038 교환학생 문제 바로가기

문제 접근

이 문제는 정해져있는 수업일정 내에서 학생이 얼만큼 학교에 머무르며 수업을 들어야 하는지를 묻는 문제이다.
문제에서 개강일자가 나오지 않았기 때문에 학생은 화요일날 개강할 수도 있고, 목요일날, 일요일날 개강할 수도 있다. 따라서 모든 경우를 해보는 브루트포스 (완전탐색) 이 어울린다고 할 수 있겠다.

문제 풀이

시작 요일 정하기

시작요일은 아무래도 최솟값을 구해야하기 때문에 수업이 있는 날짜에 개강하는 것이 계산횟수를 줄일 수 있는 방법이다. 따라서 1인경우, 즉, 수업이 있는 경우에 개강한다!

 for i, val in enumerate(week):
        if val == 1: # 1인경우 전부 해보기 -> 시작일자에 따라서 값이 바뀌기 때문에

완전탐색하기

임시 값으로 temp, index를 저장해주고 while문을 진행한다. 따라서 index를 증가시키면서 수업이 있는 날이면 temp, 즉, 들어야하는 수업의 수에서 1을 빼주고 index를 1증가, result(학교에 머무르는 날)을 1 증가시켜주면서 진행한다.
temp가 0이 되면 while문에서 벗어난다.
이 때의 result에는 학교에 머무르는 시간이 저장되어 있다.

for i, val in enumerate(week):
        if val == 1: # 1인경우 전부 해보기 -> 시작일자에 따라서 값이 바뀌기 때문에
            result = 0
            index = i # 현재의 인덱스 저장
            temp = N # 임시값 저장
            while temp:
                if week[index]==1: # 수업이 있으면
                    temp-=1 # 들어야 하는 수업 - 1
                index =  (index+1)%7 # 인덱스 1증가
                result += 1 # 카운트

최솟값 저장하기

최솟값을 아래와 같이 min_result에 저장해주면서 갱신한다.

 min_result = min(result, min_result) # 최소인 경우 저장

제출 코드

T = int(input())
for test_case in range(1, T + 1):
    N = int(input())
    week = list(map(int,input().split()))
    min_result = float('inf')
    for i, val in enumerate(week):
        if val == 1: # 1인경우 전부 해보기 -> 시작일자에 따라서 값이 바뀌기 때문에
            result = 0
            index = i # 현재의 인덱스 저장
            temp = N # 임시값 저장
            while temp:
                if week[index]==1: # 수업이 있으면
                    temp-=1 # 들어야 하는 수업 - 1
                index =  (index+1)%7 # 인덱스 1증가
                result += 1 # 카운트
            min_result = min(result, min_result) # 최소인 경우 저장
    print(f'#{test_case} {min_result}') # 출력

0개의 댓글