링크 : 2512번: 예산 (acmicpc.net)

 

2512번: 예산

첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상

www.acmicpc.net

코드 :

import sys
input = sys.stdin.readline
N = int(input())
member = list(map(int, input().split()))
total_money = int(input())
start = 0
end = max(member)

mid = 0
mid_val = 0

while (start <= end):
    mid = int((start + end) / 2)
    sum = 0
    for i in range(0, len(member)):
        sum += min(member[i], mid)

    if (sum > total_money):
        end = mid - 1
    else:
        start = mid + 1
        mid_val = max(mid_val, mid)
        #print(mid_val)

print(mid_val)

 

  1. 상한선을 잘 선택해야 풀 수 있는 문제였습니다.
  2. 상한선 선택은 이진탐색으로 진행합니다.
  3. 상한선을 선택했다면 min 함수를 이용해 지방에게 줄 돈을 선정합니다.
  4. 만일 상한선보다 작은 요청금액이라면 요청금액대로 줄 것이고, 상한선보다 큰 요청금액이라면 상한선만큼 줍니다. 이 때 내어준 총 금액은 sum 변수에 저장합니다.
  5. sum 변수가 줄 수 있는 금액보다 크다면 배제합니다.
  6. sum 변수가 줄 수 있는 금액보다 크거나 작다면 해당 상한선을 저장하고, 이 상한선보다 더 큰 상한선이 있는지 mid를 조정하며 찾습니다.

'문제풀이 > 백준' 카테고리의 다른 글

2116 - 주사위 쌓기  (0) 2023.06.01
12904 - A와 B  (0) 2023.05.21
15654 - N과 M (5)  (0) 2023.01.23
2529 - 부등호  (0) 2023.01.17
2636 - 치즈  (0) 2023.01.12

문제 :

2116번: 주사위 쌓기 (acmicpc.net)

 

2116번: 주사위 쌓기

첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는

www.acmicpc.net

#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define MAX_SQUARE_MAX_CNT (10000 + 1)
#define dice_kind_cnt      (6 + 1)
vector<uint32_t>         square_vec[MAX_SQUARE_MAX_CNT];
uint32_t                 square_cnt;
uint32_t                 max_ans                         = 0;
uint32_t                 maxNum_arry[MAX_SQUARE_MAX_CNT] = {0};
uint32_t                 compatible[6 + 1]               = {0};

void Run(const uint32_t under_num, const uint32_t curr_layer,
              uint32_t sum) {
    if (curr_layer > square_cnt) {
        if (max_ans < sum) {
            max_ans = sum;
        }

        return;
    }

    uint32_t upper_num     = 0;
    for (int i = 1; i <= 6; i++) {
        if (square_vec[curr_layer][i] == under_num) {
            upper_num = square_vec[curr_layer][compatible[i]];
            break;
        }
    }

    int nowmax = 6;
    while (true) { // 지금 행에서 옆면최대값 찾는 과정
        if (nowmax != upper_num && nowmax != under_num)
            break;
        else
            nowmax--;
    }

    Run(upper_num, curr_layer + 1,
        sum + nowmax);
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> square_cnt;
    for (size_t i = 1; i <= square_cnt; ++i) {
        square_vec[i].resize(7);
        for (uint32_t j = 1; j <= 6; j++) {
            uint32_t temp;
            cin >> square_vec[i][j];
        }
    }

    compatible[1] = 6, compatible[6] = 1;
    compatible[2] = 4, compatible[4] = 2;
    compatible[3] = 5, compatible[5] = 3;

    // 어느면이 윗면인지 고려되있지 않음.
    for (size_t i = 1; i <= 6; i++) {
        Run(square_vec[1][i], 1, 0);
    }

	cout << max_ans << '\n';

    return 0;
}

초등학생 수준의 문제라니.... 예제는 맞았지만, 정답은 아니었어서 아래 링크의 코드를 참고했습니다. 제 아이디어와 동일했지만, 제 코드는 답이 아니었어서... ㅜ

