반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AV139KOaABgCFAYh&categoryId=AV139KOaABgCFAYh&categoryType=CODE&problemTitle=&orderBy=INQUERY_COUNT&selectCodeLang=ALL&select-1=3&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

✅ 문제 풀이
  • 상자의 높이를 입력 받은 벡터에서, 가장 큰 값은 1 줄이고, 가장 작은 값은 1 늘리는 식으로 평탄화할 수 있다.
  • 한번 덤프를 수행하고 날 때마다, 최소의 상자 높이와 최대의 상자 높이를 갖는 벡터의 위치가 달라진다.
  • 이를 쉽게 찾기 위해서 매 덤프마다 벡터를 오름차순 정렬하고 시작하기로 했다.
  • 그렇게 하면 벡터의 0번은 항상 가장 작고, 99번은 항상 가장 크기 때문이다.
  • 따라서 정렬 후, 벡터의 99번째와 0번째의 차이가 1 또는 0이라면 더이상 상자를 옮기지 않아도 되기 때문에, break문으로 덤프를 멈추도록 한다. 그렇지 않다면, 평탄화가 이루어 져야 하므로 99번째 상자는 하나 줄이고, 0번째 상자는 하나 높여준다.
  • 그럼 다음 덤프에서 다시 오름차순 정렬되고, 위의 과정을 반복하면 된다.
  • 덤프를 모두 수행하고 나서는, 최종적으로 한번더 오름차순 정렬해준 뒤, 99번째에서 0번째 값을 뺀 값을 출력하도록 하면 된다.

=> 굉장히 naive한 방법이지만, c++ 기준 시간은 10초까지 인정되므로 pass되는 코드이다.

 

✏ 코드 전문
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	for (int i = 1; i <= 10; i++) {
		int n;
		cin >> n;
		vector<int> arr(100);
		for (int j = 0; j < 100; j++) {
			cin >> arr[j];
		}
		
		int answer;
		for (int j = 0; j < n; j++) {
			sort(arr.begin(), arr.end());
			if (((arr[99] - arr[0]) == 1) || ((arr[99] - arr[0]) == 0)) {
				break;
			}
			else {
				arr[99]--;
				arr[0]++;
			}
		}
		sort(arr.begin(), arr.end());
		answer = arr[99] - arr[0];
		cout << "#" << i << " " << answer << "\n";
	}
	return 0;
}
반응형

'CO-TE > 삼성 아카데미' 카테고리의 다른 글

[DX] 1206번 C++ "view" 풀이/ 구현  (0) 2023.12.28
반응형

클라우드 환경에서 HTTP API를 통해 통신하는 것이 대부분이다.

이때, 응답 상태 코드를 통해 성공/실패 여부를 확인할 수 있으므로 API 문서를 작성할 때 꼭 알아야 할 것이 HTTP status code이다.

 

  • 10x : 정보 확인
  • 20x : 통신 성공
  • 30x : 리다이렉트
  • 40x : 클라이언트 오류
  • 50x : 서버 오류

 

200번대 : 통신 성공

상태 코드 이름 의미
200 OK 요청 성공(GET)
201 Create 생성 성공(POST)
202 Accepted 요청 접수O,
리소스 처리 X
204 No Contents 요청 성공 O,
내용 없음

 

 

300번대 : 리다이렉트

상태코드 이름 의미
300 Multiple Choice 요청 URI에 여러 리소스가 존재
301 Move Permanently 요청 URI가 새 위치로 옮겨감
304 Not Modified 요청 URI의 내용이 변경 X

 

 

400번대 : 클라이언트 오류

상태코드 이름 의미
400 Bad Request API에서 정의되지 않은 요청 들어옴
401 Unauthorized 인증 오류
403 Forbidden 권한 밖의 접근 시도
404 Not Found 요청 URI에 대한 리소스 존재 X
405 Method Not Allowed API에서 정의되지 않은 메소드 호출
406 Not Accepted 처리 불가
408 Request Timeout 요청 대기 시간 초과
409 Conflict 모순
429 Too Many Request 요청 횟수 상한 초과

 

 

500번대 : 서버 오류

상태코드 이름 의미
500 Internal Server Error 서버 내부 오류
502 Bad Gateway 게이트웨이 오류
503 Service Unavailable 서비스 이용 불가
504 Gateway Timeout 게이트웨이 시간 초과

 

 

