2024/11 77

[P5] 백준 3015번 오아시스 재결합 C++ 스택, 해시맵

리뷰 https://www.acmicpc.net/problem/3015만만치 않은 스택 문제였다, 메모장을 키고 여러가지 케이스를 대입하고 나서야 풀린 문제풀고 나서 친구와 코드 리뷰를 해보니 내 코드는 딱히 좋은 풀이 방법은 아니였다.굳이 unordered_map을 사용하지 않고, 스택을 pair로 관리하여 cnt를 관리하는 최적화가 있으니 참고하길 바란다. + ans만 long long타입으로 해도 된다, 난 귀찮아서 모두 long long으로 해서 메모리가 꽤 커졌다.  전역 변수n : 주어지는 정수의 개수nodes : 정수를 저장하기 위한 배열cnt : 스택 상에 존재하는 정수의 개수를 표시하기 위한 해시맵stack : 스택 함수없음  문제풀이n을 입력 받고, n개의 정수를 nodes배열에 입력 ..

임베디드 IoT, MQTT

개요신뢰성 있는 데이터 전송 및 원격제어를 위해 만들어진 프로토콜 ( ISO 표준 )열악한 네트워크 환경에서 센서 하나 정도 달린 작은 기기들의 데이터 전송 및 원격제어를 위해 만들어짐→ 임베디드 장치에 알맞은 프로토콜이다 실시간, 최소 전력, 신뢰성 있는 비동기적 메시징 방식 ( TCP/IP 기반 )경량 프로토콜이벤트 방식의 N:N 통신 지원임베디드 IoT에 필수적인 기능만 모여 있다.  구성MQTT에는 3개의 구성원이 존재한다.Brokerpublishersubscriber  BrokerBroker는 메시지가 들어오는 통로이다.반드시 Broker를 통해서만 통신이 가능하다메시지의 전송 여부, 에러 여부를 확인할 수 있다. Publish / Subscribe누구나 발행/구독을 할 수 있으며, 구독과 발행..

임베디드/IoT 2024.11.11

[G4] 백준 14500번 테트로미노 C++ 구현, 백트래킹

리뷰 https://www.acmicpc.net/problem/14500각 위치마다 일반적인 4방향 백트래킹을 돌린다. ㅗ모양은 방향배열로 알 수 없어 해당 부분만 추가로 체크해 준다.ㅓㅗㅜㅏ 네개만 체크했다가 한번 틀렸다, 체크해야할 모양은 총 8개이다.  전역 변수n, m : 맵의 세로 길이 n, 맵의 가로 길이 mans : 정답을 저장하고 출력하기 위한 변수dx, dy : 8방향 탐색을 위한 방향 배열lst : 맵 정보를 저장하기 위한 정수형 2차 배열v : 방문 표시를 해주기 위한 정수형 2차 배열h : ㅗ모양을 했을때 각 모양의 값을 저장하기 위한 정수형 배열 함수1. inputvoid input() n, m을 입력 받고 맵 정보인 lst배열을 입력받기 위한 함수 2. btvoid bt(int ..

Boost.asio I/O TCP 소켓 동기적 읽기

개요TCP 소켓에서 읽는다는 것은 이 소켓에 연결된 원격 프로그램이 보낸 데이터를 받는다는 의미다.Boost.asio가 제공하는 소켓을 사용해 데이터를 수신하는 가장 간단한 방법은 동기적으로 읽는 것이다.쓰기와 마찬가지로 동기적 방식은 실행 중인 스레드를 멈추게 하고, 데이터를 모두 읽거나 오류가 발생하면 멈춘 스레드를 다시 풀어준다. Boost.asio 라이브러리로 소켓에서 데이터를 읽는 방법 중 가장 기본적인 방법이다.이 메서드는 쓸 수 있는 버퍼를 인자로 받고, 소켓에서 읽은 일부 데이터를 버퍼에 쓴다.이 함수가 성공하면 몇 바이트나 읽었는지를 반환한다.이 메서드가 몇 바이트를 읽을지는 제어할 수 없다.다만 오류가 나지 않는 한 적어도 한 바이트 이상을 읽는다는 것을 보장한다.일반적으로 소켓에서 일..

소켓 통신/Boost 2024.11.08

Boost.asio I/O TCP 소켓 동기적 쓰기

개요TCP 소켓에 쓴다는 것은 이 소켓에 연결된 원격 어플리케이션으로 데이터를 보내는 출력 연산을 한다는 뜻이다.Boost.asio가 제공하는 소켓 연산 중 가장 간단하게 데이터를 보내는 방법은 동기화 쓰기다.동기적으로 소켓에 쓰기 연산을 하는 메서드와 함수는 실행 중인 스레드를 멈추게 하며, 데이터가 소켓에 쓰이거나 오류를 발생하면 멈춘 스레드를 풀어준다. Boost.asio 라이브러리가 제공하는 가장 기본적은 소켓 쓰기 연산 방법은 write_some() 메서드이다.이 메서드는 결합 버퍼를 나타내는 객체를 인자로 받으며, 이름에서 알 수 있듯이 버퍼의 데이터 일부를 소켓에 쓴다.만약, 메서드가 성공하면 몇 바이트나 썼는지를 반환한다.여기서 중요한 점은 이 메서드가 buffers 인자를 통해 받은 데이..

소켓 통신/Boost 2024.11.08

Boost.asio I/O 가변 크기 버퍼, 스트림 버퍼

