전체 글

인생은 새옹지마
· BE/JSP
네트워크란? 네트워크는 컴퓨터와 컴퓨터를 연결해주는 망 이라고 생각하면 된다. 네트워크를 구축하려면 컴퓨터 간의 연결 규격 즉, 프로토콜(Protocol)이라는 것이 필요하다. 여러 프로토콜 중 가장 대표적으로 널리 쓰이고 또한 인터넷에서도 사용되고 있는 TCP/IP에 대해 살펴보자. TCP/IP TCP/IP(Transmission Control Protocol/Internet Protocol)는 컴퓨터 간에 통신할 수 있도록 만든 프로토콜 중 하나이다. 이 프로토콜에 기반하고 있는 것이 인터넷인데, TCP/IP가 인터넷 기반 프로토콜로 자리 잡은 이유는 하드웨어, 운영체제, 접속 매체와 관계없이 동작할 수 있는 개방형 구조이기 때문이다. 원래 TCP/IP는 OSI(Open Systems Intercon..
피지컬로 승부하기 구현(Implementation)이란 '머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정'이다. 흔히 문제 해결 분야에서 구현 유형의 문제는 '풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제'를 의미한다. 개발할 때 프로그래밍 언어의 문법에 능숙하고 코드 작성 속도(타자)가 빠른 사람을 보고 '피지컬이 좋다'라고 이야기하는데, 구현 유형의 문제는 그런 의미에서 '피지컬을 요구하는' 문제라고도 할 수 있다. 이 책에서는 모든 경우의 수를 모두 계산하는 해결 방법인 완전 탐색, 문제에서 제시한 알고리즘을 한 단계씩 차례대로 직접 수행해야 하는 시뮬레이션 유형을 모두 구현으로 취급하여 다룬다. 구현 시 고려해야 할 메모리 제약 사항 C/C++에서 변수의 표현 범위 기본 int 자료형..
그리디 알고리즘 (탐욕법) 그리디 알고리즘은 '현재 상황에서 지금 당장 좋은 것만 고르는' 알고리즘이다. 이 알고리즘의 유형은 사전에 외우고 있지 않아도 풀 수 있을 가능성이 높은 문제 유형이라는 특징이 있지만, 뒤에 나오는 정렬, 최단 경로 등의 알고리즘 유형은 미리 알고리즘의 사용 방법을 정확히 알고 있어야만 해결 가능한 경우가 많다. 그러므로 그리디 알고리즘 문제를 풀 때는 많은 유형을 접해보고 문제를 풀어보며 훈련을 해야 한다. 보통 코딩 테스트에서 출제되는 그리디 알고리즘 유형의 문제는 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구한다. 즉 특정한 문제를 만났을 때 단순히 현재 상황에서 가장 좋아 보이는 것만을 선택해도 문제를 풀 수 있는지를 파악할 수 있어야 한다. 그리디 ..
배열 내부의 데이터가 정렬되어 있을 때 O(logN)의 시간 복잡도로 원하는 값을 찾을 수 있는 이진 탐색에 대해 알아보자. 이진 탐색(Binary Search) 이진 탐색은 배열 내부의 데이터가 정렬되어 있는 경우에만 사용할 수 있는 알고리즘이다. 이진 탐색은 탐색 범위를 절반씩 좁혀가며 데이터를 탐색한다. 이진 탐색에서는 시작점, 중간점, 끝점으로 3개의 변수를 사용한다. 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복해서 비교해서 원하는 데이터를 찾는다는 컨셉이다. 대충 이런 느낌이다. 코드를 살펴보면 이해가 될 것이다. def binary_search(arr, target, start, end): if start > end: return None mid = (start+end)//2 if ar..
문제 동빈이는 두 개의 배열 A와 B를 가지고 있다. 두 배열은 N개의 원소로 구성되어 있으며, 배열의 원소는 모두 자연수이다. 동빈이는 최대 K 번의 바꿔치기 연산을 수행할 수 있는데, 바꿔치기 연산이란 배열 A에 있는 원소 하나와 배열 B에 있는 원소 하나를 골라서 두 원소를 서로 바꾸는 것을 말한다. 동빈이의 최종 목표는 배열 A의 모든 원소의 합이 최대가 되도록 하는 것이며, 여러분은 동빈이를 도와야 한다. N, K, 그리고 배열 A와 B의 정보가 주어졌을 때, 최대 K 번의 바꿔치기 연산을 수행하여 만들 수 있는 배열 A의 모든 원소의 합의 최댓값을 출력하는 프로그램을 작성하라. 예를 들어 N = 5, K = 3이고, 배열 A와 B가 다음과 같다고 해보자. 배열 A = [1, 2, 5, 4, 3..
문제 N명의 학생 정보가 있다. 학생 정보는 학생의 이름과 학생의 성적으로 구분된다. 각 학생의 이름과 성적 정보가 주어졌을 때 성적이 낮은 순서대로 학생의 이름을 출력하는 프로그램을 작성하시오. 입력 첫 번째 줄에 학생의 수 N이 입력된다. (1≤N≤100,000) 두 번째 줄부터 N+1번째 줄에는 학생의 이름을 나타내는 문자열 A와 학생의 성적을 나타내는 정수 B가 공백으로 구분되어 입력된다. 문자열 A의 길이와 학생의 성적은 100 이하의 자연수이다. 출력 모든 학생의 이름을 성적이 낮은 순서대로 출력한다. 성적이 동일한 학생들의 순서는 자유롭게 출력해도 괜찮다. 입력 예시 2 홍길동 95 이순신 77 출력 예시 이순신 홍길동 문제 해설 N의 크기가 100,000이기 때문에 시간 복잡도가 O(Nlo..
문제 하나의 수열에는 다양한 수가 존재한다. 이러한 수는 크기에 상관없이 나열되어 있다. 이 수를 큰 수부터 작은 수의 순서로 정렬해야 한다. 수열을 내림차순으로 정렬하는 프로그램을 만드시오. 입력 첫째 줄에 수열에 속해 있는 수의 개수 N이 주어진다. (1≤N≤500) 둘째 줄부터 N + 1번째 줄 까지 N개의 수가 입력된다. 수의 범위는 1 이상 100,000 이하의 자연수이다. 출력 입력으로 주어진 수열이 내림차순으로 정렬된 결과를 공백으로 구분하여 출력한다. 동일한 수의 순서는 자유롭게 출력해도 괜찮다. 입력 예시 3 5 27 12 출력 예시 27 15 12 문제 해설 N의 범위가 500으로 매우 작고, 수의 범위 또한 100,000이하의 자연수이기 때문에 어떤 방식의 정렬 방법을 사용해도 상관없..
머신러닝을 마무리하고 이제 딥러닝을 공부해보자. 패션 MNIST MNIST는 머신러닝과 딥러닝을 배울 때 자주 사용하는 데이터셋이다. 딥러닝에서는 손으로 쓴 0~9까지의 숫자로 이루어진 데이터를 사용한다. 패션 MNIST는 크기와 개수가 동일하지만 숫자 대신 패션 아이템으로 이루어진 데이터이다. 패션 MNIST 데이터는 워낙 유명해서 많은 딥러닝 라이브러리에서 가져올 수 있는 도구를 제공한다. 이 책에서는 텐서 플로(Tensor Flow)를 사용해서 데이터를 불러온다. 패션 MNIST가 어떤 데이터인지 확인해 보자. 텐서 플로도 코랩에서 사용할 수 있다. 텐서 플로의 케라스(Keras) 패키지를 임포트해서 패션 MNIST 데이터를 다운로드하자. keras.datasets.fashion_mnist 모듈 아..
aodtns
맹의 코딩 기록장