***참고

https://gyoogle.dev/blog/web-knowledge/HTTP%20status%20code.html

반응형

'Web Application' 카테고리의 다른 글

REST API  (0) 2023.12.29
HTTP Request Methods  (0) 2023.12.23
쿠키(cookie)와 세션(session)의 차이  (1) 2023.12.22
브라우저 동작 방법  (0) 2023.12.20
[Node.js] Node.js와 Javascript의 개념  (0) 2023.09.13
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AV134DPqAA8CFAYh&categoryId=AV134DPqAA8CFAYh&categoryType=CODE&problemTitle=&orderBy=INQUERY_COUNT&selectCodeLang=ALL&select-1=3&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

난이도 D3 ⭐⭐⭐

 

✅ 문제 풀이
  • 처음 두 건물과, 마지막 두 건물은 항상 높이가 0이다.
  • 따라서 세번째 건물부터 기준으로하여, 앞에 두 건물과 뒤에 두 건물 보다 큰지 확인한다.
  • 앞 뒤로 총 4개의 건물보다 크다면, 기준이 되는 현재 건물의 높이에서 4개 건물 중 가장 큰 건물의 높이를 뺀 값이 뷰를 확보할 수 있는 세대 수가 된다.
  • 이를 모든 건물에 대해서 반복하며 세대 수를 누적해가면, 각 테스트케이스의 답이 된다.

 

 

✏ 코드 전문
#include<iostream>
#include<vector>
#include<algorithm>
 
using namespace std;
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    //freopen("input.txt", "r", stdin);
    for (int i = 1; i <= 10; i++) {
        int n;
        cin >> n;
        vector<int> arr;
        for (int j = 0; j < n; j++) {
            int temp;
            cin >> temp;
            arr.push_back(temp);
        }
 
        int count = 0;
        for (int j = 2; j < n-2; j++) {
            int cent = arr[j];
            if (arr[j - 2] < cent && arr[j - 1] < cent && arr[j + 1] < cent && arr[j + 2] < cent) {
                int m1 = max(arr[j - 2], arr[j - 1]);
                int m2 = max(arr[j + 1], arr[j + 2]);
                count += cent - (max(m1, m2));
            }
        }
 
        cout << "#" << i << " " << count << "\n";
    }
    return 0;
}
반응형

'CO-TE > 삼성 아카데미' 카테고리의 다른 글

[DX] 1208번 C++ "Flatten" 풀이 / 정렬, 구현  (0) 2023.12.29
반응형

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

 

1764번: 듣보잡

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.

www.acmicpc.net

 

 

 

💡 듣보잡
김진영이 듣도 못한 사람의 명단과, 보도 못한 사람의 명단이 주어질 때, 듣도 보도 못한 사람의 명단을 구하는 프로그램을 작성하시오.

[입력]
첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. 이름은 띄어쓰기 없이 알파벳 소문자로만 이루어지며, 그 길이는 20 이하이다. N, M은 500,000 이하의 자연수이다.듣도 못한 사람의 명단에는 중복되는 이름이 없으며, 보도 못한 사람의 명단도 마찬가지이다.

[출력]
듣보잡의 수와 그 명단을 사전순으로 출력한다.

 

 

 

✅ 문제 풀이
  • set 자료구조에 입력받은 이름들을 저장할건데, 듣도 못한 사람들을 입력받고 저장해둔다.
  • 그리고 보도 못한 사람들을 입력받을 때마다, set의 find함수를 사용해서, 보도 못한 사람이 있는지 확인하고, 있으면 vector에 저장한다.
  • 마지막에 vector의 크기를 출력하고, 사람을 사전 순으로 출력해야 하므로 sort함수를 통해 오름차순 정렬한다.
  • 그리고 정렬된 vector의 내용을 모두 출력한다.

 

 

