0203 TIL

looggi·2023년 2월 2일
0

TILs

목록 보기
20/114
post-thumbnail

프로그래머스 문제풀기

➡️ 나누어 떨어지는 숫자 배열

def solution(arr, divisor):
    for element in arr:
        if element%divisor!=0:
            arr.remove(element)
    if not arr:
        arr.append(-1)
    return sorted(arr)

이게 왜 이러지
7은 분명히 안나눠떨어지는데 만약에 나눠떨어진다고하면 9도 리스트에 포함돼서 나와야하는데 왜그러지??
결국 인덱스때문인듯? 이렇게는 못푸는 건가

입력값 〉	[5, 9, 7, 10], 5
기댓값 〉	[5, 10]
실행 결과 〉	실행한 결괏값 [5,7,10]이 기댓값 [5,10]과 다릅니다.
def solution(arr, divisor):
    return sorted([x for x in arr if x%divisor==0]) or [-1]
    # return sorted([x for x in arr if x%divisor==0]) if len(arr) != 0 else [-1];

or 쓴게 진짜 짱
return 문에서도 if를 써서 코드를 줄일 수 있음

➡️ 실패율 정리

def solution(N, stages):
	no_of_player_on_stage=[]
    for i in range(len(stages)):
        if i+1 in stages: # i+1 = 스테이지 넘버
                stage_player=stages.count(i+1)
            elif i+1 not in stages: #else로 바꿔도 상관 없을듯
                stage_player=0
            no_of_player_on_stage.append(stage_player)
    while len(no_of_player_on_stage)!=N:
         no_of_player_on_stage.append(0)

여기서 while이 무한루프를 돌았는데
처음엔 range(len()) 쓰는 게 습관이 돼서 그렇게 써놓고는 i를 인덱스로 쓰지 않고 요소 값으로 썼다. 애초에 내가 구상한 코드에서는 인덱스를 쓸 필요가 전혀 없었는데 len를 쓴 걸 보면 습관이란 게 참 무서운 것 같다
while이 무한루프를 돌았던 이유는 stages길이가 N보다 더 클 수 있기 때문이다. 여기서 같지 않다 대신 작다를 썼으면 애초에 오류가 나서 못돌고 에러가나서 더 금방 알았을 것 같다. 컴퓨터 고장난줄 ㅋㅋ

failure=[]
for no,no_of_player in enumerate(no_of_player_on_stage):
	if sum(no_of_player_on_stage[no:]) !=0:    
            if N+1 in stages:
                fin_players=stages.count(N+1)
                failure.append(no_of_player/(sum(no_of_player_on_stage[no:])+fin_players))
          	else:
                failure.append(no_of_player/sum(no_of_player_on_stage[no:]))
    else:
        failure.append(0)      

위에서 구한 스테이지별 플레이어의 수 리스트는 모든 스테이지를 클리어하지 않은 플레이어를 고려하지 않아서 리스트에 그 부분이 빠져있어서 추가로 계산을 해줘야하는데 이때 클리어 플레이어가 있는지 없는지를 또 구분을 해줘야한다고 생각해서 분모가 0이 아닌 경우에서 디 부분을 또 if-else로 나눠줬는데 애초에 stage에 클리어한 사용자가있는지 stages에서 count를 하면 되는 거라서 (없으면 알아서 0이 들어가고 있으면 갯수를 세어주니까) 예외상황이 발생할만한 게 없어서 분기를 탈 필요가 없었다.

failure=[]
for no,no_of_player in enumerate(no_of_player_on_stage):
	if sum(no_of_player_on_stage[no:]) !=0:    
             fin_players=stages.count(N+1)
                failure.append(no_of_player/(sum(no_of_player_on_stage[no:])+fin_players))
    else:
        failure.append(0)      

조건문에서 사용하지 않는다면 fin_players를 꼭 for문 밖이나 조건문 전에 계산할 필요도 없다. 그냥 사용하기 전에만 값이 있으면 된다.
그리고 조건문에서 분모가 0이면 안된다는 생각때문에 처음에 fin_players까지 들어간 전체가 다 조건식에 들어가야한다고 생각했는데 어차피 fin_players의 값은 0이상의 정수값이라서 고려할 필요가 없다? 그 다음 스테이지에 사람들이없고 클리어한 사용자만 있으면 fin_players도 고려해야하는 게 맞다 결국 처음부터 스테이지별 플에이어의 수 리스트를 클리어한 플레이어까지 포함해서 구했어야하는 게 맞다. 그렇게 해야 이런저런 예외 상황이 발생하지 않는다..

stage_no = [x+1 for x in range(N)] 
failure_dict=dict(zip(stage_no,failure))

failure_dict_sorted=sorted(failure_dict, key=lambda x: failure_dict[x], reverse=True)  

return failure_dict_sorted

처음엔 그냥 리스트의 인덱스+1로 출력하고 싶었는데 그게 잘 안돼서 딕셔너리로 만들어서 키값을 출력했다.
failure_dict[x] == value 라는 거⭐

이 다음에 실패율 분모를 조금 다른 방식으로 구했었는데

failure=[]
    all_players=sum(no_of_player_on_stage)
    fin_players=stages.count(N+1)
    for no,no_of_player in enumerate(no_of_player_on_stage):
        if (all_players-sum(no_of_player_on_stage[:no])+fin_players) !=0:
            failure.append(no_of_player/(all_players-sum(no_of_player_on_stage[:no])+fin_players))
        else:
            failure.append(0)

여기서 all players에 fin_players를 더해버리면 뒤에서도 좀 더 깔끔하게 쓸 수 있을 것 같다.