백준2116-주사위쌓기 java (tistory.com)

문제를 정확히 이해하지 못해, 처음엔 아예 틀린 방법으로 접근했었네요. 그래서 정답이 계속 30이 나왔었지만, 힌트를 보고 그게 아닌것을 알았습니다.

아랫면의 숫자와 매칭되는 숫자가 다음 층의 주사위의 아랫면이 된다는 것을 유념하시면 됩니다.

'문제풀이 > 백준' 카테고리의 다른 글

2512 - 예산  (0) 2023.09.02
12904 - A와 B  (0) 2023.05.21
15654 - N과 M (5)  (0) 2023.01.23
2529 - 부등호  (0) 2023.01.17
2636 - 치즈  (0) 2023.01.12

 

import sys

MAX = 1000
def main():
    T = int(input())
    while (T > 0) :
        T = T - 1
        start_x, start_y, end_x, end_y = map(int, input().split())
        in_out_cnt = 0
        planet_cnt = int(input())
        for i in range(0, planet_cnt) :
            planet_x, planet_y, radius = map(int, input().split())
            if ((start_x - planet_x) * (start_x - planet_x) + (start_y - planet_y) * (start_y - planet_y) < radius * radius):
                if ((end_x - planet_x) * (end_x - planet_x) + (end_y - planet_y) * (end_y - planet_y) > radius * radius):
                    in_out_cnt = in_out_cnt + 1
                    continue

            if ((end_x - planet_x) * (end_x - planet_x) + (end_y - planet_y) * (end_y - planet_y) < radius * radius):
                if ((start_x - planet_x) * (start_x - planet_x) + (start_y - planet_y) * (start_y - planet_y) > radius * radius):
                    in_out_cnt = in_out_cnt + 1
                    continue

        print(in_out_cnt)

main()

1004번: 어린 왕자 (acmicpc.net)

 

1004번: 어린 왕자

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주

www.acmicpc.net

  1. 문제의 설명은 장황했지만, 결국 시작지점과 종료지점이 각각 몇개의 원 안에 있는지 물어보는 문제였습니다.
  2. 각각 몇개의 원안에 있는지 수학 공식을 이용해서 풀 수 있었습니다.
  3. 다만, 시작지점과 종료지점이 같은 원 안에 있음을 주의해서 풀이해야 합니다.
import sys

def run():
    src_str = input()
    dst_str = input()

    for i in range(0, len(dst_str)):
        if (src_str == dst_str):
            print(1)
            return
        
        if dst_str[len(dst_str) - 1]   ==  'A':
            dst_str = dst_str[0:len(dst_str) - 1]
        else:
            dst_str = dst_str[0:len(dst_str) - 1]
            dst_str = dst_str[::-1]

    print(0)

run()

문제 :

12904번: A와 B (acmicpc.net)

 

12904번: A와 B

수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수

www.acmicpc.net

 

  1. src 스트링에서 dst 스트링으로 바꿀 수 있는지 확인하는 문제였습니다.
  2. src 스트링에서 dst 스트링으로 바꾸려고하면 많은 경우의 수 때문에 시간 초과가 발생하게 됩니다.
  3. 따라서 dst 스트링에서 src으로 바꿀 수 있는지를 확인합니다.
  4. dst 스트링에서 src 스트링으로 바꾸더라도, 결국 src에서 dst로 바꾸는거와 다르지 않냐라고 생각할 수 있습니다.
  5. 하지만 dst에서 src로 바꾸는것은 dst에서 src로 바꿀 수 있다는 전제를 두고 진행합니다.
  6. 따라서 1번 2번 연산을 거꾸로 해주기만 하면 됩니다.
  7. ABBA의 경우입니다.
    • 끝이 A이기 때문에 A를 삭제합니다. -> ABB
    • 끝이 B이기 때문에 B를 삭제하고 순서를 뒤집습니다. -> AB -> BA
    • 끝이 A이기 때문에 A를 삭제합니다. -> B
  8. B가 나왔습니다.
  9. 위와 같이 진행해서 dst에서 src로 변환 안되면 0을 출력 그렇지않다면 1을 출력합니다.