✏ 코드 전문
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<algorithm>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n, m;
	cin >> n >> m;

	set<string> arr;
	for (int i = 0; i < n; i++) {
		string str;
		cin >> str;
		arr.insert(str);
	}

	vector<string> answer;

	for (int i = 0; i < m; i++) {
		string str;
		cin >> str;
		
		auto it = arr.find(str);
		if (it != arr.end()) answer.push_back(str);
	}

	cout << answer.size() << "\n";
	
	sort(answer.begin(), answer.end());

	for (int i = 0; i < answer.size(); i++) {
		cout << answer[i] << "\n";
	}

	return 0;
}
반응형
반응형
HTTP Request Methods란?
클라이언트가 웹서버에게 요청하는 목적 및 그 종류를 알리는 수단을 말한다.

 

 

  1. GET
    URL(URI) 형식으로 서버 측에 리소스를 요청한다.
    리소스(데이터)를 받기 위함
  2. HEAD
    GET과 유사하지만, HEAD는 실제 문서 요청이 아닌 문서에 대한 정보 요청이다.
    즉, Response 메세지를 받았을 때, Body는 비어있고, Header 정보만 들어있다.
    메세지 헤더 정보를 받기 위함

  3. POST
    클라이언트에서 서버로 어떤 정보를 제출하기 위해 사용한다.
    Request 데이터를 HTTP Body에 담아 웹 서버로 전송한다.
    내용 및 파일 전송을 하기 위함

  4. PUT
    POST와 유사하나, 기존 데이터를 갱신할 때 사용한다.
    리소스(데이터)를 갱신하기 위함

  5. DELETE
    웹 서버측에 요청한 리소스를 삭제할 때 사용한다.
    (실제로 클라이언트에서 서버 자원을 삭제하도록 하진 않아 비활성화로 구성한다.)
    리소스(데이터)를 삭제하기 위함

  6. CONNECT
    보통 Proxy를 통해 SSL 통신을 하고자할 때 사용한다.
    클라이언트와 서버 사이의 중간 경유를 위함

  7. OPTIONS
    웹 서버 측에서 지원하고 있는 메소드가 무엇인지 알기 위해 사용한다.
    서버 측 제공 메소드에 대한 질의를 하기 위함

  8. TRACE
    웹 서버로부터 받은 내용을 확인하기 위해 loop-back 테스트를 할 때 사용한다.
    Request 리소스가 수신되는 경로를 보기 위함

  9. PATCH
    PUT과 유사하나, 모든 데이터를 갱신하는 것이 아닌 리소스의 일부분만 수정할 때 쓰인다.
    리소스(데이터)의 일부분만 갱신하기 위함

 

***참고
https://gyoogle.dev/blog/web-knowledge/HTTP%20Request%20Methods.html

반응형

'Web Application' 카테고리의 다른 글

REST API  (0) 2023.12.29
HTTP status code (HTTP 상태 코드)  (0) 2023.12.28
쿠키(cookie)와 세션(session)의 차이  (1) 2023.12.22
브라우저 동작 방법  (0) 2023.12.20
[Node.js] Node.js와 Javascript의 개념  (0) 2023.09.13
반응형
쿠키
  • 저장 위치 
    클라이언트의 웹 브라우저가 지정하는 메모리 or 하드디스크
    (브라우저 : 크롬, 네이버웨일, edge 등과 같은 것)
  • 만료 시점
    저장할 때 expires 속성을 정의해 무효화시키면 삭제될 날짜를 정할 수 있음
  • 리소스
    클라인언트에 저장되고 클라이언트의 메모리를 사용하기 때문에 서버 자원을 사용하지 않음
  • 용량 제한
    클라이언트도 모르게 접속되는 사이트에 의하여 설정될 수 있기 때문에 쿠키로 인해 문제가 발생하는 것을 막고자 한 도메인당 20개, 하나의 쿠키 당 4KB로 제한해 둠
    1. 사용자가 웹사이트에 처음 방문하면 서버에서 클라이언트에게 쿠키(고유한 식별자)를 생성하고 전송함.
    2. 클라이언트는 받은 쿠키를 브라우저에 저장함.
    3. 이후 사용자가 같은 웹사이트를 방문할 때, 브라우저는 저장된 쿠키를 함께 서버로 전송함.
  • 예를 들어, 어떤 웹 페이지에 방문하여 로그인을 한 뒤, 동일한 웹 페이지를 방문하였을 때 로그인 상태가 유지되어 있는 이유는 브라우저가 처음에 저장한 쿠키를 두번째 방문 때 서버로 주었기 때문임! 이때 서버는 고유한 식별자로서 구분하고 이전에 로그인한 사용자임을 알아챌 수 있음!
