[SWEA / Python] 13038. 교환학생

효다몬·2022년 9월 18일
0

코딩테스트

목록 보기
13/41
post-thumbnail

SWEA는 문제 복사를 금하는 것 같아 풀이과정과 코드만 업로드합니다.

[D3] 교환학생 - 13038

문제 링크

성능 요약

메모리: 62,244 KB, 시간: 573 ms, 코드길이: 690 Bytes

풀이 과정

풀이 자체는 정말 너무너무 간단한 문제이다.
첫 개강일의 요일을 찾고, while문을 돌면서 그 개강 요일부터 수업이 열리는 날(1) 인 날에만 cnt를 1씩 증가시켜주면 되는 문제다.

그래서 거의 10분만에 문제를 다 풀고 제출했다. 하지만 자꾸 테스트케이스 100개 중 75개만 맞았다;;;
30분 넘게 테스트 케이스를 바꿔보며 잘못된 코드를 찾으려 했지만, 아무리 시간을 써도 찾을 수 없을 거라 판단해 결국 문제의 댓글을 보고 해답을 찾아냈다.

내 코드의 문제점은 첫 개강일의 요일을 찾는 과정에서 그냥 가장 처음 1이 나오는 요일만을 선택하는 것 이다.

for i in range(len(A)) :
	if A[i] == 1 :
    	idx = i
        break

이렇게 되면 아래와 같은 테스트 케이스에서 틀리게 된다.

1 0 0 0 0 0 1
위 테스트 케이스는 일요일(a1)과 토요일(a7)에 강의가 열리는데, 이는
1 1 0 0 0 0 0
이 일요일(a1), 월요일(a2)에 강의가 열리는 테스트 케이스와 정답이 똑같이 나와야 한다.

왜냐하면, 두 테스트 케이스 모두 연속된 요일이기 때문이다.

그래서 모든 첫 개강일을 담아두는 배열을 만들고,
그 배열을 for문을 통해 돌면서, 각 첫 개강일마다의 최소 일수를 계산했다.
그리고 그 최소 일수들의 최솟값이 바로 정답이다!

좀 비효율적인 풀이인 것 같지만, 어차피 입력값이 n의 최댓값은 100000이라 오래걸리지 않는다.

코드

import sys
#sys.stdin = open("input.txt", "r")

T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    N = int(input())
    A = list(map(int, input().split()))
    
    
    
    firstDayList = []
    
    for i in range(len(A)) :
        if A[i] == 1 :
            firstDayList.append(i)
            
    answer = 1e9
    
    for day in firstDayList :
        dayCnt = 0
        classCnt = 0
        while classCnt < N :
            if A[day] == 1 :
                classCnt += 1
            dayCnt += 1
            if day > 5 :
                day = 0
            else :
                day += 1
        answer = min(answer, dayCnt)
        
    print(f'#{test_case} {answer}')
profile
개발로 나를 계발하다.

0개의 댓글

관련 채용 정보