개요데이터가 새로 추가될 때마다 동적으로 크기가 커지는 버퍼를 확장 가능한 버퍼라고 한다.이러한 버퍼는 소켓에서 데이터를 읽을 때 들어오는 메시지의 크기를 알 수 없을 때 주로 사용한다. 어떤 어플리케이션 계층 프로토콜은 메시지의 크기를 정해놓지 않는다.그 대신 메시지의 경계를 나타내는 일련의 기호 값들을 메시지의 끝에 덧붙이거나 전송 계층의 파일 끝 메시지를 전송하여 메시지를 모두 전송했다는 것을 알린다. Boost.asio 라이브러리에서는 동적으로 확장할 수 있는 버퍼와 이를 받는 함수 모두 제공한다.  asio::streambuf확장 가능한 스트림 기반 버퍼는 Boost.asio에서 asio::streambuf 클래스로 표시된다.streambuf 클래스는 TSL 스트림 클래스가 필요한 상황에서도 사..

소켓 통신/Boost 2024.11.08

Boost.asio I/O 고정 크기 버퍼

개요다른 I/O와 마찬가지로, 네트워크 I/O에서도 메모리 버퍼를 사용한다.메모리 버퍼란, 프로세스의 주소 영역 내에 연속된 메모리 공간으로, 데이터를 저장하는데 사용한다. 어떤 입력 연산을 실행했다면, 프로세스에 도착한 데이터는 주소 공간 어딘가에 저장되어야만 처리할 수 있다. 즉, 버퍼가 있어야 I/O를 처리할 수 있다는 것이다. 입력 연산을 실행하기 전에 버퍼를 할당해둬야 하고 입력 연산 중에 데이터를 저장할 곳으로 이 버퍼를 사용해야 한다. 입력 연산이 끝나면, 버퍼에 입력 데이터가 저장되어 있어 나중에 어플리케이션이 처리할 수 있다. 이와 마찬가지로 출력 연산을 실행하기 전에는 데이터를 준비하여 출력 연산에 쓸 출력 버퍼에 저장해둬야 한다. 그러면 출력 버퍼가 데이터의 소스가 된다. 버퍼는 네트..

소켓 통신/Boost 2024.11.08

Boost.asio I/O 연산

개요네트워크 프로그래밍은 컴퓨터 네트워크를 사이에 두고 프로세스가 서로 통신하는 것을 말한다.통신이란 2개 또는 그 이상의 프로세스가 서로 데이터를 주고받는 것을 말한다.데이터를 주고 받는 것은 I/O 연산을 통해서 이루어진다. I/O 연산은 모든 분산 프로그램의 네트워크 구조에서 빼놓을 수 없는 중요 연산이다.I/O 연산은 데이터 교환과 직접 관련된 기능이며, 데이터를 읽을때는 입력, 보낼때는 출력 연산을 사용한다.  동기 I/O 연산동기 연산을 하면 I/O 연산을 호출한 스레드를 멈추게 하며, 연산이 끝날 때 풀어준다.통신에 시간이 많이 걸리지 않는 데이터를 연산을 한다면 괜찮겠지만, 크기가 큰 데이터나 엄청 잦은 데이터 처리를 요구한다고 하면 연산을 처리하는 동안 해당 스레드를 사용할 수 없다. 하..

소켓 통신/Boost 2024.11.08

[G3] 백준 16637번 괄호 추가하기 C++ 구현, 백트래킹

리뷰 https://www.acmicpc.net/problem/16637주어지는 연산자가 포함된 문자열로 이루어진 수열에서 괄호를 적절히 쳐서 최대값을 만드는 문제처음엔 모든 경우에 대해 괄호를 씌워주었는데, 괄호가 중첩되면 안된다는 조건이 있었다.추가로, 음수 정답이 나오는 예제가 없으니 해당 부분을 놓치기 쉬운 것 같다.  전역 변수n : 입력되는 수열 형태의 문자열의 길이max_lv : 재귀를 멈출 기저조건에 해당하는 레벨ans : 정답을 출력하기 위한 변수, 초기값은 매우 작은 음수값으로 초기화 해준다.s : 수열 형태의 문자열을 입력받을 변수nums : 수열에서 숫자만 따로 저장하기 위한 정수형 벡터ops : 수열에서 연산자만 따로 저장하기 위한 문자형 벡터 함수1. initvoid init()..

Boost.asio 소켓 연결 수락

개요클라이언트에서 서버에게 요청 연결을 요청하였다면 서버에서 해당 요청을 수락할 수 있다.다만, 요청을 수락하기 전에 처리해야 할 일이 있으며, 준비가 되지 않았다면 운영체제에서 모든 요청을 거절한다. 먼저 서버 프로그램은 수용자 소켓을 만들고 연 후, 특정 종료점에 바인딩 해야한다.이때 까지 클라이언트가 보내는 연결 요청은 모두 운영체제에서 거절하게 된다.클라이언트의 연결 요청을 받아들이기 위해선 바인딩을 마친 후 리스닝 상태가 되어야 한다.리스닝 상태가 되면 운영체제에서는 클라이언트의 요청을 큐에 저장하고, 연결 요청을 받아들이기 시작한다.  연결 수락 과정새 연결 요청이 도착하면 먼저 운영체제가 받는다.해당 메시지는 연결 요청이 가리키는 수용자 소켓의 대기열에 들어간다.대기열에 있는 연결 요청은 서..

소켓 통신/Boost 2024.11.07
728x90