'문제풀이 > 백준' 카테고리의 다른 글

2512 - 예산  (0) 2023.09.02
2116 - 주사위 쌓기  (0) 2023.06.01
15654 - N과 M (5)  (0) 2023.01.23
2529 - 부등호  (0) 2023.01.17
2636 - 치즈  (0) 2023.01.12
  • 우선 아래 내용을 인지해야 한다.
    1. IPsec
    2. IKE 프로토콜
  • IPsec
    • OSI 7 계층 중 주소 계층에서 사용되는 Protocol suite이다.
    • 인터넷 통신에 보안 기능을 제공한다.
    • IPsec은 보통 VPN 기능을 구현하기 위해 많이 사용된다.
  • IKE 프로토콜
    • Internet Key Exchange의 준말이다.
    • IKEv1 과 IKEv2가 있다.
    • IKE는 프로토콜이며, IPsec의 Security Association (SA)를 셋업하기 위해 사용된다.
  • IKE 프로토콜의 2단계
    • IKE 단계는 크게 2가지이다.
    • 1단계 : ISAKMP SA를 형성하기 위한 단계
      • Phase Level
        • Phase 1
        • Phase 2
      • Mode kind
        • Main mode
        • Aggresive mode
    • 2단계 : IPsec SA를 형성하기 위한 단계
      • Mode kind
        • 빠른 모드
  • ISAKMP SA Main mode
    • IKE 세션이 Initiator가 Responder에게 제안 또는 제안서 (prosposal)을 보낼 때 시작된다.
    • 첫번째 교환은 Peer간 기본 보안 정책을 설정한다. Initiator는 설정한 Proposal을 Responder에게 전송.
    • 두번째 교환은 공개 키와 기타 데이터를 전달. (Diffie-Hellman 알고리즘으로 Derived된)
    • 세번째 교환은 ISAKMP 세션을 인증한다.
    • IKE SA가 설정되면, IPsec협상이 시작된다.
  • IKE 프로토콜 도식
  • Description
    • Hasing : 해싱 알고리즘을 integrity를 검증하기 위해 사용한다. MD5 or SHA
    • Authentication : 각각의 peer는 자신이 누구인지를 증명해야한다. 두개의 자주 사용되는 옵션은 preshared key 또는 digital cert이다.
    • DH group : DH group은 결정한다. 키의 strengt를. 이 키는 키 교환 처리 과정에서 쓰인다.
    • Lifetime : IKE phase 1 tunnel이 얼마 동안 유지될까에 대한 정보
    • Encrytion : 암호화를 위해 우리가 무슨 알고리즘을 사용할까에 대한 정보. 예시로, DES, 3DES or AES
  • IKE 프로토콜 - Main mode 1
    • Initator는 첫번째 메시지를 보낸다. 이것은 SA를 위한 Proposal이다.
    • 다음과 같은 정보를 확인할 수 있다.
      • Initator IP와 Port, Responder의 IP와 Port
      • Iniator SPI(Security Parameter Index)
      • IKE version, mode
      • dmain of interpretation, proposal num
      • transform payload
  • IKE 프로토콜 - Main mode2
    • Responder가 보낸 첫번째 메시지에 대한 응답 메시지.
    • 이 메시지는 Responder가 Initator로부터 받은 attributes(transform payload에 있던)에 대해 agree했다는 의미이다.
    • Responder의 SPI value도 확인 가능하다.
  • IKE 프로토콜 - Main mode2
    • 우리의 목적은 peer들이 앞으로 사용할 SA에 대해 동의하는 것이다. 이를 위해 initator는 DH key 교환을 시작한다. 사진과 같이 key change와 nonce가 담겨있는 payload를 확인할 수 있다.
  • IKE 프로토콜 - Main mode 4
    • Responder 또한 자신의 DH nonce를 전송한다.
    • 이제 두 peer는 DH shared key를 계산한다.
  • IKE 프로토콜 - Main mode 5
    • 지금부터의 마지막 2개의 메시지는 암호화된다. 그래서 더 이상 컨텐츠를 확인할 수 없다. 이 두 개의 메시지는 식별과 인증을 위해 사용된다. Initiator가 먼저 시작한다.
  • IKE 프로토콜 - Main mode 6
  • 이로써, Main mode는 종료된다.


