CS 지식 16

SSL 작동 방식 및 필요성 이해하기

SSL 보안의 필요성'공개키 암호화 방식 이해하기'에서 알아보았듯이, 인터넷을 통해 전달되는 모든 정보는 다른 컴퓨터가 읽을 수 있다. (이제부터 도청이라고 부르겠다) 따라서 아무도 읽지 못하도록 암호화하는 것이 중요했다. 그런데 중요한 정보를 훔치는 데에는 도청 말고도 수많은 방법이 있다. 한가지 방법은 정상 서버에 가짜 유저가 요청을 보내는 것이다. 이것은 서버측에서 사용자 인증을 강화해서 해결할 수 있다.또 다른 방법은 가짜 서버를 만들어서 정상 유저가 입력하는 모든 정보를 갈취하는 것이다. 입력하는 정보가 아무리 암호화되어있다고 해도, 가짜 서버에서 복호화 될 수 있는 형태라면 결국 그 정보는 도난 당하게 된다.따라서 요청을 보낼 곳이 내가 접속하고싶은 서버가 맞는지 확인하는 과정이 아주 중요하다..

CS 지식 2024.12.13

공개키 암호화 방식 이해하기

HTTPS 암호화에도 활용되는 공개키 방식(aka 비대칭키 방식) 암호화란 무엇일까?그리고 애초에 왜 암호화는 왜 필요한걸까? 이 두가지 이유에 대해 알아보자. 암호화의 필요성인터넷은 정보를 목적지로 보내기 위해서 그 사이에 있는 다른 컴퓨터를 반드시 거치게 된다. 그리고 전달하는 내용은 그 경로에 해당하는 모든 컴퓨터가 다 볼 수 있다. 애초에 인터넷은 군사 목적으로 개발 되었기 때문에 해당 네트워크에 악의적인 사용자가 한명도 없다는 가정을 하고 개발되었다.따라서 여러 컴퓨터에 거쳐 패킷을 전달해서, 확장에 유리한 구조를 만드는 것을 반대할 이유가 없었다. 누군가 내가 보낸 내용을 읽더라도, 다 우리 군대 소속이니까 상관이 없었기 때문이다.하지만 인터넷이 대중에게 공개되면서, 통신 내용을 타인이 읽을 ..

CS 지식 2024.12.12

99클럽 코테 스터디 15일차 TIL | 백준 미로만들기 풀이, 최소비용과 BFS

문제 바로가기 : https://www.acmicpc.net/problem/2665 그림과 같은 N x N 미로가 있다. 빈방은 흰색(1), 벽은 검은색(0)이다.(0, 0)에서 시작해서 (n-1, n-1)로 가기 위해 최소 몇개의 벽을 뚫어야하는지 구하는 문제이다.한 변의 길이 N은 1 이상 50이하이고, 실행 제한시간은 1초이다.  처음에는 모든 경우의 수를 모두 돌아보되, 가능성이 없는 경로는 빠르게 쳐내기 위해 DFS로 빠르게 최소비용을 구하고자했었다.쓸데없이 경로를 꼭 알아야한다고 생각을 했던것...그렇지만 우리 문제는 어떤 경로를 사용했는지가 중요한 문제가 아니라서, BFS로 미로를 돌며 (0, 0)에서 임의의 (x, y)로 가려면 얼마의 비용이 드는지 구하는 것으로 방향을 틀었다. 전체 구현..

99클럽 코테 스터디 11일차 TIL | Python 고차함수는 iterator를 반환한다

함수형 프로그래밍을 공부하다보면 map, filter, reduce, foreach 등을 사용하여 의도가 명확하게 드러나도록 코드를 작성하는 시도를 하게된다. 파이썬에도 이러한 접근을 돕기위한 빌트인 라이브러리가 존재한다. 그런데 반환값이 특이하다.map(변환람다, 원본리스트) # 람다를 적용한 변환 결과를 map 형태로 반환filter(변환람다, 원본리스트) # 람다 결과가 True인 것만 뽑아서 filter 형태로 반환zip(키배열, 밸류배열) # 튜플 iterator 반환 map, filter를 반환한다는 부분이 이해가 안될 수 있는데, 정말 반환 결과의 타입을 출력해보면 각각 map과 filter로 나온다.  그리고 아래처럼 map은 두번 사용할 수가 없다.def divide_arr(): i..

99클럽 코테 스터디 10일차 TIL | 백준 1253. 좋다 반례 (Python)

문제 링크 : 백준 1253. 좋다  /  정답 코드 바로가기  주어진 N개의 수 중에서 '좋은수'를 찾아야한다.좋은수란 다른 두 수의 합으로 나타낼 수 있는 수를 의미한다.값이 같아도 숫자의 위치가 다르면 다른 수로 취급한다. [1, 1, 2, 2, 2]예를 들어 위 케이스에서, 각 2는 모두 다른 수이므로 결과는 3이 되어야한다. 숫자 배열의 길이는 1 ~ 2,000 이며, 각 수의 범위는 -1,000,000,000 ~ 1,000,000,000 이다. 예시 케이스Case 1 ) input : [-1, 0, 1] / output : 1 -1 은 좋은 수가 아니다. -1을 제외한 [0, 1] 로는 -1을 만들 수 없다.0 은 좋은수이다. (-1) + (1) 을 더해서 만들 수 있다.1 은 좋은 수가 아니..

