분류 전체보기 49

Dockerfile에서 bash 명령 사용하기 | RUN, CMD, ENTRYPOINT 차이

도커는 이미지라는 틀을 만들고, 이를 컨테이너 단위로 찍어내는 형태로 작동한다.이때 이미지를 정의하기 위해 Dockerfile을 문법에 맞게 적어줘야하는데, 여기서 쉘 명령어를 사용하기가 여간 까다롭지 않다.도커파일에서 쉘 명령어를 입력하는 형식과, 사용할 수 있는 커맨드의 종류 두가지를 모두 정리해보았다. 1. Shell form과 exec formDockerfile 예시를 읽다보면 똑같은 일을 하는 명령을 두가지 방법으로 적어놓은 것을 볼 수 있다.FROM centos:7# 컨테이너 실행 직후 running... 이라는 문구를 두번 출력한다.CMD echo "running... 1"; echo "running... 2" # 괄호 없으면 shell formCMD ["/bin/bash", "-c", "e..

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

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

CS 지식 2024.12.13

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

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

CS 지식 2024.12.12

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

아래와 같은 정사각형방이 있을 때, 좌측상단 모서리에서 우측하단 모서리까지 가야한다.이때 까맣게 색칠된 방은 0으로 표시되며, 이 방을 지나갈때는 1만큼의 비용이 발생한다.좌측상단에서 우측하단에 도착할 수 있는 최소비용을 구하는 문제이다. 한 변의 길이 N은 1 이상 50이하이고, 실행 제한시간은 1초이다.  처음에는 모든 경우의 수를 모두 돌아보되, 가능성이 없는 경로는 빠르게 쳐내기 위해 DFS로 빠르게 최소비용을 구하고자했었다.쓸데없이 경로를 꼭 알아야한다고 생각을 했던것...그렇지만 우리 문제는 어떤 경로를 사용했는지가 중요한 문제가 아니라서 황급히 우선순위큐를 사용한 다익스트라로 구현을 바꾸었다. 전체 구현 코드는 아래와 같다.더보기 import heapqdirs = [(1,0),(0,1),(-..

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 (판매 담당자)..

미라클모닝 6단계 요약

미라클 모닝최근 2030 세대 사이의 자기계발 트렌드를 꼽으라면 단연 ‘미라클 모닝’이다. ‘미라클 모닝’이란 아마존에서 종합 베스트셀러 1위를 기록한 뒤 2016년 한국에 출간된 베스트셀러 《미라클 모www.aladin.co.kr 매번 일찍 일어나면 미라클 모닝이라고 농담만 했지, 책은 처음 읽어봤는데 세간에서 말하던 것과는 내용이 많이 달라서 놀랐다.저자는 아래 6단계를 거치면 소풍날 같은 들뜬 기분을 매일 느낄 수 있다고 말한다.각 스텝은 1분 정도로 짧아도 되고, 심지어 아침에 하지 않아도 된다고 말한다. 점심시간에 잠깐 짬내서 해도 좋을 듯 싶다. 0. 아침잠 쫓는법- 알람시계 멀리 옮기기- 양치하고 물한컵 마시기- 운동복 입기- 아침에 안춥게 난방 잘하기- 기타 컨디션을 좋게 만드는 루틴 포함..

독후감/완성본 2024.10.27

[백준 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): ..