https://www.acmicpc.net/problem/1103

 

1103번: 게임

줄에 보드의 세로 크기 N과 가로 크기 M이 주어진다. 이 값은 모두 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 보드의 상태가 주어진다. 쓰여 있는 숫자는 1부터 9까지의 자연수 또는

www.acmicpc.net

 

 

1. 풀이방법

- 처음에는 단순 dfs로 접근하긴 했지만 (오랜만에 풀이라 일단 접근했음)

 

- 하면서도 분명 제대로 구현되도 시간초과가 뜨거나 스택오버플로우가 날 것 이라 생각했습니다.

 

- 처음시도는 역시나 시간초과

 

- 시간초과라면 dp테이블을 이용해보자는 생각 !

 

- 아, 근데 오랜만에 푸니까 dp적 머리가 잘 돌아가지 않아서 고생을 좀 했습니다....

 

- 우선 테이블을 모두 -1 처리를 하고 visit이 이미 true인 곳에 다시 오면 그건 싸이클이므로

 

- -1을 출력 (무한정 왔다리갔다리 가능)

 

- dp가 -1이 아닐경우 기존에 저장되어 있는 수와 현재의 루트에서 +1 (한번 더 이동) 해서 더 많은 이동횟수로 업데이트

 

- dfs +dp 라고 할 수 있겠네요. dfs는 간단한 수준이라 생략하겠습니다.

 

 

 

2. 주의사항

 

- 시간초과

 

 

 

3. 코드

#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define endl "\n"
using namespace std;

int N, M;
int ground[50][50];
int dp[50][50];
bool visited[50][50];

int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 };


void Input(){
    cin >> N >> M;
    for (int i = 0; i < N; i++){
        string inputs;
        cin >> inputs;
        for (int j = 0; j < inputs.length(); j++){
            if (inputs[j] == 'H') ground[i][j] = 0;
            else ground[i][j] = inputs[j] - '0';
        }
    }
}

int DFS(int x, int y){
    if (x < 0 || y < 0 || x >= N || y >= M || ground[x][y] == 0) return 0;
    if (visited[x][y] == true) // 무한반복이 가능
    {
        cout << -1 << endl;
        exit(0);
    }
    if (dp[x][y] != -1) return dp[x][y]; // 바로 dp 테이블에서 리턴

    visited[x][y] = true;
    dp[x][y] = 0;
    for (int i = 0; i < 4; i++){
        int tx = x + (ground[x][y] * dx[i]);
        int ty = y + (ground[x][y] * dy[i]);
        dp[x][y] = max(dp[x][y], DFS(tx, ty) + 1);
    }
    visited[x][y] = false;
    return dp[x][y];
}

int main(void){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    Input();
    memset(dp, -1, sizeof(dp)); //dp 테이블 초기화
    cout << DFS(0, 0) << endl;
    return 0;
}

 

'알고리즘 문제풀이 > 다이나믹 프로그래밍' 카테고리의 다른 글

백준 1932 [C++]  (0) 2021.08.10
백준 3687 [C++]  (0) 2021.08.09
백준 1793 [C++]  (0) 2021.02.04
백준 1965 [C++]  (0) 2021.02.03
백준 1463 [C++] - 메모리초과  (0) 2020.12.15

0. HTTP의 특징

- 쿠키와 세션의 필요성을 알아보기 위해

   HTTP 프로토콜의 특징을 먼저 간단하게 파악해보겠습니다.

 

  0-1. Connectionless 프로토콜 (비연결지향)

     - 클라이언트가 요청(Request) 을 보내고, 서버가 응답(Response) 을 보낸 후 연결을 유지하지 않고 끊는 방식이다.

 

  0-2. Stateless 프로토콜 (상태정보 유지 안함)

     - 클라이언트의 상태 정보를 저장하지 않는 서버 처리 방식이다.

     - 그러나, 사용자의 편의를 고려하면 데이터 유지가 필요하다.

     - 로그인 상태 유지, 장바구니 내역 등 필요한 경우가 있다.

       ( stateful하게 사용해야할 때 쿠키와 세션을 사용한다. ) - 정보유지

 