IKEv[n] 프로토콜.pptx
1.30MB

'컴퓨터 공부 > 네트워크' 카테고리의 다른 글

IPv6와 IPv4 프로토콜의 이해  (0) 2021.12.23

https://learnopengl.com/Introduction

 

LearnOpenGL - Introduction

Introduction Introduction Since you came here you probably want to learn the inner workings of computer graphics and do all the stuff the cool kids do by yourself. Doing things by yourself is extremely fun and resourceful and gives you a great understandin

learnopengl.com

Introduction

당신이 여기 온 이후로, 당신이 아마 컴퓨터 그래픽스의 내부 동작을 배우기 위함일 것입니다. 그리고 멋진 아이들이 스스로 하는것을 모든것을 당신 스스로 하고싶어할 것입니다.

Prerequisities

OpenGL은 그래픽스 api이지 그것 자체로 플랫폼인 것은 아니기 때문에, OpenGL은 작동하기 위한 언어를 필요로 하고 그 선택은 C++입니다. 그러므로 c++ 프로그래밍 지식은 요구됩니다. 하지만 나는 설명하기 위해 노력할 것입니다. 사용되는 대부분의 컨셉들, advanced된 c++ 토픽들. 그렇다고 c++ 전문가가 되기를 요구하지는 않습니다. 그러나 당신은 "Hello World"를 출력하는 것 이상을 알야아 합니다. 당신이 c++에 대한 경험이 많이 없다면 난 아래 링크를 추천합니다.

 

http://www.learncpp.com/

 

Learn C++ – Skill up with our free tutorials

LearnCpp.com is a free website devoted to teaching you how to program in C++. Whether you’ve had any prior programming experience or not, the tutorials on this site will walk you through all the steps to write, compile, and debug your C++ programs, all w

www.learncpp.com

또한 우리는 몇몇 수학(linear algebra, geometry, and trigonometry)을 사용할 예정이고 나는 필요로 하는 수학의 요구되는 개념 모두를 설명하기 위해 노력할 것입니다. 하지만 난 수학자가 아닙니다. 내 설명이 이해하기 쉽더라도. 그렇기에 나의 설명이 불완전할 수 있습니다. 그래서 필요로 하는 곳에는 내가 좋은 resource를 제공할 것입니다.

필요로 하는 수학적 지식에 대해 겁먹지 마세요. OpenGL로의 여행을 시작하기도 전에.

대부분의 수학적 지식 개념은 기본 수학 배경만 가지고 있다면 이해할 수 있고 나는 수학이 최소한이 될 수 있게끔 노력할 것입니다.

심지어, 대부분의 기능은 당신이 모든 수학을 이해하라고 요구하지도 않아요. 당신이 그것을 어떻게 사용하는지 알고 있다면요.

Structure

LearnOpenGL은 많은 섹션으로 나뉩니다. 각각의 세션은 몇몇 챕터를 포함하고 있습니다. 이 챕터는 각각 다른 개념을 자세히 (in large detail)설명합니다. 각각의 챕터는 왼쪽 메뉴에서 확인할 수 있습니다. 그 개념들은 순차적으로 설명될 것입니다. 각각의 챕터는 배경지식 이론과 실전적 관점을 설명합니다.