딕셔너리 정리

dict()

return_list=[]
for pair in zip(idx,failure):
    return_list.append(pair)
    # return_list.append(dict(pair))
     print('return_list:',dict(return_list)) # {1: 0.0, 2: 0.0, 3: 0.0, 4: 1.0}

주석처리한 부분 실행하면 에러남
기본적으로 dict()는 인자를 하나만 받는다 = 딕셔너리에 넣을 땐 리스트나 튜플을 이용해 값들을 묶어서 넣어야한다
TypeError: cannot convert dictionary update sequence element #0 to a sequence
dictionary update sequence 0번째 element를 sequence(딕셔너리)로 바꿀 수 없다.
튜플 하나는 딕셔너리로 바꿀 수가 없다

  • 단, 키-밸류가 되는 쌍의 키값이 동일한 튜플이 여러개일 경우 동일한 키값을 가진 가장 마지막 쌍 하나만 딕셔너리에 담겨서 리턴된다
dict(((2,3),(2,3),(2,3))) # {2: 3}
dict(((2,3),(2,4),(2,5))) # {2: 5}

튜플 하나짜리는 튜플 안에 넣어봐도 딕셔너리로 바꿀 수 없고 동일한 에러가 난다
튜플 하나를 리스트 안에 넣으면 딕셔너리로 바꿀 수 있다

dict(((1,2))) # dict((1,2))와 동일한 에러 발생
dict([(1,2)]) # {1: 2}

❌ ValueError: dictionary update sequence element #0 has length 3; 2 is required
dict(('key','value')) 또는 dict(['key','value']) 이런식으로 값을 넣을 경우 발생하는 에러
튜플/리스트 안에 묶여서 딕셔너리 함수를 쓸 수는 있지만 key가 변환 대상인데 3글자여서 키-밸류로 분리를 할 수 없어서 생기는 에러

그냥 리스트는 딕셔너리로 안바뀌고 꼭 쌍이라는 걸 인식할 수 있도록 해줘아햔다

dict([['key','value']]) # {'key': 'value'}
dict([['key','value'],['h','n']]) # {'key': 'value', 'h': 'n'}
dict(('ke')) # ValueError: dictionary update sequence element #0 has length 1; 2 is required
dict(('ke','va')) # {'k': 'e', 'v': 'a'}
dict(['ke']) # {'k': 'e'}

문자열 분리해서 key-value를 만드는 방법은 문자열의 길이가 반드시 2여야한다 짝수면 되는 게 아니다 ⭐⭐⭐⭐

❓튜플과 리스트가 딕셔너리의 요소 안에 담겼을 때 차이가 생기는 건 mutable과 immutable의 차이인가?

근데 결국 프린트에만 dict로 바꿔서 출력을 했지 사용하는 건 dict로 안바꾸고 했는데 그래도 정상적인 결과가 출력된다는 건 튜플에서도 이건 끝까지 안해봤지만 결과를 dict에 넣었으면 뒷부분은 똑같이 쓸 수 있을듯 ⭕ pair가 튜플이니까

return_list=[]
stage_no = [x+1 for x in range(N)] 
for pair in zip(stage_no,failure):
    return_list.append(pair)
failure_dict=dict(return_list)

딕셔너리 생성

  • dictionary={'key1':value1,'key2':value2}
  • dict(key1=value1,key2=value2)
    dict(k='v',k1='v1') 이렇게 해도 키에 자동으로 ''가 붙음 → {'k': 'v', 'k1': 'v1'} 오히려 키값에 ''붙이면 아래랑 동일한 에러남
    dict(1='v',2='v1') 이건 안됨
    SyntaxError: expression cannot contain assignment 변수 할당이라고 생각하는건가?
  • dict(key1:value1,key2:value2)
    → 이것도 안됨

변경이 불가능한 데이터타입(immutable)은 모두 key가 될 수 있다: int, boolean, tuple, str

*mutable: list, dictionary
수정(값을 다시 할당했을 때) 주소값이 바뀌지않음
*iterable: sequence type - list, str, tuple

딕셔너리 메소드

  • dictionary.keys()->키값들이 모두 리스트에 저장되어 출력됨
  • dictionary.values()->밸류값들이 모두 리스트에 저장되어 출력됨
  • dictionary.items()->딕셔너리의 키,밸류가 한쌍씩 튜플에 담겨서 리스트에 저장되어 출력됨
  • dictionary.get('key')->없는 키값을 출력해도 에러 x
  • dictionary['key']->없으면 에러
  • dictionary.pop('key')-> 값을 가져오지만 딕셔너리에서는 삭제됨
  • dictionary.popitem()-> 마지막 원소를 튜플로 가져오고 딕셔너리에서는 삭제

TypeError: 'int' object is not subscriptable ->int[] 이런 식으로 쓸 수 없다는 뜻.

*딕셔너리 타입은 애초에 인덱싱 기능을 키값이 대신해줘서 키가 정수여서
딕셔너리[정수]이렇게 쓴다고해서 인덱스랑 헷갈릴 수가 없다

failure에서 max값을 하나씩 찾아서 인덱스+1 값이랑 매치시켜줄 수 있는데 그러려면 heap에서 pop을 써야할듯? 아니면 max찾고 다음 max를 쓰려면 어떻게 하지??

OSI 참조 모델

https://velog.io/@raejoonee/OSI-%EC%B0%B8%EC%A1%B0-%EB%AA%A8%EB%8D%B8-%EC%99%84%EC%A0%84%ED%9E%88-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0

DNS

https://namu.wiki/w/DNS
https://velog.io/@loooggi/1231-TIL

profile
looooggi

0개의 댓글