- 이는 서버의 자원을 절약하기 위한 설정이라고 보면 되겠습니다. ( 비연결성 + 비상태성 )

 

 

1. 쿠키 와 세션

- 우선 표를 먼저 확인해보자

 

 

 

2. 쿠키( Cookie )

- 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일

- 웹 사이트에 접속할 때 생성되는 정보를 담은 파일 ( 임시 파일 )

- 쿠키는 서버가 사용자의 웹 브라우저에 저장하는 데이터이다. ( 클라이언트 측에 저장 )

- 소프트웨어는 아니다. 단지 (key/value) 쌍의 string 형태이다. + ( 만료일, 경로 )

- 브라우저 간의 공유는 되지 않는다 ( 당연한가 )

- 아이디 저장 , 장바구니, " 더 이상 보지 않기"

- 저장 용량의 한계가 있다. ( 4KB, 총 300개, 도메인당 20개 )

- Session Cookie ( 브라우저 종료시 쿠키 삭제 ), Persistent Cookie ( 장기간, 브라우조 종료와 관계 x )

  Secure Cookie (HTTPS에서 사용, 쿠키 정보가 암호화되어 전송) 등 여러가지 종료가 있다.

 

  2.1 사용목적

    - 세션관리 ( 아이디, 장바구니 등 ) : 서버가 알아야할 정보들을 저장해놓는다.

    - 개인화 : 사용자마다 다르게 정보를 제공할 수 있다.

    - 트래킹 : 사용자의 행동을 기록하고 분석한다.

     

  2.2 단점

    - 쿠키에 대한 정보를 헤더에 매번 담아보내야하므로, 오버헤드가 발생한다.

    - 쿠키의 정보가 유출되는 보안에 취약한 문제점이 있다. (클라이언트 측에 저장되므로)

    - 쿠키를 거부하도록 설정할 수 있지만, 사용에 있어 불편함을 느낄 수 있다.

 

 

3. 세션( Session )

 - 쿠키 기반이며, 동작원리도 비슷합니다.

 - 클라이언트가 요청을 보내면, 서버는 헤더를 보고 session-id를 보냈는지 확인한다.

 - 존재하지 않으면, 서버는 세션 ID를 생성해 클라이언트에게 돌려주고, 클라이언트는 이를 사용해 서버에 저장한다.

 - 세션 ID가 1개씩 생성되어 웹 컨테이너에 저장된다.

 - 클라이언트 측이 아닌 서버측에 저장한다.

 - 이로인해, 많은 요청이 일어날 경우 서버에 과부화를 줄 수 있습니다.

 - 서버리소스를 초과하지 않는 함 상대적으로 용량의 한계가 없는 편

 - 서버 측에 저장하기 때문에 보안적인 측면에서 유리하다. (서버 측에서 관리)

 

 

 3.1 사용목적

    - 쿠키와 크게 다르지 않다.

 

 3.2 단점

    - 서버에 과부화를 줄 수 있다.

    - 쿠키보다 속도가 느리다. 서버에서 추가적인 처리가 필요하기 때문

 

 

4. 쿠키와 세션의 차이점

  - 가장 큰 차이점은 저장위치 ( 클라이언트(쿠키), 서버(세션) )

  - 그에 따른 보안과 속도의 차이 ( 위의 표에 적혀 있음 )

  - 라이프 사이클 (만료기간) 관점에서 쿠키는 만료기간 설정에 따라 넉넉하게 잡으면 오래 유지가 가능하다.

     반면 세션은 만료시간을 정해두어도 브라우저가 종료되면 만료시간에 상관없이 삭제된다.

  - 보안과 성능의 관점에서 저장할 정보들을 보고 적절하게 두가지를 잘 사용할 필요가 있겠습니다.

'학부생 공부 > 네트워크' 카테고리의 다른 글

HTTPS vs HTTPS  (0) 2021.09.19
OSI 7계층  (0) 2021.05.29
TCP(전송 제어 프로토콜) / IP(인터넷 프로토콜)  (0) 2021.05.28
DNS (domain name system)  (0) 2020.04.13
SMTP (E-mail)  (0) 2020.04.12