개념들이 더 쉽게 따라올 수 있게 만들기 위해 그리고 그들에게 몇몇의 추가적인 스트럭쳐를 주기 위해 , 그 책은 boxes, code blocks, color hints 그리고 function refrerences를 포함합니다.

green boxes는 몇몇 노트들과 유용한 특성, 힌트(OpenGL에 대한 또는 subject에 대한) 포함합니다.

red boxes는 경고 또는 다른 특성 (매우 주의해야하는)을 포함합니다.

'그래픽스 > OpenGL' 카테고리의 다른 글

LearnOpenGL 번역  (0) 2023.01.23
삼각형 그리기  (0) 2023.01.06
OpenGL glVertex2f()  (0) 2022.07.27
파이썬 opengl 패키지 설치  (0) 2022.07.12

그래픽스 공부를 위해, 목표를 위와 같은 도전을 하기로 했습니다. 홍정모 교수님의 강의와 병행하며 번역 작업을 해볼 생각입니다.

위를 진행함으로써 아래 사항을 성취할 생각입니다.

  • 영어 학습
  • OpenGL 학습

충분히 해볼만한 도전이라고 생각합니다.

https://learnopengl.com/Introduction

 

LearnOpenGL - Introduction

Introduction Introduction Since you came here you probably want to learn the inner workings of computer graphics and do all the stuff the cool kids do by yourself. Doing things by yourself is extremely fun and resourceful and gives you a great understandin

learnopengl.com

 

한 편으론, 게으른 제가 할 수 있을까 생각이 들기도 하지만 적어도 4월달안에는 끝내보고 싶네요 ㅎㅎ

그래도 이런저런 핑계대면 안되니깐.... 해봐야겠네요!

'그래픽스 > OpenGL' 카테고리의 다른 글

LearnOpenGL - Introduction  (0) 2023.01.23
삼각형 그리기  (0) 2023.01.06
OpenGL glVertex2f()  (0) 2022.07.27
파이썬 opengl 패키지 설치  (0) 2022.07.12

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

 

15654번: N과 M (5)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int N, M;
vector<int> my_vector;
bool visited[10000 + 1];
int ans[10000 + 1];

void Run(const int start_idx, const int depth)
{
	if (visited[start_idx]) {
		return;
	}

	visited[start_idx] = true;
	ans[depth] = my_vector[start_idx];
	if (depth == M - 1) {
		for (int i = 0; i < M; i++) {
			cout << ans[i] << ' ';
		}

		cout << '\n';
		visited[start_idx] = false;
		return;
	}
	
	for (int i = 1; i < my_vector.size(); i++) {
		Run(i, depth + 1);
	}
	visited[start_idx] = false;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> N >> M;
	my_vector.resize(N + 1);
	for (int i = 1; i <= N; i++) {
		cin >> my_vector[i];
	}

	sort(my_vector.begin(), my_vector.end());

	if (M == 1) {
		for (int i = 1; i <= N; i++) {
			cout << my_vector[i] << '\n';
		}

		return 0;
	}

	for (int i = 1; i <= N; i++) {
		Run(i, 0);
	}
}
  1. 재귀함수를 이용하여 풀 수 있는 문제였습니다.
  2. 지금 코드의 경우는 main 함수에서 Run을 N번 실행합니다.
  3. 하지만 이런 방식 말고, main 함수에서 Run 함수를 한 번만 실행하고 Run 내에서 여러번 호출하는 방식으로 코딩을 고쳐봐야 할 것 같습니다.

'문제풀이 > 백준' 카테고리의 다른 글

2116 - 주사위 쌓기  (0) 2023.06.01
12904 - A와 B  (0) 2023.05.21
2529 - 부등호  (0) 2023.01.17
2636 - 치즈  (0) 2023.01.12
2661 - 좋은 수열  (0) 2023.01.08

+ Recent posts