Python 코드 질문

조회수 474회
num_of_char, time_of_del = map(int, input().split())
time = list(map(int, input().split()))
inteval = []
def intevalCal(time):
    n = -1
    result = []
    try:
        for num in time:
            n= n + 1
            result.append(time[n+1]-time[n])

    except IndexError:
        result.append(time[n]-time[n-1])
    return result
inteval = intevalCal(time)
def count(inteval, time_of_del):
    try:
        C = [x for x in inteval if x > time_of_del]
        F = inteval.index(C[-1])
        del inteval[:F+1]
        return len([x for x in inteval if x <= time_of_del])
    except IndexError:
        return len([x for x in inteval if x <= time_of_del])
final = count(inteval, time_of_del)
print(final)

제가 문제 풀다가 예시를 실행 했는데 10개중에 3개가 오답이라고 뜨네요. 저는 문제점을 못찾겟는데 혹시 아시는분 있으면 댓 달아주세요ㅠㅠ이미지

2 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    이미지 문제가 어떤걸 요구하는지 모르겠어서 원하는 답을 모르겠는데요. 추측해보면 num_of_char만큼 시간 데이터를 받고 각 시간 데이터간의 차이를 저장한 inteval리스트 중에서 time_of_del보다 큰 값만 걸러낸 C리스트의 맨 마지막 숫자+1만큼의 값을 제거하고 그 리스트중에서 time_of_del보다 작은 값의 개수를 세는 문제인가요?

    try:
            for num in time:
                n= n + 1
                result.append(time[n+1]-time[n])
        except IndexError:
            result.append(time[n]-time[n-1])
    

    여기에서 n이 1부터 맨 끝값까지 커지면서 이전값과의 차이를 저장하고 n이 한번더 커지면 except IndedxError에 잡혀서 맨 끝값과 그 이전값의 차이를 한 번 더 저장하는데요.

    그래서 만약에 3 5 6 8을 입력하면 [2 1 2 2]로 저장됩니다. 이게 의도하신게 아니라면

    def intevalCal(time):
        n = -1
        result = []
        for i in range(1,len(time)):
            result.append(time[i]-time[i-1])
        return result
    

    이렇게 수정하시고 확인해주세요

    num_of_char, time_of_del = map(int, input().split())
    time = list(map(int, input().split()))
    inteval = []
    def intevalCal(time):
        n = -1
        result = []
        for i in range(1,len(time)):
            result.append(time[i]-time[i-1])
            print(time[i],'-',time[i-1],end=' / ')
        print()
        return result
    inteval = intevalCal(time)
    print(inteval)
    def count(inteval, time_of_del):
        try:
            C = [x for x in inteval if x > time_of_del]
    
            print('C=',C)
            print(inteval,end=' ')
            F = inteval.index(C[-1])
            print('-',inteval[:F+1])
            del inteval[:F+1]
            print('=',inteval)
            print('[x for x in inteval if x <= time_of_del]=',[x for x in inteval if x <= time_of_del])
            return len([x for x in inteval if x <= time_of_del])
        except IndexError:
            return len([x for x in inteval if x <= time_of_del])
    
    final = count(inteval, time_of_del)
    print(final)
    

    위는 과정 확인용 코드입니다. 혹시 문제를 알려주시면 더 자세히 알려드리겠습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 우선 첫 파트는 제가 의도한게 맞아요!! 문제는 inteval이 나오는데 inteval중에 time_of_del보다 작은게 있으면 그 전에 있던것도 같이 없어지고 연속적으로 time_of_del보다 작거나 같은 개수를 구하는 문제입니다 Park Jong Yeon 2019.10.15 18:49
  • 첫번째 이슈가 의도하신거라고 하셔서 맨 뒤에 추가되는 값을 한번 더 넣었구요

    제가 이해한대로는 time_of_del보다 작은 것을 찾고 맨 뒤에 찾은 값 이전의 값을 모두 지운 뒤에 time_of_del보다 작거나 같은 개수를 구하는 것으로 생각했는데요.

    time_of_del보다 작은 inteval값 중에 맨 뒤에 있는 값을 기준으로 이전의 값을 제거하면 time_of_del보다 작거나 같은 값을 찾을 수가 없게 되므로 맨 처음 발견하자마자 이전의 값을 삭제해봤습니다. 맨 뒤의 값을 찾으시려면 주석으로 둘러쌓인 뒤부터 탐색하는 for문을 이용해주시고요.

    그 다음에 추려진 리스트 중에서 time_of_del보다 작거나 같은 값을 연속으로만 세는지 모두 세는지 이해를 못해서 모두 세봤습니다.

    num_of_char, time_of_del = map(int, input().split())
    time = list(map(int, input().split()))
    inteval = []
    def intevalCal(time):
        n = -1
        result = []
        for i in range(1,len(time)):
            result.append(time[i]-time[i-1])
            print(time[i],'-',time[i-1],end=' / ')
        result.append(time[-1]-time[-2])
        print()
        return result
    inteval = intevalCal(time)
    print(inteval)
    def count(inteval, time_of_del):
        #맨 뒤부터 확인하기
        #for i in range(len(inteval)-1,-1,-1):
        #    if inteval[i] < time_of_del:
        #        inteval=inteval[i+1:]
        #        break
    
        #맨 앞부터 확인하기
        for i in inteval:
            if i < time_of_del:
                print(i,'<',time_of_del)
                inteval=inteval[i+1:]
                break
        #inteval의 값이 없으면 종료하기    
        if len(inteval)==0:
            return 0
        print('inteval=>',inteval,' / del=>',time_of_del)
        return len([x for x in inteval if x <= time_of_del])
    
    final = count(inteval, time_of_del)
    print(final)
    

    이 코드대로 확인해보시고 테스트케이스랑 답이 같다면 중간의 주석이랑 print문은 지워주시면 되겠습니다. 감사합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 연속적으로 세야합니다! 그리고 그 입력값이 num_of_char =1, time_of_del =1, time= 1000000000일때 인덱스 에러가 나는데 어떻게 처리 해야 할까요? Park Jong Yeon 2019.10.16 22:27
    • 타임 리스트에 값이 한개밖에 없으면 인덱스가 0까지 밖에 없어서 for i in range(1,len(time)): 부분이 아예 시작이 안되고 끝나니까 result = []로 선언된 상태로 반환되면서 인터벌 리스트엔 요소가 없는 상태같네요 그래서 빈 리스트의 값을 불러오니까 인덱스 오류가 난 것 같습니다. 알 수 없는 사용자 2019.10.19 02:32

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)