0. OSI 7계층 ? 왜 ?

- OSI 계층은 네트워크에서 통신이 일어나는 과정을 나눈 것을 말한다.

- 7계층으로 불리기도 하고, 5,6 계층을 제외하고 통상 OSI 5 계층이라고 불리기도 한다.

- 계층을 나눔으로써, 통신상의 오류가 발생했을 때 문제의 범위, 규모, 증상 등을 보고 

  비교적 빠르고, 쉽게 문제점을 찾아낼 수 있다. (독립적인 역할)

- 물론 이해를 편하게 해주기도 한다.

 

- 즉 OSI 모델은 프로토콜을 기능별로 나눈 것이다. 

- 각 계층은 하위 계층의 기능만을 이용하고, 상위 계층에게 기능을 제공한다.

- 일반적으로 하위 계층들은 하드웨어로, 상위 계층들은 소프트웨어로 구성된다.

 

 

1. 물리 계층 ( Physical Layer )

- 전기적, 기계적인 특성을 이용해서 데이터를 통신 케이블을 통해 전송한다.

- 비트 단위 통신을 하며, 즉 0과 1의 상태이다.

- 전기적인 신호를 주고 받는 계층

- 대표 장비: 통신케이블, 허브, 리피터 ...

 

 

2. 데이터 링크 계층 ( DataLink Layer )

- 제가 네트워크시간에 배웠을 때는 Link Layer로 불렀는데 책마다 약간씩 차이는 있는 것 같습니다.

- 첫번째 계층 ( 물리 계층 )에서 송수신 되는 정보를 관리하여 정보 전달 수행을 도와준다.

- 통신상의 오류를 찾아주기도 하고, 재전송을 해주기도 한다.

- MAC 주소를 이용해서 통신을 한다. ( 전송단위는 Frame 이다 )

- 대표 장비 : 스위치, 브리지

- 스위치, 브리지 를 통해 MAC address 를 이용하여 물리계층에서 받은 정보를 전달하는 계층이다.

- Point to Point 로 전송을 신뢰성있게 해주기 위한 계층이다. 

- Mac address는 물리적으로 할당 받은 값이다. (ex ethernet) 

- 핵심 역할은 Frame 에 주소부여 (MAC) , 에러검출, 흐름제어, 재전송 

 

 

3. 네트워크 계층 ( Network Layer )

- "라우팅" 의 핵심 계층이다.

- 데이터를 원하는 목적지 까지 안전하고 빠르게 전달한다.

- 물리적인 주소가 아닌 논리적인 주소 (IP) 를 이용한다. (계층적인 구조이다)

- ( 전송단위는 Packet 이다. )

- 네트워크 관리자가 직접 주소를 할당하는 구조이다.

- 다양한 라우팅 기술과 프로토콜 종류가 있다.

- 대표 장비: 라우터

- 핵심 역할은 주소할당(IP), 경로 설정 (라우팅)

 

 

4. 전송 계층 ( Transport Layer )

- 통신을 활성화하기 위한 계층

- TCP, UDP 등의 프로토콜이 있다.

- TCP 프로토콜( Connection oriented )을 많이 이용하며, TCP와 UDP(빠르고 오버헤드가 적음) 를 섞어서 사용하기도 한다.

- End to End  종단 간 통신을 다루는 것에 있어서 최하위 계층이다.

- 종단 간 신뢰성 있고, 효율적인 데이터 전송을 하며, 오류 검출 및 복구, 흐름제어, 중복검사 등을 수행한다.

- Process 별로 data integrity(데이터 무결성), timing, throughput(처리속도), security 등에 대해서

  다양한 요구사항을 가지는데 이러한 요구를 잘 맞추어 주는 것이 중요하다.

- ( 전송단위는 Segment 이다. )

- 핵심 역할은 패킷 생성, 전송, 오류검출, 재전송

 

 

5. 세션 계층 ( Session Layer )

- 데이터가 통신하기 위한 논리적인 연결

- 저는 네트워크 시간에 주로 5계층을 기준으로 설명을 하셔서, 5,6 계층에 대해서는 아는바 가 별로 없습니다...ㅠ

 

 

