문제

www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

풀이

스택을 구현하는 문제이다. 파이썬의 경우, 스택을 직접 구현하지 않고도, 리스트를 이용해서 유연하게 사용할 수 있다.

push의 경우 operand가 존재하기 때문에 입력받을 때부터 split 메소드를 이용하여 입력받았다.

좀더 스택스럽게 구현하기 위해 isempty 함수만 별도로 구현했고, 나머지는 기존 리스트 클래스에 존재하는 메소드를 이용하여 구현하였다.

인덱스 값 중 -1은 맨 뒤의 위치를 의미하는 인덱스이다. append 메소드를 사용하면 리스트에서 자연스럽게 뒤쪽으로 값이 추가되기 때문에, 뒤의 값을 빼내기 위해 -1 인덱스를 활용하였다. insert 메소드를 통해 값을 앞에 넣을수도 있지만, append는 O(1)의 시간 복잡도를 갖고, insert는 O(n)의 시간 복잡도를 갖기 때문에 append 메소드를 활용하였다.

 

코드

N = int(input())

op_list = []

for i in range(N):
    op_list.append(input().split(" "))


def isempty(stack):
    return len(stack) == 0


st = []

for op in op_list:
    if op[0] == "push":
        st.append(int(op[1]))
        
    elif op[0] == "pop":
        if isempty(st):
            print(-1)
        else:
            print(st.pop(-1))
            
    elif op[0] == "size":
        print(len(st))
        
    elif op[0] == "empty":
        if isempty(st):
            print(1)
        else:
            print(0)
            
    elif op[0] == "top":
        if isempty(st):
            print(-1)
        else:
            print(st[-1])
반응형

'Development > Algorithm' 카테고리의 다른 글

[boj] 1874 - 스택 수열  (0) 2021.03.08
[boj] 2164 - 카드2  (0) 2021.03.08
[boj] 18258 - 큐2  (0) 2021.03.04
[boj] 9012 - 괄호  (0) 2021.03.04
[boj] 1158 - 요세푸스 문제  (0) 2021.03.04

문제

www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

 

풀이

해당 문제는 비교적 간단한 solved.ac 기준 실버 5급 문제로, 처음에는 원형 큐를 사용해야 할 지 고민했지만, 조금 생각해 보니 굳이 원형 큐를 구현할 필요 없이, 리스트와 인덱스 포인터만을 이용하여 간단하게 해결할 수 있다.

필자의 경우, 우선 사람 배열을 만들고, 제거할 사람의 위치를 가리키는 인덱스 포인터를 지정했다. 그리고 해당 인덱스 포인터에 K값을 더해 가면서, 해당 값이 사람 배열의 크기보다 커지면 나눠 줘 가면서 원형으로 이동하는 것을 표현했다.

그리고 사람을 빼낸 다음, 빼낸 사람을 그대로 요세푸스 배열에 추가한다. 이때 사람을 빼낸 후 인덱스 포인터를 1만큼 감소시켜야 하는데, 그 이유는 사람을 빼내면서 자연스럽게 인덱스 포인터가 다음 사람을 가리키게 되기 때문에, 다음 사람을 1번째 사람으로 표현하기 위해서는 인덱스 포인터를 함께 1만큼 감소시켜 줘야 한다.

출력 형식에서 약간의 문제가 있었는데, 파이썬 메소드 중 __str__ 메소드를 이용하여 간단하게 해결하였다. 리스트의 경우 __str__ 메소드를 거치면 [a, b, c] 형태로 출력되기 때문에, 해당 메소드를 호출한 뒤 맨 앞과 맨 뒤의 문자만 제거하고, 해당 부분에 <, >를 넣어 출력하는 식으로 해결하였다.

 

코드

N, K = map(int, input().split(" "))

people = []
for i in range(N):
    people.append(i+1)

yosep = []
people_index = -1

while True:
    people_index += K
    people_index = people_index % len(people)
    yosep.append(people.pop(people_index))
    people_index -= 1
    if len(people) == 0:
        break

print("<{}>".format(yosep.__str__()[1:-1]))

 

 

반응형

'Development > Algorithm' 카테고리의 다른 글

[boj] 1874 - 스택 수열  (0) 2021.03.08
[boj] 2164 - 카드2  (0) 2021.03.08
[boj] 18258 - 큐2  (0) 2021.03.04
[boj] 9012 - 괄호  (0) 2021.03.04
[boj] 10828 - 스택  (0) 2021.03.04