세션
  • 저장위치
    서버의 메모리에 저장
  • 만료 시점
    클라이언트가 로그아웃하거나, 설정 시간동안 반응이 없으면 무효화 되기 때문에 정확한 시점을 알 수 없음
  • 리소스
    세션은 서버에 저장되고, 서버 메모리로 로딩 되기 때문에 세션이 생길 때마다 리소스를 차지함
  • 용량 제한
    클라이언트가 접속하면 서버에 의해 생성되므로 개수나 용량 제한이 없음
  • 세션은 서버 측에서 상태를 유지하기 위한 메커니즘임.
  • 각 세션은 고유한 식별자(session ID)로 구분되며, 이 식별자를 통해 서버는 사용자를 식별하고 해당 세션과 연결된 데이터를 유지함.
    1. 사용자가 웹사이트에 접속하면 서버는 고유한 세션 ID를 생성하고 클라이언트에게 전송함.
    2. 클라이언트는 이 세션 ID를 쿠키 또는 URL 매개변수 등을 통해 저장함.
    3. 사용자의 요청이 서버에 도달하면, 서버는 세션 ID를 사용하여 해당 세션과 연결된 데이터에 접근함.
  • 예를 들어, 클라이언트가 서버에 요청을 보낼 때, 서버는 세션 ID를 사용하여 해당 세션에 저장된 정보를 가져와 로그인 상태를 확인합니다. 따라서 로그인 정보나 장바구니 같은 경우의 정보를 불러온다.

 

쿠키와 세션을 이용한 로그인 메커니즘

사용자가 로그인한 후에는 브라우저가 쿠키를 저장하고, 이후에 해당 웹 페이지를 방문할 때 브라우저가 저장한 쿠키를 함께 서버로 전송하여 서버는 사용자를 식별하고 세션을 통해 로그인 상태를 유지한다.

  1. 로그인 요청: 사용자가 로그인 페이지에서 로그인 정보(일반적으로 사용자명과 암호)를 입력하면, 서버는 이 정보를 받아 인증을 진행한다.
  2. 쿠키 및 세션 생성: 인증이 성공하면 서버는 클라이언트(브라우저)에게 고유한 식별자인 쿠키를 생성하고 응답으로 전송합니다. 이 쿠키는 클라이언트 측에서 저장되어 나중에 사용자를 식별하는 데 사용된다. 또한, 서버는 사용자와 관련된 정보를 저장하고 세션 ID를 생성하여 이를 클라이언트에게 전송한다.
  3. 쿠키 저장: 클라이언트(브라우저)는 받은 쿠키를 저장한다. 일반적으로 쿠키는 브라우저의 쿠키 저장소에 저장된다.
  4. 이후 요청에서 쿠키 전송: 사용자가 이후에 해당 웹 페이지나 다른 페이지를 요청할 때, 브라우저는 저장한 쿠키를 요청과 함께 서버로 전송한다.
  5. 서버에서 로그인 상태 확인: 서버는 받은 쿠키를 확인하여 해당 사용자를 식별하고, 세션을 통해 사용자의 로그인 상태를 확인한다.

이러한 과정을 통해 사용자는 로그인 후에도 쿠키와 세션을 통해 로그인 상태를 유지하게 된다.

이는 사용자 경험을 향상시키고, 로그인 정보를 보안적으로 관리하기 위한 일반적인 방법 중 하나이다.

 

  Cookie Session
저장 위치 client server
저장 형식 text object
만료 시점 쿠키 저장시 설정 (설정 없으면 브라우저 종료 시) 정확한 시점 모름
리소스 클라이언트의 리소스 서버의 리소스
용량제한 한 도메인 당 20개, 한 쿠키당 4KB 제한없음

 

*** Gyoogle 님 블로그를 참고하였습니다.
반응형

'Web Application' 카테고리의 다른 글

REST API  (0) 2023.12.29
HTTP status code (HTTP 상태 코드)  (0) 2023.12.28
HTTP Request Methods  (0) 2023.12.23
브라우저 동작 방법  (0) 2023.12.20
[Node.js] Node.js와 Javascript의 개념  (0) 2023.09.13

+ Recent posts