6. 표현 계층 (Presentation Layer )

- 데이터 표현이 서로 다른 응용 프로세스의 독립성을 제공하고, 암호화 해준다.

- 암호화, 번역, 포장

 

 

7. 응용 계층 ( Application Layer )

- HTTP, FTP, SMTP, POP3 , IMAP 등과 같이 친숙한 프로토콜들이 많이 있다.

- 모든 통신의 양 끝단에 위치해 있는 프로토콜들이 있는 계층

- 통신 패킷들은 이러한 프로토콜들에 의해서 처리된다.

- router라던가, core 쪽은 신경쓰지 않아도 된다.

- (Client - Server), (peer to peer(P2P)) structure가 있다.

- Process 는 Socket을 통해서 메시지를 주고 받는다. (소켓은 문이라 생각)

- IP address 만으로는 부족하다. (ex. 스마트폰 에서 단 하나의 프로세스만 실행하지 않는다.)

- 따라서 해당 프로세스가 가지고 있는 고유의 port number를 이용한다.

- IP address + Port number + protocol -----> 하나의 flow

 

 

** 참고 : https://ko.wikipedia.org/wiki/OSI_%EB%AA%A8%ED%98%95

'학부생 공부 > 네트워크' 카테고리의 다른 글

HTTPS vs HTTPS  (0) 2021.09.19
쿠키 (cookie) 와 세션 (Session)  (0) 2021.05.31
TCP(전송 제어 프로토콜) / IP(인터넷 프로토콜)  (0) 2021.05.28
DNS (domain name system)  (0) 2020.04.13
SMTP (E-mail)  (0) 2020.04.12

1. TCP/IP ?

- TCP ( 전송 제어 프로토콜 ) , IP ( 인터넷 프로토콜 )

- 대부분이 패킷통신을 기본으로 하고 있는 요즘, 그러한 패킷 통신을 위한 인터넷 규약( 프로토콜 )입니다.

- IP기반에 TCP가 사용되기 때문에 데이터 통신을 하는 것을 TCP/IP 라고 묶어 부르는 것 입니다.

   

 

 

2. IP ( 인터넷 프로토콜 )

- 데이터 조각들의 순서를 보장해주지 않습니다.

- 일부 누락될 수 있습니다.

- 빠르게 보내는 것이 가능합니다. 

- 3계층(network) 프로토콜

 

 

 

3. TCP ( 전송 제어 프로토콜 )

- 3 handshake

- 서버와 클라이언트 사이의 데이터를 신뢰성 있게 전달하기 위한 프로토콜

- 누락된 데이터가 발생하면 이를 확인 후 재 요청합니다.

- 데이터 패킷의 순서가 보장됩니다.

- IP 위에서 동작하는 프로토콜 입니다.

- 4계층(transport, 전송 계층) 프로토콜

 

- 그림으로 보면 조금 더 쉽습니다....!

 

** 참고: 위키백과 (https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%84%B7_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C_%EC%8A%A4%EC%9C%84%ED%8A%B8)

'학부생 공부 > 네트워크' 카테고리의 다른 글

쿠키 (cookie) 와 세션 (Session)  (0) 2021.05.31
OSI 7계층  (0) 2021.05.29
DNS (domain name system)  (0) 2020.04.13
SMTP (E-mail)  (0) 2020.04.12
FTP  (0) 2020.04.12

 

1. Context Switching 이란?

- 멀티 프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있을 때, 

  운영체제의 스케줄링에 따라 인터럽트 요청이 발생해서 다음 프로세스가 실행되어야 할 때

  각 프로세스 들은 메모리를 공유하지 않기 때문에, 기존의 프로세스의 상태(레지스터 값)을 저장하고 

  다음 프로세스의 상태(레지스터 값)을 교체하는 작업을 Context Switching( 문맥 교환 ) 이라고 한다.

 

- OS에서 Context는 CPU가 프로세스를 실행하기 위한 그 프로세스의 정보들을 말한다.

  이 Context는 프로세스의 PCB(Process Control Block)에 저장된다.

  Context Switching이 발생하면 CPU는 해당 프로세스의 PCB 정보를 받아와서 이전의 작업을 이어 수행한다.

 

