0202 TIL

looggi·2023년 2월 2일
0

TILs

목록 보기
21/114
post-thumbnail

프로그래머스 문제풀기

➡️ 실패율 남이 푼거 구경하기

def solution(N, stages):
    result = {}
    denominator = len(stages) # 전체 인원
    for stage in range(1, N+1):
        if denominator != 0:
            count = stages.count(stage)
            result[stage] = count / denominator
            denominator -= count
            # 이 부분이 count 재활용해서 좋은듯
        else:
            result[stage] = 0
    return sorted(result, key=lambda x : result[x], reverse=True)

→ 전체와 부분을 잘 생각해야할 것 같다 꼭 처음부터 어디까지, 끝에서부터 어디까지가 아니라 전체에서 어느정도를 빼도 같은 결과가 나올 수 있음

count는 시간복잡도가 o(n)이라서 스테이지별 인원 처음에 먼저 정렬해두면 좋다

def solution(N, stages):
    answer = []
    fail = []
    info = [0] * (N + 2) # 아예 인덱스 0인 건 안 쓸 생각으로 +2길이로 만든듯
    # 카운트를 쓸 필요 없이 stage에 해당하는 값을 만날 때마다 +1해주면 됨
    for stage in stages:
        info[stage] += 1
    for i in range(N):
        numerator = info[i + 1]
        denominator = sum(info[(i + 1):])
        # 여기서도 분모가 0일 경우를 먼저 빼주는 게 조건식이 더 간단하니까 더 좋은 듯
        if denominator == 0:
            fail.append((str(i + 1), 0))
        else:
            fail.append((str(i + 1), numerator / denominator))
    for item in sorted(fail, key=lambda x: x[1], reverse=True):
        answer.append(int(item[0]))
    return answer

효율성 대박임 진심 다 10초대 나옴ㅋㅋㅋㅋ

→ count안쓰면 이 for문이 제일 좋은듯
아님 len([a for a in stages if a>=i] 이거

→ if문에서 인덱스 굳이 str로 바꿀 필요 없음
answer에 append할 때도 그러면 int로 바꿀 필요 없음

fail=dict(fail)
return sorted(fail, key=lambda x: fail[x], reverse=True)

→ 튜플 append할 때 str빼주고 그냥 정수 쌍 튜플로 바꾸고 아래 for문이하 대신에 딕셔너리로 풀 수 도 있음

fail_ = len([a for a in stages if a==i])/len([a for a in stages if a>=i])

→ 이게 약간 내가 원하던.. 효율성은 떨어지지만 직관적인 코드

➡️ x만큼 간격이 있는 n개의 숫자 남이 푼거 구경하기

와 첨으로 맨 위에있는 거랑 똑같아서 신났는데 댓글에 더 어마어마한 사람이 있다 ㅋㅋㅋ

def solution(x,n):
	return list(range(x, x*(n+1), x))

range(시작, 끝, 증가분)
근데 테스트8에서 런타임에러가 나느데 왜일까
x가 0일때 0으로 계산은 되지만 리스트 길이가 n만큰 안나옴

def solution(x,n):
    if x==0:
        return [0]*n
    return list(range(x, x*(n+1), x))

→ 0일때 예외처리하고나면 이게 훨씬 빠르다구..

return [x * i for i in range(1, n+1)] 

→ 내가 푼 방식을 좀 더 깔끔하게 하면 이렇게 될듯

OS

프로세스 VS 스레드

프로세스는 스레드의 상위개념
하나의 프로세스에는 최소 하나의 스레드가 있음
cpu는 프로세스에 할당됨
프로세스는 자원을 공유하지 않고 프로세스간 통신은 자원 소모가 커서
이를 보완하기위해 스레드라는 개념이 생김
스레드는 자원을 서로 공유함 - 공유하지 않는 stack에는 지역변수등이 저장됨
자원을 공유하기때문에 context switching으로 인한 오버헤드가 발생하지 않아 자원의 소모가 적고 작업처리속도가 빠름
대신 자원을 공유해서 발생하는 동기화문제에 프로그래머 차원에서 대처해야함

네트워크

TCP/IP 4계층

OS 커널에 의해 조작되는 구간 1-4
호스트가 통신하는 구간 1-2

  1. network access layer
    시그널 ↔ 데이터
    같은 네트워크 안에서 데이터(프레임) 전달
    OSI 7계층 data link계층: 와이파이, 이더넷(장치에 맥주소 부여)

  2. network layer
    네트워크의 주소(IP) 관리하고 라우팅(경로 최적화)
    라우터: 서로 다른 네트워크를 연결
    데이터 전송시 4계층->1계층으로 가는데 네트워크 패킷에 MAC주소가 없어 ARP를 이용

  3. transport layer
    특정 어플리케이션으로 전송
    데이터의 손실 및 중복이 없음 = 전송의 신뢰성 확보
    TCP: 3wayhandshaking으로 가상회선으로 연결 확립
    흐름제어로 송신 속도를 수신 데이터 처리 속도에 맞춤
    혼잡제어로 수신서버의 용량에 맞춰서 속도 조절
    신뢰성 있는 전송
    UDP: 데이터를 전송하는 경로가 여러개 → 빠르지만 순서 보장x

  4. application layer
    개발자가 조작할 수 있는 계층
    클라이언트(서비스를 제공받는 호스트)-서버(제공하는 호스트)구조
    소켓: API 및 함수를 프로세스에 전달하고 전달 받음
    IP는 호스트를 식별하지만 프로세스를 특정하지 못함 -> 포트번호로 특정함
    ex) HTTP 80번
    SSL을 통해 TCP전송을 암호화할 수 있다
    HTTP는 웹의 프로토콜
    프로그램이 실제 구현할 수 있는 프로토콜

*인터넷 프로토콜 5계층도 있음
physical-link-network-transport-application

파이썬

딕셔너리 정렬

키값을 기준으로 정렬된 키 리스트

  • sorted(dict)
  • sorted(dict, reverse=True)

키값을 기준으로 정렬된 딕셔너리

  • dict(sorted(dict.items()))

밸류를 기준으로 정렬된 딕셔너리

  • dict(sorted(dict.items(), key=lambda x:x[1]))
    dict.items()의 결과는 튜플이므로 인덱스 사용 key=x[0], value=x[1]

https://dogsavestheworld.tistory.com/110

profile
looooggi

0개의 댓글