0304 TIL

looggi·2023년 3월 4일
1

TILs

목록 보기
25/114
post-thumbnail

네트워크

1.웹 서버 소프트웨어(Apache, Nginx)는 OSI 7계층 중 어디서 작동하는지 설명해보세요.
웹 서버는 HTTP 프로토콜을 사용해 html 데이터를 클라이언트에 제공하는 서버입니다. 그리고 HTTP 프로토콜은 OSI 7계층인 Application Layer에 위치해 있습니다. 브라우저와 서버 사이에 정보를 주고받기 위해 사용하며, Apache, Nginx는 웹 서버 중의 하나이므로 Applicaion 계층에서 작동합니다.

2.웹 서버 소프트웨어(Apache, Nginx)의 서버 간 라우팅 기능은 OSI 7계층 중 어디서 작동하는지 설명해보세요.
라우터는 다른 네트워크와 통신하기 위해 사용하는 장치로, 현재의 네트워크에서 다른 네트워크로 패킷을 전송합니다. 따라서 서버 간 라우팅 기능은 네트워크 계층에서 동작합니다.

프로그래머스 문제풀기

➡️크레인 인형 뽑기 게임

def solution(board, moves):
    basket=[0] # 인형을 담는 바구니
    cnt=0 # 인형이 터지는 횟수
    for move in moves:
        for i in range(len(board)):
            if board[i][move-1]:
                match=basket[-1]
                basket.append(board[i][move-1])
                board[i][move-1]=0
                if match==basket[-1]:
                    basket=basket[:-2]
                    cnt+=1
                break
    return cnt*2

moves에 담긴 각 move마다 move가 0이 아닌 경우까지 갔을 때만
현재 바구니에 담긴 가장 마지막 인형을 match에 담고
바구니에 0이 아닌 인형의 값을 담고
다음에 바구니에 다시 접근할 수도 있기때문에 그 자리는 0으로 바꾸고
바구니에 담겼던 마지막 인형과 새로 담은 인형이 맞는 경우에 인형이 사라지므로 cnt+=1을 하고 해당 move에 대한 로직은 끝났기때문에 break로 for문을 빠져나와서 다음 move에 대한 로직을 시작한다
최종적으로 한번에 인형은 2개가 터지므로 *2를해서 리턴한다

🙋두 번째 for문에서 인형을 뽑는 깊이가 깊어질수록 계속 뽑은 자리를 0으로 치환하고 다음 번 moves에서 다시 같은 열을 조회할 때 board[0]부터 순차적으로 조회하는 비용을 index 마킹을 통해 줄일 수 있을 것 같습니다.

0을 넣어놓은 자리를 기억해두면 해당 라인에서 그 부분 이하로만 접근하면 되니까 표시해두면 좋겠다는 말인듯?
그럼 해당 [move-1]마다 i값을 기억해둬야하는데 ...

➡️크레인 인형 뽑기 게임 다른 풀이

def solution(board, moves):
    cols = list(map(lambda x: list(filter(lambda y: y > 0, x)), zip(*board)))
    # zip(*board) = [(0, 0, 0, 4, 3), (0, 0, 2, 2, 5), (0, 1, 5, 4, 1), (0, 0, 0, 4, 3), (0, 3, 1, 2, 1)]
    # cols = [[4, 3], [2, 2, 5], [1, 5, 4, 1], [4, 3], [3, 1, 2, 1]]
    
    a, s = 0, [0]
    for m in moves:
        if len(cols[m - 1]) > 0:
            if (d := cols[m - 1].pop(0)) == (l := s.pop()):
                a += 2
            else:
                s.extend([l, d])

    return a

첫번째 cols 이하 식에서

  1. zip(*board)는 board를 언패킹해서 언패킹한 n개의 리스트의 i번째 요소끼리 zip해줘서 행과 열을 바꿔주는 역할을 한다

  2. lambda x: list(filter(lambda y: y > 0, x))
    filter(함수, 리스트): 리스트 범위에서 함수에 해당하는 값만 뽑아낸다

    list(filter(lambda x: x % 2, range(10)))

    x를 2로 나눈 나머지가 0이면 false이기때문에 조건식을 만족하지 않게 되고 홀수인 경우 나머지가 1이기때문에 true가 돼서 리스트에 담긴다.

    zip(*board)에의해 생성된 리스트에 대해서 map을 이용해 각 요소((0, 0, 0, 4, 3)과 같은 튜플)에 대해서 lamdba x식을 실행하고 그 열의 개별 요소들(0,0,0,4,3 각각)에 대해서는 lambda y가 실행되어 리스트에 담긴다

    x에 대해서 0보다 큰 것만 살려놓으면 중간이 비어있으면 어떡하나 했는데 그런 경우가 없다는 가정인 것 같다. 안그럼 이 답안이 말이 안됨
    https://wikidocs.net/64

반복문 이하에서

  1. moves의 m에 대해서 인형을 다 뽑으면 길이가 0이 되기때문에 0보다 클 때만 다음 조건문을 실행한다
    cols[m - 1]의 첫번째가 맨 위의 인형이 되기때문에 pop인덱스에 0을 넣어준다. 이 값을 pop과 동시에 d에 담아주고 이 값이 바구니의 마지막 값과 같으면 답이 2증가하고 아니면 아까 변수에 담았던 바구니의 마지막 인형과 뽑은 인형을 차례로 다시 바구니에 넣어준다
profile
looooggi

0개의 댓글