- ** PCB는 Process State, Process Counter ( 다음 실행할 명령어의 위치 (주소 값) ), registers 등으로 구성 

 

- Context Switching 이 발생할 경우 시간 소요가 많이 된다.

( 실행 중이던 프로세스의 PCB를 저장하고,  실행할 프로세스의 PCB를 불러오고, 캐쉬를 초기화 하고.......등) 

 

- 주체는 Operating System (운영 체제) 이다.

 

 

2. Interrupt 발생 시 Context Switching 

- 해당 프로세스에 할당된 CPU 사용시간이 만료되어 다른 프로세스를 처리해야 할 때 Interrupt 발생

 

- 입출력 요청 등의 사항으로 현재 프로세스 처리를 멈춰야 할 때 Interrupt 발생

 

- 등등......

API 작성 중 

 

26번까지의 반복 작업(반복문)-- 각 작업마다 조금씩 다름 --

 

을 통해서 구한 정보를 데이터 베이스에 토큰단위로 삽입을 하는 작업인데,

 

카운트를 해보니 계속 0~9까지 작업 중 10번에서 계속 서버가 멈추는 이슈가 발생했습니다.

 

처음에는 10번 작업에 문제가 있는 줄 알고, 확인을 해봤는데 딱히 문제를 발견하지 못해서

 

10~26번 까지 돌려 보니 10,11,12.........20에서 멈추는 것이였습니다.

 

자바스크립트에 아직 그리 익숙치 않아 여러 문제 발생가능 지점을 찾아봤는데, 잘 해결이 안되었는데

 

문제는 connection.release()를 안해주고 있었습니다......바보......

 

const connection= await pool.getConnection(async (conn) => conn); 을 해줬으면 

 

밑에서 connection.release()를 반드시 해줘야 한다..

 

반납하지 않으면 connection leak현상이 발생할 수 있다.

 

릴리즈를 해줘야 이 커넥션은 pool로 돌아가서 다른 주체가 사용할 수 있도록 할 수 있다.

예전에 php를 스크립트 언어로 하여 서버를 구성했던 프로젝트가 있는데

 

 

이번에는 자바스크립트 런타임인 노드 js를 이용하여 서버를 구축하여 작업을 하고 있는데,

 

 

서버 구성의 큰 축은 같지만, 이게 혼자 알아가면서 작성하려고 하니 오류에 많이 부딛히네요

 

 

작동이 안하는 에러는 아니지만 오늘은 실행시 Unhandled promise rejection이 콘솔에 계속 떠서

 

 

알아보니 async,await에서 핸들링 처리를 하지 않은 부분이 있으면 이러한 warnig이 뜬다고 하네요.

 

 

async-await를 걸어준 곳은 try로 감싸주고 catch로 에러핸들링을 처리해줘야 한다는 것.........!!!!

 

 

async-await는 비동기 처리코드 작성이 익숙하지 않은 저 같은 사람에게 도움을 주는...... 아주 소중한....

 

 

바쁜 시기가 좀 지나가고 시간이 좀 나면 자바스크립트를 꼼꼼하게 공부해보고 싶네요......!

오늘은 적성시험을 보느라 많은 걸 하진 못했지만...^

 

요즘 문자열관련 문제를 좀 풀어보고 있는 중입니다..

 

c++ string 에서 push_back(char c) 즉 push_back은 쓸수 있지만 한글자만 넣을 때 사용가능

 

문자열을 붙일 경우 그냥 + 를 사용해서 뒤에 붙이시면 됩니다.

 

string to int --> stoi(string)

 

int to string --> to_string(int) 

 

사용

 

간단하게 정리했습니다

'학부생 공부 > C++' 카테고리의 다른 글

(21.05.21) string sort, unordered_map  (0) 2021.05.21
(21.05.20) next_permutation  (0) 2021.05.20
C++ memory [heap]  (0) 2020.12.24
C++ memory [stack]  (0) 2020.12.22
값이 [a,b]인 데이터의 개수를 반환하는 함수  (0) 2020.10.10

+ Recent posts