99클럽 코테 스터디 9일차 TIL | 다단계 칫솔 판매 반례 (Python)

문제 링크 : 프로그래머스 다단계 칫솔 판매 항상 자신의 추천인에게 판매 대금의 10%를 떼줘야하는 다단계 기업이 있다.10% 수수료 계산시 소수점을 버림하는 규칙이 있다.아래와 같은 4개의 배열이 주어질 때, 주어진 각 멤버의 수익을 계산해서 배열로 반환해야한다.빠르게 부모 노드를 찾을 수 있는 자료구조를 고안하는것과, 반례를 찾는것이 중요한 문제였다. 예시 케이스조직도가 [ 사장 - A - B - C ] 형태일 때, 인풋은 아래와 같이 주어진다. 조직도는 아래 형태로 주어지고 [0][1][2]enroll (멤버이름)ABCreferral (추천인)- (사장은 "-" 로 표시한다.)AB 칫솔 판매 실적은 아래처럼 주어진다. 칫솔은 하나에 100원으로 고정이다. [0][1][2]seller (판매 담당자)..

[백준 14712] 넴모넴모 (Easy) Python 솔루션

문제 링크 : https://www.acmicpc.net/problem/14712 N x M 격자 안에 네모를 배열하되, 2 X 2 정사각형 모양이 없도록 하는 경우의 수를 구하는 문제이다.예를 들면 격자가 2 X 3 이라고 할 때 세어야하는 경우와 아닌 경우는 아래와 같다.  행의 개수 N, 열의 개수는 M으로 주어지고, 시간제한은 1초이다. (1 ≤ N, M ≤ 25, 1 ≤ N × M ≤ 25) 아무리 생각해도 모든 경우의 수를 만들어낸 후, 네모가 있는지 검사하는 것이 가장 확실하다는 생각이 들었는데, 이중 list를 사용하면 시간도 메모리도 초과할 것이 뻔했다. 게다가 이러면 네모 유무를 확인하는것도 어려웠다. 각 경우의 수를 검사하는 방식을 엄청나게 최적화 해야 최대 2 ^ 25 가지 경우의..

[백준 12015] LIS O(n log n) 알고리즘

문제 링크 : https://www.acmicpc.net/problem/12015 LIS는 최장 증가 부분 수열을 의미한다. 주어진 수열에서 숫자를 몇개 빼서 가장 긴 증가 수열을 만드는 것이 규칙이다. [0, 1, 2, 0, 5, 4]에 대해서 LIS를 찾는다고 하면, [0, 1, 2, 5] 또는 [0, 1, 2, 4]가 답이다. 부분 수열이 인덱스 i에서 끝날 때 LIS 수열의 길이를 lis[i]라고 할 때, 여기에 dp를 적용하면 O(N^2) 해법을 쉽게 떠올릴 수 있다.def dp(arr): N = len(arr) lis = [1] * N for i in range(N): # 0부터 i까지 구간에서 부분수열의 최대 길이를 구한다. for k in range(i): ..

Python은 진짜 느릴까? : Python, C++, JS 실행시간 비교

코딩 테스트를 풀 때 필요에 따라 Kotlin, Python, JS를 번갈아가면서 써봤지만, 머리속 생각을 바로 코드로 옮기는 데에는 파이썬만한 언어가 없어서 거의 정착하게 되었다. 이런 결정을 할 때 신경쓰이는건 '파이썬은 느리다' 라는 평가이다. 시간 제한이 있는 문제도 있기 때문에 괄시할 수 없는 문제였다. LeetCode에서 같은 논리구조, 다른 언어로 솔루션을 올리는 사람들의 코드를 빌려 실행시간에 정말 유의미한 차이가 있는지 알아보기로 했다. 아래는 실행시간을 측정한 결과이다. 단위 : msC++PythonPython3JavaScriptSpiral Matrix IV5123860Split Linked List4264157Max Score2173159Min Count of BitFlip02534..

[Kotlin] 서브 클래스의 반복작업을 위한 여러 방법 : Reflection, Branch, Strategy pattern

* 이 글은 Kotlin 문법에 익숙하다는 것을 전제로 작성했다. interface, inline function, 각종 함수형 패러다임 지원을 위한 문법을 사용할 수 있다면 어렵지 않을 것이다.문제상황자식 클래스가 아주 다양하고, 이들이 다들 비슷한 처리를 요구할 때가 있다. Android의 AudioEffect 같은 경우가 그렇다.처리를 변경할 때 마다 일일이 메서드를 찾아다니기는 무리여서, 자식 클래스들을 효율적으로 관리할 수 있는 방법이 필요했다. 이런 과일 클래스가 있다고 생각해보자. 각 과일은 Fruit로부터 상속받은 여러 메서드를 구현하고 있다. 이 클래스는 더 이상 바꿀 수 없다고 가정하자.interface Fruit { fun buy() fun wash() fun dry(..