네트워크 관련 전공강의를 듣던 중, PC에서 구글 홈페이지가 뜨기까지 네트워크에서 어떤 일이 발생하는가?라는 질문을 제시해 주셨다. 그래서 집 인터넷을 이용하여 구글을 켜기까지 네트워크 속에서 어떤 과정들을 거치는지 필자가 아는 선에서 간단히 정리해 보았다.

  1. DHCP 할당
    • 우선 집 인터넷에 내 PC를 연결하면, IP를 할당받아야 한다. 이때 DHCP를 이용하여 동적으로 할당받고자 한다.
    • IP를 할당받기 위해, DHCP Discover를 UDP 프로토콜을 이용하여 브로드캐스트로 보낸다.
    • 이후 홈 네트워크 상의 DHCP 서버에서 해당 신호를 확인하고, DHCP Offer를 통해 서버의 주소와 할당받을 수 있는 IP를 PC에 보낸다.
    • PC는 다시 DHCP Request 신호를 통해 IP주소를 요청한다.
    • DHCP 서버는 DHCP Ack 신호를 통해 IP 주소 및 기타 연결 정보를 제공한다.
  2. Arp를 통한 라우터 확인
    • IP를 할당받은 PC에서 라우터를 확인하기 위해 Arp Request를 브로드캐스트한다.
    • 이를 확인한 라우터는 해당 PC에게 Arp Reply 신호를 보내 서로 주소를 확인한다.
  3. DNS를 통한 구글 웹 서버 확인
    • DNS 서버에 google.com이라는 hostname에 대응하는 IP를 요청하여 구글 웹 서버의 IP를 확인한다.
  4. 구글 웹 서버와의 통신
    • 구글 웹 서버와 TCP 연결을 수행한다.
      • 연결을 위해 TCP 3-way-handshake를 수행한다. 우선 내 PC에서 구글 웹 서버로 SYN 신호를 보낸다.
      • 구글 웹 서버는 연결할 준비가 되면 SYN/ACK 신호를 내 PC로 보내준다.
      • 이후 내 PC는 준비가 완료되면 ACK 신호를 보내고, TCP 소켓이 구성된다.
    • 구글 웹 서버와 HTTP 통신을 진행한다.
      • 내 PC에서 구글 웹 서버로 HTTP Request를 보낸다.
      • 구글 웹 서버에서는 해당 Request를 토대로 처리를 수행한 후 내 PC로 Response를 보내 준다.
    • 구글 웹 서버와 TCP 연결을 종료한다.
      • 연결 종료를 위해 TCP 4-way-handshake를 수행한다. 우선 내 PC에서 연결을 닫을 준비를 하고 구글 웹 서버로 FIN 신호를 보낸다.
      • 구글 웹 서버는 신호를 확인하고, ACK 신호를 보낸다. 이후 연결을 닫을 준비가 완료되면 FIN 신호를 보낸다.
      • 내 PC에서 FIN 신호를 받으면, 연결을 닫으며 ACK 신호를 보낸다.
      • 구글 웹 서버에서 ACK 신호를 받으면 최종적으로 연결을 닫으면서 연결이 종료된다.

 

반응형

'Development > Network' 카테고리의 다른 글

[Network] RDT1.0부터 RDT 3.0까지  (0) 2021.10.08

웹 애플리케이션(web application) 또는 웹 앱 소프트웨어 공학적 관점에서 인터넷이나 인트라넷을 통해 웹 브라우저에서 이용할 수 있는 응용 소프트웨어를 말한다. (위키백과)

사용자의 브라우저에서 웹이 작동하는 원리는 기본적으로 클라이언트 - 서버 구조로 이루어지는데, 그 원리는 다음과 같다.

  1. 사용자가 웹 브라우저(클라이언트)를 통해 웹 서버에 요청(Request)을 보낸다
  2. 웹 서버는 받은 요청을 기반으로 웹 애플리케이션 서버, 데이터베이스 서버를 통해 처리를 진행한다.
  3. 처리가 완료된 후, 웹 브라우저에게 응답(Response)을 보낸다.
  4. 받은 응답을 기반으로 웹 브라우저는 해당 내용을 해석하여 사용자에게 보여준다.

 

실무에서는 프론트엔드(FE), 백엔드(BE)로 업무를 분담하고 있다.

프론트엔드

프론트엔드란 Front라는 말의 뜻에 맞게, 사용자가 직접 보고, 확인할 수 있는 부분을 의미한다. 클라이언트-서버 구조에서는 클라이언트 부분을 의미하며, 일반적으로 웹 브라우저를 통해 사용자에게 보여지는 부분이다. 부가적으로, 웹 브라우저를 통해 요청을 보내는 것과, 응답을 받아서 해독하는 부분까지 프론트엔드로 본다. 대표적으로 HTML, CSS, JS등을 이용한다. 최근에는 웹 브라우저가 아닌 모바일 어플리케이션 부분도 프론트엔드로 보는데, 모바일 애플리케이션 개발 토대로, 리액트라는 프론트엔드 라이브러리가 많이 사용되고 있다.

백엔드

백엔드란 프론트엔드 개념의 반대되는 의미로, 사용자의 눈에 보이지 않는 부분을 의미한다. 프론트엔드에서 보내준 요청을 처리하여 다시 응답을 제공하는 부분으로, 클라이언트-서버 구조에서는 서버를 의미하며, 해당 부분에는 다양한 서버가 맞물려서 구성될 수 있다. 웹 서버, 웹 애플리케이션 서버, 데이터베이스가 있으며, 최근 웹 서버용 프레임워크로 Java 기반의 Spring, Python 기반의 Django, Javascript 기반의 node.js와 nest.js 등이 사용되고 있다. 데이터베이스는 Oracle, Mysql, Mariadb, Mongodb 등이 있다.

 

반응형

+ Recent posts