TIL - algorithm - 04

14479 단어 algorithmalgorithm

# 체육복

def solution(n, lost, reserve):
    answer = 0                         
    answer = n -len(lost)               # 도난당하지 않은 학생 = 체육 수업 듣기 가능
   
                                          
                                        # 여벌 체육복을 가져온 학생이 체육복을 도난당한 경우를 먼저 처리
                                        # 이유: 여벌 체육복을 가져온 학생이 체육복을 도난당한 경우엔 다른 사람에게 체육복을 빌려줄 수 없기 때문에...
    i = 0                               # for 문의 맹점
    while  i < len(reserve):            # for 문 대신 while 문을 써야, i값을 증가시키지 않고 유지하기가 쉽다.
                                        # i값이 유지되어야 reverse의 요소가 지워진 경우, index 오류 발생x
        if reserve[i] in lost:          # if 조건문이 실행될 때와 else가 실행 될 때를 명확히 나눠서 흐름 처리해야 한다.
            answer += 1
            lost.remove(reserve[i])
            reserve.remove(reserve[i])
            i = i
        else:
            i += 1
        
    i = 0                               # 여벌 체육복을 가져오지 않은 학생이 체육복을 도난당한 경우
    while i < len(reserve):            

        if reserve[i] - 1 in lost:      # 잃어버린 학생의 번호가 자신의 바로 앞 번호인 경우
            answer += 1
            lost.remove(reserve[i]-1)
            reserve.remove(reserve[i])
            i = 0

                                        # 잃어버린 학생의 번호가 자신의  바로 뒷 번호인 경우
        elif reserve[i] + 1 in lost:    # 만약 앞 번호 학생에게 여분을 빌려줬다면, 
            answer += 1                 # 그 다음 번호 학생에겐 빌려줄 수 없기 때문에 elif 사용
            lost.remove(reserve[i]+1)
            reserve.remove(reserve[i])  
            i = 0                       
        
        
        else:                           # 빌려줄 수 있는 번호가 없는 경우
            i += 1                          

    return answer
    

print(solution(10, [1,8], [1,3,5,6]))   # 결괏값: 9
print(solution(8, [5,6], [4,5]))        # 결괏값: 7

# review

  • while문for문의 차이점

    • while문에선 index의 값을 조작(증가, 유지, 초기화)하기가 쉽다.

    • reserve객체의 인덱스(i)에 해당하는 요소를 삭제할 경우, i값을 변화식으로 증가시키면 reserve 객체의 모든 요소를 불러올 수 없게 되며, IndexError가 발생한다.

        i = 0                               
        while  i < len(reserve):
          
            if reserve[i] in lost:          
                answer += 1
                lost.remove(reserve[i])
                reserve.remove(reserve[i])   # 해당 인덱스(i) 요소를 삭제
                i = i                        # 인덱스 값을 유지해야, 다음 요소에 대한 처리가 가능
                
            else:
                i += 1
  • 여벌 체육복을 가져온 학생이, 체육복을 도난당한 경우와 그렇지 않은 경우를 구분하여 처리하지 않으면, 여벌 체육복을 가져온 학생이 체육복을 도난당했음에도, 다른 학생에게 체육복을 빌려주는 경우의 수까지 계산이 되어 오답이 출력될 수 있다.

  • datetime 모듈을 활용하면 날짜와 시간에 관한 객체를 쉽게 만들 수 있다.(번외)

    • datetime.datetime.now() : 현재 날짜와 시간을 나타내는 datetime 객체

    • datetime.datetime.today() : 현재 날짜와 시간을 나타내는 datetime 객체

    • datetime.datetime() : 특정 날짜와 시간을 나타내는 datetime 객체(연, 월, 일, 시, 분, 초, 마이크로초 지정 가능)

    • datetime 객체.strftime('') : 문자열 형태(type)로 datetime객체를 나타낸다.

    • datetime 객체.day: datetime 객체의 day(일) 속성에 접근한다.

      • 연( year), 월(month), 일(day), 시(hour), 분(minute), 초(second), 마이크로초(microsecond) 속성에 따로 접근이 가능하다.
    • datetime 객체.weekday(): datetime 객체의 요일숫자 형태로 반환

      • 월(0), 화(1), 수(2) ...일(6)
    • datetime.timedelta(days=수사): datetime 객체에서 날짜와 시간의 차이를 구할 때 사용하는 객체.

            print(datetime.datetime.now())   # 결괏값: 2021-03-09 23:10:51.477276
          
            print(datetime.datetime.today()) # 결괏값: 2021-03-09 23:10:51.477276
            
            print(datetime.datetime(2020, 5, 3).strftime('%Y-%m-%d'))  # 결괏값: 2020-05-03 (type: str)
            
            print(datetime.datetime(2020, 5, 3).day)  # 결괏값: 3
            
            print(datetime.datetime(2020, 5, 3).weekday())  # 결괏값: 6 (type: int)
            
            print(datetime.datetime(2020, 5, 3) - datetime.timedelta(days=2))
            
            # 결괏값: 2020-05-01 00:00:00     

좋은 웹페이지 즐겨찾기