dreamimplement의 등록된 링크

 dreamimplement로 등록된 네이버 블로그 포스트 수는 73건입니다.

분할정복법 [내부링크]

분할 정복법 분할정복법Divide and Conquer 은 주어진 문제를 작은 문제로 나눠서 해결하고, 각 나눠진 문제의 해들을 조합해서 최종해를 구하는 알고리즘 기법 입니다. 분할정복법의 단계를 나타내면 아래와 같습니다. 1. 문제를 부분문제로 나눕니다. 보통 더 이상 나눌수 없을때까지 나눕니다. 2. 나눈 문제들에 대해 각각 해를 구합니다. 3. 부분 문제들의 해를 조합해서 최종적으로 전체문제의 해를 구합니다. [그림] 분기한정법의 과정 모든 문제를 나눠서 해결한다고 성능이 개선되는 것은 아니고, 문제를 나눴을 때, 각 부분문제 들이 독립적으로 해결될 수 있는 경우에 효과적입니다. 문제를 나눴을때 독립적이지 않은 예는 동적 계획법으로 해결한 문제들 입니다. 예를 들면 LCS가 있습니다.(자세한 내용은 동적계획법을 설명하는부분을 참조해주세요) 점화식을 보면 이전에 구한 해를 활용해 현재해를 갱신해 나가는 방식이므로 각각의 해들은 이전해에 의존하고 있습니다. 따라서 부분해가 독립적이

코딩테스트 인프런 강의 무료 제공 [내부링크]

안녕하세요 인프런에서 코딩테스트를 준비하시는 학생분들을 위해 "수강료 0원"으로 무료 강의를 공개 했습니다. 강의에 대한 질문 답변도 제공 하고요. 강의자료도 전부 무료로 공유되어있습니다 필요하신 경우 언제든지 질문 하실수 있습니다. 공부하시는데 필요한 전반적인 개념, 준비하는 방법에 대해 다뤘어요 https://www.inflearn.com/course/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B0%9C%EB%85%90?inst=586ef276&utm_source=instructor&utm_medium=referral&utm_campaign=inflearn_%ED%8A%B8%EB%9E%98%ED%94%BD_promotion-link

스택-괄호 짝 맞추기 문제 [내부링크]

문제의 정의 괄호는 “(“와 “)” 두 가지로 구성됩니다. 문제에서는 “(“와 “)”로 이루어진 문자열이 주어지고, 이 괄호가 정상적인지 판별하는 것이 목적 입니다. 1. “(“ 은 자신과 가장 가까운 “)”를 만나면 상쇄합니다. 단 상쇄조건은 “(“가 먼저 와야 하고 “(“와 “)”사이에 아무것도 없어야 합니다. 2. 괄호가 상쇄된 후에는, 더이상 상쇄되는 괄호가 없을때 까지 연산이 반복 됩니다. 3. 2.의 연산이 모두 종료되었을 때 남는 괄호가 있으면 괄호의 짝이 맞다고 할 수 있습니다. 아래의 괄호들은 짝이 맞지 않다고 할 수 있습니다. [표] 짝이 맞지 않는 괄호의 예 괄호의 짝이 맞지 않습니다. 괄호가 상쇄 되려면 “(“다음에 “)”이 와야 합니다. 주어진 문자열에서는 “)”가 먼저 왔으므로, 더 이상 상쇄가 되지 않고 괄호가 전부 없어지지 않습니다. 괄호의 짝이 맞지 않습니다. 1단계에서 괄호가 한번 상쇄되었지만, 이후 더이상 상쇄할 수 없으므로 괄호가 다 없어지지 않습

스택 - 10진수를 2진수로 변환 [내부링크]

문제 정의 10진수가 주어지고 이를 2진수로 변환하는것이 문제 입니다. 10진수를 2진수로 변환하는 방법 10진수를 2진수로 표현하는 과정을 알아보겠습니다. 사실 이 변환은 알고리즘이라기보다는 실제 수학적인 규칙 입니다. 1. N을 2로 나눈 나머지(%2)를 저장합니다. 2. 현재 숫자가 0이 아니라면 아니라면, N을 2로 나누고 나머지는 버리고 1을 수행합니다. 3. 2.가 완료되면 저장된 수를 뒤에서 부터 가져오면 변환된 2진수가 됩니다. 예를들어서 십진수 13을 이진수로 변경하면 1101이 됩니다. 아래 그림은 13이 1101로 변경되는 과정을 나타낸 그림입니다. [그림] 십진수가 이진수로 변하는 과정 스택으로 접근하기 10진수를 2진수로 변환하는 과정을 분석하면 바로 알 수 있습니다. 스택에 저장해야 할 데이터가 무엇인지 정의 하면 됩니다. N을 2로 나눈 나머지들의 집합이 결국 2진수가 됩니다. 하지만 여기서 중요한 것은 저장된 수를 차례대로 가져오는게 아니라 뒤에서 부터

큐의 개념 [내부링크]

큐의 개념 큐의 어원 큐Queue의 의미를 찾아보면, 줄을서다 라는 뜻입니다. 맛집에서 줄을 서는 모습을 생각해봅시다. 당연히 먼저 줄을 선 사람부터 식당에 입장 합니다. 자료구조에서 큐는, 위 처럼 먼저 들어간 데이터가 먼저 나오는 규칙 FIFO(First In First Out)을 가지고 데이터를 관리합니다. 먼저 FIFO의 개념을 알아보고, 큐의 동작에 필요한 연산들에 대해서 설명 드리겠습니다. 이전 장의 스택과 비교해서 개념을 정리하시면 도움이 될 것 같습니다. [그림]큐의 예시 FIFO의 동작 선입선출이라고도 불리는 FIFO규칙이 어떻게 동작하는지, 실제 예제를 통해 알아보겠습니다. 핵심은 먼저 들어온것이 먼저 나간다는 것 입니다. 초기상태 빈 큐를 하나 선언했습니다. 다음 단계부터 원소를 큐에 삽입하거나 꺼내는 동작을 할 것입니다. 현재는 큐에 아무것도 들어있지 않은 상태 입니다. 2 삽입 2를 삽입하는 모습 입니다. 2를 삽입하기 전에는 빈 큐 였으므로 제일 앞에 삽입되

큐의 설계 [내부링크]

큐의 설계 지금까지 큐의 핵심연산인 FIFO에 대해 설명드렸습니다. 실제로 큐의 연산과 상태정보를 표현하는 ADT를 정의해보겠습니다. 큐의 연산 큐의 연산은 삽입,꺼내기,가득찼는지 확인, 비었는지 확인 총 4개 입니다. 먼저 삽입/삭제를 알아보겠습니다. 큐에 원소를 삽입하는 연산을 푸시Push라고 하고, 꺼내는 연산을 팝Pop 이라고 하겠습니다. 큐에서 삽입을 할때에는 무조건 맨 뒤에 삽입 합니다. 이전에 예시처럼 맛집에서 대기를 하는 상황을 떠올리시면 됩니다. 팝을 할때에는 스택과 다르게 제일 먼저 삽입된 원소가 대상이어야 합니다. 추가적으로 큐에 담을수 있는 최대원소의 갯수에 도달했는지 체크하고, 반대로 큐가 비었는지 체크하는 연산도 수행 합니다. 큐의 상태 큐에서는 연산을 지원하기 위해 2가지 상태를 표현 가지고 있습니다. 첫번째는 프론트Front 입니다. 해당 값은 마지막으로 팝을했던 위치를 가지고 있습니다. 두번째는 리어Rear입니다. 해당 값은 마지막 으로 푸시를 했던 위

큐 - 요세푸스 문제 [내부링크]

문제 정의 해당 문제는 유대인 역사가 플라비우스 요세푸스가 만든 문제 입니다. N명의 사람들이 원 모형으로 서 있습니다. 각 사람들은 1부터 N까지 번호표를 붙이고 있습니다. 이제 숫자가 하나가 주어집니다. 이 숫자를 K라고 해보겠습니다. N과 K가 주어졌고, 아래와 같은 규칙에 따라 동작합니다. 1. 1번 번호표를 가진 사람을 기준으로 K번째 사람을 없앱니다. 2. 없앤 사람 다음이 1번이라고 가정하고 1.을 반복합니다. 모든 사람이 없어질때 까지 반복 합니다. 예를들어서 N이 5이고, K가 2인경우 아래와 같습니다. [표] 요세푸스 문제의 예시 초기 상태 N이 5이고 K가 2일때 초기 상태 입니다. N이 5이므로 1~5번까지 이름표가 있고 원형으로 배치가 되었음을 볼 수 있습니다. 1단계 1번 기준으로, 두 번째는는 2번입니다. 따라서 2가 제거 됩니다. 2가 제거 되었으므로, 2다음인 3 부터 시작합니다. 2단계 3번 기준으로 두번 째는 4 입니다. 따라서 4가 제거됩니다. 4

알고리즘 효율 분석 - 빅오 표기법 [내부링크]

프로그래밍에서 성능은 가장 중요한 측면 중 하나입니다. 프로그램의 성능을 측정하는 여러가지 관점이 있지만, 우리는 시간 복잡도와 공간 복잡도 측면에서 알고리즘의 성능을 분석해 볼 것입니다. 시간 복잡도의 경우에는 알고리즘의 수행시간을 기준으로 성능을 분석 합니다. 즉 같은 작업을 할 때에 내가 원하는 결과값을 얻는데 까지 걸리는 시간이 짧다면, 시간 복잡도가 낮다고 할 수 있습니다. 공간 복잡도의 경우에는 알고리즘이 수행되는 동안 필요한 메모리의 양을 측정 합니다. 해당 알고리즘을 수행 할 때에, 더 적은 메모리를 사용한다면, 공간 복잡도가 낮다고 할 수 있습니다. 예를 들어, 자율주행 알고리즘의 경우 시간복잡도가 중요 합니다. 앞차와의 간격이나, 길의 상태를 빠르게 파악하고 차가 어떻게 운행될지 실시간으로 판단해야 하기 때문입니다. 또 다른 예는 유전자 데이터를 가지고 분석을 하는 프로젝트 입니다. 이 경우 방대한 데이터 양을 처리해야 하기 때문에 최대한 공간 복잡도를 낮추는 게

알고리즘 효율 분석 -시간복잡도 [내부링크]

시간 복잡도 시간복잡도의 개념 알고리즘이란 무엇인지 생각해봅시다. 어떤 입력값이 들어왔을때, 우리가 원하는 출력값이 나오도록 하는 방법 이라고 할 수 있습니다. 이 방법은 한가지가 아닐 수 있으며, 우리가 풀어야 할 문제에 대해 가장 적합한 알고리즘을 선정하기 위해 알고리즘의 성능을 측정해야 합니다. 시간 복잡도Time Complexity는 알고리즘에 입력값이 들어온 순간부터, 출력값이 나올때까지 걸린 시간이나 연산횟수를 중점으로 알고리즘 효율을 측정합니다. 그림으로 표현하면 아래와 같습니다. [그림] 알고리즘에서 시간복잡도의 개념 문제 정의 1차원 배열에 무작위로 데이터가 저장되어 있습니다. 특정 값을 받고, 이 값이 배열에 있는지 확인해야 합니다. 값을 찾은 경우 해당 값의 위치를 반환하고, 찾지 못한 경우 -1을 반환합니다. 접근 전략 왼쪽부터 순차적으로 탐색하면서 값이 발견된 경우 해당 값의 위치를 반환하고, 배열의 끝까지 탐색했는데 찾는 값이 없을 경우 -1을 반환 합니다.

집합(Disjoint Set) [내부링크]

집합의 개념 해당 장에서 말하는 집합은 상호배타적 집합Disjoint Set인 즉 분리형 집합 데이터 구조를 말합니다. 풀어서 말하면, 여러개의 원소들로 이루어진 집합이 존재할때, 이중 서로 겹치지 않는 부분 집합 들로 이루어진 집합 구조를 의미합니다. 각 부분집합들은 독립적이며, 서로 다른 부분집합에 속한 원소가 존재하지 않습니다. 예를들어보면, 아래는 상호베타적 집합을 형성한다고 볼 수 있습니다. 왜냐하면 집합A과 집합B는 서로 독립적이고, 각 원소가 다른 집합에 속하지 않기 때문 입니다. [그림]상호배타적 집합의 예시 아래는 상호베타적 집합을 형성했다고 볼 수 없습니다. 왜냐하면 집합A의 원소 5는 집합B에도 존재하기 때문에, 서로 독립적인 관계라고 할 수 없습니다. 겹치는 원소가 하나도 없어야 합니다. [그림] 상호배타적 집합이 아닌 예시 이런 방식으로 전체집합을 상호베타적 집합으로 쪼개는 알고리즘은, 실제 어떤분야에서 활용될 수 있을까요? 일단 이미지 분할에 사용될 수 있습

[알고리즘]동적계획법-메모이제이션 [내부링크]

메모이제이션 동적계획법에서 가장 중요한 것은 쪼개진 문제들의 해를 활용해서, 전체문제를 해결하는 것입니다. 문제의 해를 활용하기 위해서는 어딘가에 저장해야 하는데, 이를 메모이제이션Memoization이라고 합니다. 메모이제이션을 사용하면, 이전에 구했던 해는 다시 구하지 않고 재사용할 수 있으므로 알고리즘의 성능이 향상될 수 있습니다. 동적계획법을 활용해서 피보나치 수Fibonacci numbers를 구하는 과정을 보여드리겠습니다. 피보나치수란, 첫째항과 두번째항은 1이고, 그다음 항부터는 바로 앞의 두개의 항의 합인 수열을 의미합니다. 점화식을 세우고, 이를 활용해서 해를 구하는 과정 순서로 설명드리겠습니다. [표] 피보나치에 대한 점화식을 세우는 과정 해가 있다고 가정 Fibo(N)은 N번째 피보나치 수를 반환하는 함수라고 가정합니다. 아직 Fibo(N)을 구체화 하는 과정이 아닙니다. 단순히 있다고 가정하면 됩니다. 종료조건을 설정 피보나치 과정을 나타내면 위와 같습니다. 종

[알고리즘]동적계획법-LIS(최장증가부분수열) [내부링크]

최장증가부분수열의 개념 부분수열이라는 개념을 먼저 알아봅시다. 부분수열이란, 주어진 수열중 일부분을 뽑아 새로만든 수열을 말합니다. 이 때 순서가 섞이면 안됩니다. 순서가 섞인다는 의미는 원소들의 전후관계가 수열일때와 부분수열일때가 달라지는 것을 의미합니다. 최장증가 부분수열Long Increasing Subsequence이란, 부분수열의 원소가 오름차순을 유지하는 조건을 만족하고 이 중에서 길이가 가장 긴것을 말합니다. 수열을 하나 정의하고, 이를 기준으로 .부분수열과 최장증가 부분수열의 예를 보여드리겠습니다. 부분수열과 최장증가 부분수열을 설명하기 위한 수열 정의 위 수열을 기준으로, 부분수열 몇가지를 나타내면 아래와 같습니다. [표] 부분수열의 예 수열 {1,4,2}은 부분수열이 맞습니다. 전후관계가 바뀌지 않았고, 모든원소가 수열에 있는 원소 입니다. 수열 {1,3,5}은 부분수열이 맞습니다. 전후관계가 바뀌지 않았고, 모든원소가 수열에 있는 원소 입니다. 헷갈리실수 있는 부

[알고리즘]최장공통부분수열 구현(LCS) [내부링크]

최장공통부분수열길이 점화식 표현 최장공통부분수열을 일반화해서 점화식을 만들어 보겠습니다. 다시한번 말씀드리면, 현재 우리의목적은 최장공통부분수열의 길이를 구한다는 것입니다. 해가 있다고 가정 LCS(m,n)은 수열 x[1….m]과 y[1….n]의 최장공통부분수열의 해를 구하는 함수입니다. 케이스 정리하기- 현재 비교하는 문자가 같은 경우 LCS(m,n)을 작은 문제를 활용해 풀어봅시다. x[m]과 y[n]이 같은 경우엔 LCS에 해당 문자가 추가되야 합니다. 따라서 현재까지 구한 LCS중 x[m],y[n]을 포함하지 않는 가장 큰 LCS에 현자문자가 더해지므로 1을 더해주면 됩니다. m,n을 각각 i,j로 일반화해서 정리하면 아래와 같습니다 케이스 정리하기- 현재 비교하는 문자가 다른 경우 x[m]과 y[n]이 다른 경우엔, 2가지 경우를 생각해봐야 합니다. 우리가 구하는것은 최장길이 입니다. 따라서 최대한 많은 문자열이 포함 되야 합니다. x[m]과 y[n]은 다르지만 x[m-1]

[알고리즘]동적계획법-조약돌문제 개념 [내부링크]

조약돌문제의 개념 3열 N행의 가중치가 있는 배열이 주어 집니다. 문제의 목적은 아래 규칙을 준수하면서 조약돌을 때, 가중치의 합이 최대가 되게 하는 것입니다. 1. 각 열에 조약돌은 적어도 하나는 놓아야 합니다. 2. 각 조약돌에 바로 인접한 위치에 조약돌을 놓을수 없습니다. 단 인접의 기준은 상하좌우 입니다. 아래 예시를 보면 좀 더 쉽게 이해하실수 있습니다. [표] 조약돌 규칙의 설명 음영을 칠한대로 {1,7}가중치가 있는곳에 조약돌을 놓는다면, 규칙에 맞지 않습니다. 인접한 위치에 조약돌이 있기 때문 입니다. 음영을 칠한대로 {1,2}가중치가 있는곳에 조약돌을 놓는다면, 규칙에 맞지 않습니다. 인접한 위치에 조약돌이 있기 때문 입니다. 음영을 칠한대로 {1,5}가중치가 있는곳에 조약돌을 놓는다면, 규칙에 맞습니다. 인접한 위치에 조약돌이 없기 때문 입니다. 음영을 칠한대로 {1,5,-4}가중치가 있는곳에 조약돌을 놓는다면, 규칙에 맞습니다. 인접한 위치에 조약돌이 없기 때문

[알고리즘]동적계획법-조약돌문제 구현 [내부링크]

조약돌문제 점화식 표현 조약돌 문제에서 가장 중요한 조건은 우리가 놓은 조약돌이 인접하지 않게 놓는 것입니다. 조약돌이 놓일수 있는 경우의수를 확인해보고, 이를 패턴으로 정리해보겠습니다. [표]조약돌문제에서 조약돌을 놓을수있는는 패턴의 정의 패턴의 정의 4개의 패턴이 가능한것을 볼 수 있습니다. 첫번째 패턴에서 세번째 패턴은 각각의행에 조약돌을 놓는 패턴 입니다. 네번째패턴은 1번째 행과 3번째 행에 조약돌을 넣는 패턴 입니다. 첫번째 패턴뒤에 올수 있는패턴 첫번째 패턴과 각각의패턴이 결합한 모습입니다. {2,3}패턴은 인접하지 않으므로 가능 합니다. 하지만 {4}패턴은 첫번째 열이 겹치므로 불가능합니다. 두 번째 패턴뒤에 올수 있는패턴 두번째 패턴과 각각의패턴이 결합한 모습입니다. {1,3,4}패턴 모두 인접 하지 않으므로 가능합니다. 세 번째 패턴뒤에 올수 있는패턴 세번째 패턴과 각각의패턴이 결합한 모습입니다. {1,2}패턴은 인접하지 않으므로 가능 합니다. 하지만 {3,4}패턴

추상데이터타입(ADT) [내부링크]

추상데이터타입의 개념 추상데이터타입Abstract Data Type 은 줄여서 ADT로 많이 표현하며 단순히 연산Operation 과 값Value들의 정의하는 것입니다. 가장 큰 특징은 세부적인 구현을 나타내지 않는다는 점입니다. 프로그래밍적으로 표현하면 구현보다는 인터페이스에 관심이 많다고 할 수 있습니다. 추상데이터타입은 실생활에서도 많이 찾아볼 수 있습니다. 현금 인출기를 예를 들어보겠습니다. 사용자의 입장에서 인출하는 과정을 생각해봅시다. 돈을 인출할 카드를 넣고 금액과 카드 비밀번호를 입력하면 돈을 인출할 수 있습니다. 돈을 인출하는 과정에서, 카드를 넣는 순간 이 카드의 정보를 세부적으로 어떻게 읽어들이는지, 인출할수 있는 금액정보를 은행 데이터베이스에서 어떻게 가져오는지, 가져오는 과정에서 통신은 어떤방식으로 이루어지는지 이런것들을 고민하면서 돈을 인출하지는 않을것입니다. 사실 해당 정보는 알고싶어도 알수가 없습니다. 사용자는 현금 인출기에 정보를 입력하고, 현금을 인출

배열의 개념 [내부링크]

배열의 개념 배열의 선언및 기본연산 배열은 인덱스와 값을 매칭시켜서 관리하는 자료구조 입니다. 데이터가 저장 되어어있는 모든 공간이 인덱스와 매칭 되기 때문에, 한번에 접근이 가능합니다. 이를 임의접근random access이 가능하다고 표현합니다. [표] 배열을 선언 및 연산방법 배열의 선언 프로그래밍 언어마다 문법은 조금씩 다르지만 배열을 선언할때는 3가지를 명시해줘야 합니다. 바로 타입,이름,크기 입니다. 그림을 보시면 정수타입에 크기가 6이고 이름이 arr인 배열을 선언 했습니다. 배열 접근 각 배열의 공간에 접근하기 위해서는 인덱스를 활용합니다. 인덱스로 접근하는 문법은 언어마다 다르므로 C/C++ 기준으로 설명드리겠습니다. 배열 원소에 접근하기 위해서는 “[]”연산자를 활용 합니다. 인덱스는 0부터 시작합니다. 첫번째 원소에 접근하기 위해서는 arr[0]과 같이 접근합니다. 배열의 차원 배열을 공부하다 보면 차원이라는 단어가 많이 언급됩니다. 컴퓨터 메모리 자체가 1차원이

스택의 개념 [내부링크]

스택의 개념 스택의 어원 스택stack의 의미를 찾아보면 쌓는다는 뜻입니다. 레스토랑에서 흔히볼수 있는 티슈를 생각해봅시다. 한장한장 차곡차곡 쌓아둔 형태이고, 우리는 이것을 사용할때 가장 윗부분부터 사용합니다. 자료구조에서 스택은, 위 처럼 먼저 들어간 데이터가 나중에 나오는 규칙FILO(First In Last Out)을 가지고 데이터를 관리합니다. 먼저 FILO의 개념을 알아보고, 스택의 동작에 필요한 연산들에 대해서 설명 드리겠습니다. [그림] 스택의 예시 FILO의 동작 선입선출이라고도 불리는 FILO규칙이 어떻게 동작하는지, 실제 예제를 통해 알아보겠습니다. 핵심은 먼저 들어온것이 나중에 나간다는 것 입니다. [표]FILO에 대한 예시 초기상태 빈 스택을 하나 선언했습니다. 다음 단계부터 원소를 스택에 삽입하거나 꺼내는 동작을 할 것 입니다. 현재는 스택에 아무것도 들어있지 않은 상태 입니다. 1 삽입 1을 삽입하는 모습 입니다. 1을 삽입하기 전에 빈 스택이 었으므로,

스택의 설계 [내부링크]

지금까지 스택의 핵심연산인 FILO에 대해서 설명드렸습니다. 이제 실제로 스택의 연산과 상태 정보를 표현하는 ADT를 정의해보겠습니다 . 스택의 연산 스택의 연산은 삽입,꺼내기,가득찼는지 확인, 비었는지 확인 총 4개 입니다. 삽입/삭제를 먼저 알아보겠습니다. 스택에 원소를 삽입 하는 연산을 푸시Push라고 하고, 꺼내는 연산은 팝Pop이라고 하겠습니다. 삽입을 할때에는 스택의 가장 마지막에 삽입된 원소의 위치 다음에 삽입이 되어야 하며, 팝을 할 때에는 스택의 가장 마지막에 삽입된 원소가 대상이어야 합니다. 추가적으로 스택에서 담을수 있는 최대원소의 갯수에 도달했는지를 체크하고, 반대로 스택에 원소가 하나도 있지 않는지 체크하는 연산을 수행합니다. 스택의 상태 푸시와 팝 연산을 하려면 스택의 가장 마지막 원소위치를 알아야 합니다. 우리는 마지막 원소의 위치를 탑Top 이라고 부를 것입니다. 스택의 ADT 스택의 연산과 상태가 정의되었으므로, 스택의 ADT를 어렵지 않게 정의할 수

[알고리즘]시뮬레이션-행렬연산 [내부링크]

시뮬레이션 문제에 행렬연산은 굉장히 많이 활용 됩니다. 직접적으로 행렬이라고 언급하지는 경우도 있지만 대부분 문제의 일부분에서 활용되는 경우가 많습니다. 알고보면 간단한 개념이지만, 준비되지 않은 상태에서 문제를 풀면 시간이 많이 걸리고 실수하는 경우가 많으므로 익혀두시면 좋습니다. 행렬 덧셈/뺄셈 가장 직관적인 행렬연산 입니다. 각 행렬에서 동일한 위치에 있는 값들간 덧셈/뺄셈을 해서 결과를 출력하면 됩니다. 행렬의 덧셈과 뺄셈에서 유의하실 점은, 피연산되는 두 행렬의 크기가 정확히 일치해야 합니다. 각 행렬의 모든 원소들에 대해서 한번씩 연산을 수행하므로 행렬의 크기가 일치해야 연산이 가능합니다. 행렬의 덧셈을 하는 과정을 한번 보겠습니다. 1단계 행렬 A,B를 더한 결과를 C에 저장하려고 합니다. A[X,Y]는 A행렬의 X열 Y행에 있는 원소라고 보시면 됩니다. 덧셈시, 각 행렬에서 같은 위치에 있는 값들이 서로 더해집니다. 그림은 A[0,0]과 B[0,0]을 더한 값이 C[0

[알고리즘]시뮬레이션-좌표연산 [내부링크]

시뮬레이션 문제의 경우, 주어진 조건에 따라 물체가 이동해야 하는 경우가 많기 때문에 2차원 좌표를 표현해야 하는 경우가 많습니다. 2차원 좌표를 배열로 표현하고 활용하는 법을 한번 알아보겠습니다. 좌표를 배열로 표현 기본적인 아이디어는 아래 그림을 보시면 이해하기 쉽습니다. 좌표를 배열로 표현한 예 2차원의 좌표값에 해당되는 배열의 위치를 활용 하는 것입니다. 게임 캐릭터의 위치를 2차원 좌표로 표현하려면 위와 같이 해당좌표에 숫자 1을 입력하면 됩니다. 좌표값의 변경 좌표를 활용하는 문제 대부분, 현재위치를 이동하는 것을 시뮬레이션 해야할 경우가 많습니다. 일단 현재위치 기준으로 이동시, 좌표가 어떻게 바뀌는지 알아보고, 좌표를 효율적으로 이동 시키는 방법에 대해 알아봅시다. [표] 주변좌표로 이동시 좌표가 바뀌는 모습 초기값 3*3 배열이고 배열 내부는 값이 아니라 인덱스 입니다. [1,1]을 기준으로 주변좌표로 이동시 인덱스가 어떻게 바뀌는지 확인해보겠습니다. 상하좌우 이동

[알고리즘]신장트리개념 [내부링크]

신장트리 신장트리Spanning Tree는 모든 정점이 간선으로 연결되어있고, 간선의 갯수가 정점의 개수보다 하나 적은 그래프를 말합니다. 일단 그래프를 정의하고, 신장트리의 예와, 신장트리가 아닌예를를 나타내면 아래와 같습니다. 신장트리를 설명하기위한 기준 그래프 신장트리의 예 위 그래프를 보면 신장트리의 조건에 맞게 정점이 6개이고, 간선이 5개로 이뤄졌음을 알수 있습니다. 추가적으로 각 정점에서 다른정점으로 가는 경로가 존재합니다. 신장트리가 아닌 예 위 그래프를 보면, 일단 왼쪽 그래프는 정점3이 다른정점과 연결되어 있지 않고, 간선의 개수도 부족한 것을 알 수 있습니다.(신장 트리의 간선의 개수는 정점의 개수보다 1개 적어야 합니다) 오른쪽 그래프의 경우, 모든 정점이 연결되있긴 하지만, 신장트리에서 요구하는 간선의 개수보다 많기 때문에 신장트리가 아닙니다.

[알고리즘]최소신장트리의 개념 [내부링크]

최소신장트리MST(Minimum Spanning Tree) 가중치 그래프에서 간선이 합이 최소가 되는 신장트리를 의미합니다. 정리하면 신장트리의 특성상 최소개수의 간선으로 정점들이 연결되있고, 신장트리를 이루는 모든 간선들의 합이 최소여야 합니다. 이러한 특성을 가지기 때문에, 실생활에서 굉장히 많이 사용되는 알고리즘 입니다. 예를들면 항공기의 운행경로를 최적화할 수 있고, 네트워크 분야에서도 많이 사용 됩니다. 최소신장트리를 구하는 대표적인 알고리즘은 프림알고리즘과 크루스칼 알고리즘이 있으며 둘다 그리디 알고리즘을 활용합니다. 그래프를 하나 정의하고 프림알고리즘과 크루스칼 알고리즘으로 최소신장트리를 구해보겠습니다. 최소신장트리에서 사용할 그래프의 정의

[알고리즘]최소신장트리-프림 알고리즘 [내부링크]

프림 알고리즘 프림 알고리즘Prim’s Algorithm은 로버트 프림이 만든 알고리즘 입니다. 임의의 하나의 정점을 선택하고 이를 이을수 있는 주변의 정점 중 최소 가중치를 가지는 간선을 추가하고, 간선의 개수가 신장트리 조건에 맞을때 까지 이를 반복합니다. 정리하면 아래와 같습니다. 1. 임의의 정점을 하나 선택해서 최소신장트리에 추가합니다. 2. 현재 최소신장트리와 연결되어있는 정점중, 가장 가중치가 적은 정점을 추가함(단, 해당 정점을 추가했을때 사이 클을 형성하지 않아야 합니다.) 3. “2.” 과정을 신장트리 조건에 만족할때까지 반복합니다. 실제 그래프를 가지고, 프림 알고리즘을 통해 최소신장트리를 구해보겠습니다. 1단계 임의의 점 하나를 최소 신장트리에 추가 합니다. 여기서는 정점1을 추가 했습니다. 2단계 현재 최소신장트리와 인접한 정점 중, 가중치가 제일 적은 정점을 선택 합니다. 후보는 아래와 같습니다. 정점{1,2}를 잇는 간선 정점{1,4}를 잇는 간선 이 중

[알고리즘]최소신장트리-크루스칼 알고리즘 [내부링크]

크루스칼 알고리즘 크루스칼 알고리즘은 일단, 모든 간선의 가중치를 오름차순으로 정렬을 합니다. 이후에 간선의 가중치가 적은 간선부터 차례대로 신장트리 조건에 충족할때까지 최소신장트리에 추가해가는 방식 입니다. 정리하면 아래와 같습니다. 그래프의 모든 간선을 가중치 기준으로 오름 차순 정렬 합니다. 가중치가 낮은 간선부터 최소신장트리에 하나씩 추가합니다.(사이클을 형성하지 않아야 합니다) “2.”의 과정을 신장트리 조건에 충족할때까지 반복 합니다. 1단계 간선의 가중치를 기준으로 오름차순 정렬한 데이터를 하나 생성 했습니다. start와 end는 간선의 양끝을 나타냅니다.(방향이 없으므로 start와 end는 서로 바뀌어도 무방합니다) value는 간선의 가중치를 나타냅니다. 2단계 가중치가 제일 낮은 간선의 가중치부터 확인 합니다. 정점{2,3}을 잇는 간선을 최소신장 트리에 추가 합니다. 3단계 가중치가 제일 낮은 간선의 가중치부터 확인 합니다. 정점{3,6}을 잇는 간선을 최소신

[알고리즘]동적계획법(DP)의 개념 [내부링크]

동적계획법의 개념 티끌모아 태산이라는 속담이 있습니다. 작은것들을 모아서 큰 것을 이룬다는 의미이지요. 동적계획법Dynamic Programming도 이와 유사한 문제해결기법 입니다. 한번에 풀기 어려운 문제를 여러개의 작은 문제로 쪼갠후, 이 문제들의 해를 활용해서 전체문제를 해결하는 방식입니다. 즉 동적계획법의 핵심은 2가지 입니다. 문제를 쪼개는 과정과, 이를 활용해서 전체문제를 해결하는 과정입니다. 점화식 세우기 동적계획법으로 문제를 해결하는 절차는 아래와 같습니다. 1. 문제를 해결하는 해가 이미 있다고 가정 합니다. 2. 종료조건을 설정 합니다. 3. 1.과 2.를 활용해 점화식을 세웁니다. 예시로 팩토리얼을 동적계획법으로 해결하는 절차를 한번 봅시다. 참고로 N 팩토리얼이란, 1부터 N까지 수들을 모두 곱한 값을 말합니다. [표] 팩토리얼에 대한 점화식을 세우는 과정 해가 있다고 가정 Fact(N) 은 N 팩토리얼 값을 반환해주는 함수라고 가정 합니다. 아직 Fact(N

chatGPT 잘 활용하는법-질문하기 [내부링크]

먼저, ChatGPT는 입력된 문장을 이해하고, 문맥을 파악하여 적절한 결과를 생성하는 인공지능 모델입니다. 따라서 ChatGPT를 활용하여 검색을 할 때에도, 입력되는 검색어를 이해하기 쉬운 형태로 만들어야 합니다. 이를 위해서는 다음과 같은 방법들이 유용합니다. 정확한 검색어 사용 검색어를 입력할 때는 가능한 정확한 단어나 구문을 사용하는 것이 좋습니다. 이를 통해 ChatGPT가 정확한 의미를 파악하여 적절한 결과를 생성할 수 있습니다. 예를 들어, "먹을만한 음식 추천" 대신 "맛있는 음식 추천"과 같이 좀 더 구체적인 검색어를 사용하면 검색 결과가 더욱 정확해집니다. 검색어 토큰화 ChatGPT는 입력된 문장을 토큰화하여 처리합니다. 따라서 검색어를 토큰화하여 ChatGPT에 입력하는 것이 검색 성능을 높이는 데 도움이 됩니다. 이를 위해 다음과 같은 방법들이 유용합니다. 검색어를 띄어쓰기로 구분하여 입력합니다. 검색어를 작은따옴표(')나 큰따옴표(")로 감싸서 입력합니다.

ChatGPT를 이용한 자연어 처리 기술 개발 동향 [내부링크]

자연어 처리 기술은 컴퓨터가 인간의 언어를 이해하고 처리할 수 있도록 하는 기술이며, 최근에는 ChatGPT를 비롯한 딥러닝 기술을 적용하여 대화 시스템, 번역기, 감정 분석 등 다양한 응용 분야에서 발전해왔습니다. 이번에는 ChatGPT를 이용한 자연어 처리 기술 개발 동향에 대해 알아보겠습니다. 대화 시스템의 개발 ChatGPT는 자연어 처리 기술 중 대화 시스템에 많이 활용되고 있습니다. 대화 시스템은 인간과 컴퓨터 간의 대화를 가능하게 해주는 기술로, ChatGPT를 이용하여 자동으로 대화를 생성하는 챗봇 개발에도 활용됩니다. 기계 번역 기술의 발전 ChatGPT는 기계 번역 기술에서도 적용되고 있습니다. 예를 들어, 인간이 이해할 수 있는 언어로 작성된 문장을 다른 언어로 번역하는 과정에서 ChatGPT를 이용하여 번역 과정을 자동화할 수 있습니다. 감정 분석 기술의 개발 감정 분석은 인간의 언어에서 표현된 감정을 컴퓨터가 이해하고 분석하는 기술입니다. ChatGPT를 이용

개발자에게 수학이 필요한 이유 [내부링크]

컴퓨터 과학 분야에서 이산수학과 선형대수학은 매우 중요한 개념들입니다. 이 두 분야는 프로그래밍과 알고리즘 개발에 필수적인 기초 지식으로서, 모든 소프트웨어 개발자에게 필요한 것입니다. 이제 이 두 분야가 왜 필요한지 구체적인 예시를 들어서 설명해보겠습니다. 이산수학 암호학 이산수학은 암호학 분야에서 핵심적인 개념입니다. 암호학은 보안성이 요구되는 정보를 안전하게 전달하고 저장하는 방법을 연구하는 분야입니다. 이산수학에서 배우는 것 중에서는 이항계수, 순열, 조합 등의 확률 및 조합론 개념, 그래프 이론, 유한체 등이 암호학에서 적용되며, 대표적인 예시로 RSA 알고리즘이 있습니다. 그래프 이론 그래프 이론은 이산수학의 핵심적인 개념 중 하나입니다. 이 분야는 다양한 현실 세계의 문제를 그래프로 모형화하여 해결하는 기술입니다. 예를 들어, 길찾기 앱에서 최단 거리 경로를 찾을 때, 그래프 이론을 사용하여 최적 경로를 찾아낼 수 있습니다. 알고리즘 분석 알고리즘 분석은 이산수학의 또

[CPP]배열 [내부링크]

배열이란, 같은 형의 변수를 특정갯수만큼 연속적으로 선언해서 사용할수 있는 타입입니다. 예를들어, 학생 5명의 성적을 관리하는 프로그램을 만들어보겠습니다. 1. 학생 5명에게 3개과목(국어,영어,수학)에대해 점수를 입력받고 2. 각 학생의 점수의 평균을 출력하고 3. 각 과목의점수의 평균을 출력한다. 아래와 같이 구현할수 있을 겁니다. #include<iostream> using namespace std; int main() { double korean1 = 0; double korean2 = 0; double korean3 = 0; double korean4 = 0; double korean5 = 0; double math1 = 0; double math2 = 0; double math3 = 0; double math4 = 0; double math5 = 0; double english1 = 0; double english2 = 0; double english3 = 0; doubl

[알고리즘]정렬의 기본개념 [내부링크]

정렬의 개념 정렬이란, 사용자가 정의한 순서로 데이터를 나열하는 것을 말합니다. 사용자가 정의한 순서는 오름차순/내림차순이 될 수도 있고 임의의 조건이 될수도 있습니다. 예를들면 {7,5,3,9,11,7} 이라는 데이터가 있고, 사용자가 정의한 순서가 “오름차순” 이라면 {3,5,7,7,9,11}과 같이 데이터가 나열됩니다. 정렬의 필요성 모든 알고리즘은 필요에 의해 만들어졌습니다. 정렬은 어떤 경우에 필요할까요? 정렬되지 않은 데이터에 비해, 정렬된 데이터는 내가 원하는 데이터를 찾을때 효율이 좋습니다. 편의점에 가셨을때, 물건들이 큰 카테고리별로 정렬이 된 것을 알 수 있습니다. 냉동식품은 냉동식품끼리 모여있고, 같은 브랜드상품도 가까운 위치에 있지요 이것은 소비자들이 물건을 쉽게 찾을수 있도록 도와줍니다. 수학적인 예로는 중앙값 찾기가 있습니다. 아래 두가지 경우중, 여느 경우에 중앙값을 찾기가 쉬울까요? 정렬되지 않은 데이터에서는, 모든 원소를 한번씩 확인해야 중앙값을 알 수

[알고리즘] 삽입정렬 [내부링크]

삽입정렬은, 데이터의 전체 영역이 정렬된 부분과, 정렬되지 않은 부분으로 나눠지면서 정렬이 됩니다. 정렬되지 않은 부분중 맨 앞부분의 데이터를 선택한 후, 정렬된 영역에 해당 데이터를 넣었을때 정렬을 유지 할 수 있도록 삽입합니다. 해당 동작을 반복하면 정렬되지 않은 부분이 없어지고, 정렬된 부분이 증가하면서 최종적으로 모든 데이터가 정렬이 됩니다. 정렬의 과정을 정리하면 아래와 같이 나타낼 수 있습니다. 정렬되지 않은 영역의 데이터중 맨 앞에 있는 데이터를 선택하고 Key라고 합니다. 해당 Key를 기준으로 정렬된 영역의 맨 끝 값을 비교 합니다. 맨 끝의 값이 Key보다 크다면, Key보다 뒤에 있어야 하므로 해당 값을 오른쪽으로 한칸 이동 시킵니다. 맨 끝의 값이 Key보다 작다면, Key보다 앞에 있어야 하므로 유지 합니다. 해당 값 바로 앞에 Key를 넣습니다. 정렬된 영역이 늘어나고, 정렬되지 않은 영역이 줄어 들었습니다. 모든 데이터가 정렬된 영역이 될때까지 2~5를 반

[알고리즘]병합정렬 [내부링크]

병합정렬은 데이터를 쪼개서 각각을 정렬하고, 이를 합치는 과정을 반복하면서 모든 데이터를 정렬하는 방식입니다. 이러한 접근 방식은 문제를 더 작은 문제로 쪼개는 과정을 반복해서 작은 문제 여러개를 풀고 합친다는 의미로 Divide and Conquer라고도 합니다. 정렬의 과정을 나타내면 아래와 같습니다. 주어진 데이터를 현재 기준 반으로 나눕니다. 해당 과정은 데이터의 크기가 1이 될때까지 반복합니다.(Divide and Conquer에서 Divide 과정) 쪼개진 데이터들을 병합합니다.(Divide and Conquer에서 Conquert 과정) 최종적으로 데이터의 크기가 될때까지 병합하는 과정을 반복 합니다. 전체적인 과정을 나타내면 아래와 같습니다. 그림에서 보면 데이터의 크기가 1이 될때까지 나누고, 이후 병합을 하는 것을 볼 수 있습니다. 병합정렬의 핵심알고리즘은 병합하는 과정 입니다. 데이터가 병합이 될때마다, 전체의 관점에서 보면 부분데이터들이 정렬이 되고, 이게 최종

[알고리즘]힙정렬 [내부링크]

힙 정렬은, 힙이라는 자료구조를 통해 정렬을 하는 방식 입니다. 따라서, 데이터를 힙 자료구조 형식으로 나타내는 방법을 먼저 알아보고, 이를 통해서 최종적으로 정렬되는 방법을 알아보는 순서로 설명이 진행됩니다. 힙 정렬을 하는 과정을 간단하게 나타내면 아래와 같습니다. 1. 정렬되지 않은 데이터를 힙 형식으로 저장 합니다. 2. 힙 형식으로 저장된 데이터를 정렬합니다. 힙 자료구조는 트리 형식으로 되어있으며, 루트노드가 정렬이 되었을때 가장 맨 처음 오게 되는 원소가 됩니다. 루트노드를 빼고, 다시 힙을 구축하는 과정을, 모든 데이터가 정렬될 때까지 반복 합니다. 힙의 정의 힙 자료구조는, 일정한 규칙이 있는 트리로 되어 있습니다. 보통 최대힙/최소힙이라고 많이 불리는데, 최대힙의 경우 부모노드가 무조건 자식 노드보다 큰 트리구조 이고, 최소힙은 부모노드가 무조건 자식 노드보다 작은 트리구조 입니다. 아래는 최대힙 이라고 할 수 있습니다. 사진 설명을 입력하세요. 아래는 최소힙이라고

[알고리즘]위상정렬 [내부링크]

위상정렬의 개념 위상정렬Topological Sort은 일의 순서가 있는 작업을, 순서에 맞게 정렬해주는 알고리즘 입니다. 대부분 우리가 하는 일에는 순서가 있습니다. 예를 들어 수육을 만들고, 상을 차리는 과정을 나타내면 아래와 같습니다. 위 그림을 보면 각 일의 순서가 있는 것을 알 수 있습니다. 고기를 넣으려면, 냄비에 물이채우고 가열을 해야함과 동시에, 고기가 손질되어 있어야 함을 알 수 있습니다. 이렇게 위상정렬은, 일의 순서 자체가 중요하기 때문에, 반드시 간선의 방향이 있어야 합니다. 이런 특성 때문에, 이전 배웠던 그래프 종류는 DAG가 되야 위상정렬을 할 수가 있습니다. 싸이클이 존재하거나 간선의 방향이 없으면 일의 방향이 명확하게 결정되지 않기 때문 입니다. 위상정렬의 과정 위상정렬에서 가장 중요한 것은 일의 순서가 있다는 것입니다. 위상정렬의 핵심동작은 아래와 같습니다. 먼저, 바로 진행할수 있는 일을 찾습니다. 자신을 향한 화살표가 없는 일의 경우엔, 사전작업이

[알고리즘]계수정렬 [내부링크]

계수정렬Counting Sort을 한마디로 표현하면, 데이터에 의존하는 정렬 방식입니다. 지금까지 정렬 방식을 보면 사용자가 정한 특정한 기준에 따라 정렬 했습니다. 계수정렬C의 경우에는, 각 데이터 값의 빈도수를 가지고 정렬 합니다. 예를들어, 아래 왼쪽의 데이터들의 빈도수를 나타내면 아래와 같습니다. 계수정렬의 과정 계수정렬의 과정은 2가지 과정으로 이뤄집니다. 각 데이터의 빈도수를 카운팅 합니다. 우선순위가 높은 데이터부터, 카운팅한 만큼 출력 합니다. 실제 데이터를 가지고, 정렬하는 과정을 한번 보겠습니다. 1단계 원본 데이터 입니다. 해당 데이터를 카운팅 정렬로 정렬해보겠습니다. 2단계 해당 데이터의 각 값에 대해 빈도수를 카운팅 합니다. 3단계 ①을 넣습니다. ①은 개수가 2개이므로 맨 앞부터 2개 넣습니다. 4단계 ②를 넣습니다. ②는 개수가 2개이므로 ①을 삽입한 영역 바로 뒤에서 부터, 2개 넣습니다. 5단계 ③을 넣습니다. ③은 개수가 1개이므로 ②를 삽입한 영역

[알고리즘]정렬의 하한 [내부링크]

알고리즘에서 하한이란, 해당 알고리즘이 도달할 수 있는 최대 성능 이자 한계를 말합니다. 즉 해당 알고리즘을 계속 연구해서 성능을 개선한다고 해도, 하한보다 성능이 좋아질수는 없습니다. 정렬의 하한에 대해 알아봅시다. 일단 정렬은 크게 비교정렬Comparison Sort과 비비교정렬Non-comparison Sort 2가지로 분류가 가능합니다. 비교 정렬이란, 사용자가 정의한 조건에 따라 값을 비교하면서 하는 정렬을 의미합니다. 따라서 데이터에 의존적이지 않고 정렬이 가능합니다. 앞에서 배웠던 삽입정렬,합병정렬,힙정렬이 이에 해당 됩니다. 비비교정렬이란, 데이터에 의존하는 정렬을 말합니다. 데이터에 의존하기 때문에 적용할 수 있는 범위가 제한됩니다. 앞에서 배웠던 계수정렬이 이에 해당 됩니다. 비비교정렬의 경우 데이터에 의존하므로 하한 자체가 의미가 없습니다. 비교정렬의 경우 하한의 경우는 아래와 같은 방식으로 유추할수 있습니다. 데이터 3개를 정렬시키는 과정을 생각해 봅시다. 각각

[알고리즘]시뮬레이션의 개념 [내부링크]

시뮬레이션 시뮬레이션 개념 시뮬레이션 이란, 문제에 주어진 상황을 완벽하게 이해하고, 이를 코드로 그대로 구현하는 것입니다. 다른 알고리즘은 성능에 중점을 둔 반면에, 시뮬레이션은 구현에 초점을 맞춘 것입니다. 대부분 게임이나 상황을 제시하고, 문제에서 원하는 순간의 상황을 확인하는 문제가 많습니다. 시뮬레이션의 과정 시뮬레이션 알고리즘을 일반화 하는 것은 불가능 합니다. 다른 알고리즘처럼 정해진 문제를 풀기위한 알고리즘이 아니고, 주어진 문제에 따라 해결방식이 결정되는 알고리즘이기 때문입니다. 일반적으로 문제에 접근하는 방식이라고 보시면 좋을것 같습니다. 하나의 문제를 최대한 여러개로 분리합니다. 시뮬레이션 문제에서 어려움을 겪는 부분은 문제에 대한 이해가 아니고, 구현시 코드가 복잡해지기 때문입니다. 조급한 마음에 문제를 분리하지 않은 상태에서 구현하려고 하면, 하나의 함수에서 문제에서 제시한 모든 동작을 구현하게 될 확률이 높습니다. 예외처리가 추가로 필요한 경우, 해당 부분에

if문을 잘 활용하는 방법 [내부링크]

if문이 무엇인지는 알려주지만, 이것을 잘 활용하는 방법에 대해서는 언급하는 곳이 많지 않은것 같습니다. 경험에서 우러나와야 하니까요 이 부분을 정리해봤습니다. C에서 조건문을 구현할 때 코드 가독성과 유지 관리성을 향상시키는 것을 목표로 하는 깨끗한 코드의 원칙을 고려하는 것이 중요합니다. 다음은 C에서 깔끔한 방식으로 조건문을 구현하기 위한 몇 가지 팁입니다. 의미있는 이름 사용 변수, 함수 및 조건문에 대해 의미 있는 이름을 사용하여 코드를 더 읽기 쉽게 만드는게 좋습니다. 한 글자로 된 변수 이름을 사용하는 대신 변수의 목적을 정확하게 반영하는 이름을 사용해야 합니다. 조건문도 마찬가지입니다. x 대신 is_valid와 같이 조건을 설명하는 이름을 사용해야 합니다. 중첩 방지 코드를 읽고 유지하기가 더 어려워질 수 있으므로 가능한 한 조건문을 중첩하지 않는게 좋습니다. 중첩되는 if문 대신 중첩하지 않는 방식의 if문을 고민해보는것도 좋습니다. 다음은 이러한 팁을 문자열이 유

[알고리즘]깊이우선탐색(DFS) [내부링크]

깊이우선탐색 깊이우선탐색은 더 이상 탐색할 정점이 없을떄 까지 간선을 계속 타고 갑니다. 더이상 탐색할 정점이 없으면 가장 최근에 방문한 정점 중, 탐색할 정점이 남은 정점에서 탐색을 계속 진행 합니다. 다시 정리해보면, 구현을 할때 핵심적인 부분은 아래와 같습니다. 1. 탐색할 정점이 없을때까지 간선을 타고 내려갈 수 있어야 합니다. 2. 가장 “최근에” 방문한 정점을 알아야 합니다. 3. 이미 방문한 “정점”인지 확인 할 수 있어야 합니다. 이를 적용해서, 아래 그래프를 깊이우선탐색 해봅시다. 인접행렬로 그래프 표현 동작 자체를 이해하는건 쉬운데, 구현하는 입장에서 생각하면 직관적이지 않습니다. 더 이상 연결된 정점이 없을때, 가장 최근 방문한 정점에서 방문하지 않는 정점을 어떻게 찾을 수 있을까요? STACK을 활용하면 이를 쉽게 해결할 수 있습니다. STACK은 기본적으로 선입후출(First In Last Out)구조를 가지고 있습니다. 특정 정점 방문시, 방문여부를 체크하고

Visual Studio를 활용한 코딩 기법 [내부링크]

1. Visual Studio를 활용한 디버깅 기법 - break point 2. Visual Studio를 활용한 디버깅 기법 - 함수단위로 실행 3. Visual Studio를 활용한 디버깅 기법 - call tracing [강의자료] https://docs.google.com/presentation/d/1SfaOJZcmmffTnFlyn2WvlQL5pNcK1WdpgPj-xz-Xp3U/edit?usp=sharing Visual Studio를 활용한 코딩 기법 코딩테스트에 중요한 코딩기법 https://blog.naver.com/dreamimplement docs.google.com https://www.youtube.com/watch?v=sPhCqNs58bU&feature=youtu.be

[CPP]Modern CPP의 변화과정 [내부링크]

C++11에서 C++20까지의 변화는 매우 많습니다. 이전에는 더 이상 새로운 C++ 기능이 추가되지 않을 것으로 생각되었지만, C++ 표준 위원회는 C++ 언어를 계속 발전시키고, 최신 플랫폼과 요구사항에 맞게 업그레이드해 나가고 있습니다. C++11, C++14, C++17, C++20에서의 주요 변화와 업그레이드 경험을 다음과 같이 살펴보겠습니다. 공감수가 많으면 이부분도 한번 정리해보겠습니다. C++11 C++11은 이전 버전의 C++과 비교하여 많은 변화를 가져왔습니다. C++11에서는 다음과 같은 주요 기능들이 추가되었습니다. 1. 람다 표현식(Lambda Expressions) 2. 스마트 포인터(Smart Pointers) 3. 멀티 스레딩 지원(Thread Support Library) 4. 범위 기반 for 루프(Range-based For Loop) 5. 이동 생성자(Move Constructor)와 이동 대입 연산자(Move Assignment Operator)

프로그래밍 패러다임-함수형 프로그래밍 [내부링크]

개념 함수형 프로그래밍(Functional Programming)은 부작용(side effect)을 최소화하고, 순수 함수(pure function)를 사용하여 프로그래밍하는 패러다임입니다. 부작용이란, 함수가 실행됨으로써 외부 상태를 변경하거나, 다른 함수나 외부 환경에 영향을 끼치는 것을 말합니다. 이에 반해 순수 함수는 입력값에 대해서만 계산을 수행하며, 외부 상태에 영향을 주지 않습니다. 함수형 프로그래밍은 람다 계산법(lambda calculus)과 함수형 프로그래밍 언어인 LISP와 ML 등에서 시작되었습니다. 이후 Haskell, Scala, Clojure 등의 언어에서 함수형 프로그래밍이 보다 발전하였습니다. 함수형 프로그래밍은 다음과 같은 장점들을 가지고 있습니다. 1. 병렬 처리에 용이합니다. 부작용이 없기 때문에, 각각의 함수들은 서로간에 독립적이기 때문에 병렬 처리가 쉽습니다. 2. 코드의 재사용성과 유지 보수성을 높일 수 있습니다. 순수 함수는 입력값에 대해서

[책 추천]Code Complete [내부링크]

[책 이름] Code Complete [저자] 스티브 맥코넬(Steve McConnell) [이유] 코드 컴플리트(Code Complete)는 스티브 맥코넬(Steve McConnell)이 저술한 소프트웨어 개발의 전반적인 과정에 대한 실용적인 가이드북입니다. 이 책은 소프트웨어 개발자를 비롯한 다양한 IT 전문가들에게 꼭 필요한 책으로 자리 잡았습니다. 책의 내용은 2부로 나뉘어져 있습니다. 첫 번째 부분에서는 소프트웨어 개발의 전반적인 과정에 대해 설명하고, 두 번째 부분에서는 코딩의 기초를 다루며 실제로 코드를 작성하는 방법에 대해 다루고 있습니다. 이 책은 개발 생산성을 높이고 코드 품질을 향상시키기 위한 방법론과 기술을 다루고 있으며, 다양한 언어와 플랫폼에서 적용 가능합니다. 각 장마다 다양한 예시와 코드 조각, 그리고 실제 프로젝트에서 발생한 문제들을 해결하는 방법을 다루고 있습니다. 이 책은 코드 작성에서 고려해야 할 모든 요소들을 다루고 있기 때문에, 개발자들에게 코

[책 추천]클린코드(Clean Code) [내부링크]

[이름] Clean Code [저자] 로버트 C. 마틴(Robert C. Martin) [이유] 현업에서 실제로 많이 사용되는 기술과 개발 방법론 등에 대한 내용을 다루고 있기 때문입니다. 또한, 이 책에서는 코드 작성 시 유의해야 할 규칙과 권장사항을 자세히 설명하고 있으며, 이를 통해 좀 더 깨끗하고 유지보수가 용이한 코드를 작성하는 방법을 제시합니다. 이 책에서 가장 인상 깊었던 부분은 "의미 있는 이름을 사용하라"와 "함수는 한 가지 일만 하라"라는 내용입니다. 코드 작성 시 변수, 함수, 클래스 등에 의미 있는 이름을 사용하는 것은 매우 중요합니다. 또한, 함수는 한 가지 일만 수행하도록 작성해야 유지보수가 용이하며, 오류 발생 시 원인을 찾는 것도 더욱 쉬워집니다. 이 책은 코드 작성에 대한 기본 원칙을 다루고 있기 때문에, 프로그래밍 초보자부터 숙련된 개발자까지 모두 읽을 수 있는 책입니다. 코드를 작성할 때 기본적으로 지켜야 할 원칙들을 알고 있으면 더 나은 코드를 작

[빅데이터]가트너-The Big Data Value Model [내부링크]

개념 "The Big Data Value Model"은 2015년 가트너 그룹에서 발표한 모델입니다. 이 모델은 빅데이터 분석의 가치 창출과 활용을 다양한 관점에서 분류하여 정리하였습니다. 즉, 이 모델은 기업이 빅데이터 분석을 활용하여 어떻게 가치를 창출할 수 있는지에 대한 방법론을 제시하는 것입니다. 모델은 다양한 분야에서 빅데이터 분석을 활용하여 얻을 수 있는 가치를 4가지 주요 목적으로 분류하고 있으며, 이를 기반으로 기업은 자신의 목적에 따라 빅데이터 분석을 진행할 수 있습니다. 이 모델은 빅데이터 분석을 좀 더 체계적으로 이해하고, 기업이 빅데이터 분석을 활용하여 비즈니스 가치를 창출할 수 있는 방안을 제시하는 데에 큰 도움을 줍니다. 구체적인 사례 가트너 그룹이 제시한 "The Big Data Value Model"에서 분류한 빅데이터 분석의 주요 활용 목적들에 대해 사례를 기반으로 정리해보겠습니다. Customer Insight 고객 인사이트는 빅데이터 분석의 가장 대

[빅데이터] 3V [내부링크]

빅데이터는 Volume, Velocity, Variety 세 가지 V의 특성을 갖고 있습니다. 이 세 가지 특성은 빅데이터를 정의하는 핵심적인 특징으로, 빅데이터의 처리와 분석 방법에 있어서도 중요한 역할을 합니다. Volume (양) 빅데이터는 일반적인 데이터보다 훨씬 많은 양을 갖고 있습니다. 이전까지는 대부분의 데이터가 텍스트 파일 등의 형태로 저장되어 있었지만, 현재는 사물인터넷(IoT), 모바일 등 다양한 디바이스로부터 발생하는 대규모 데이터가 지속적으로 생성됩니다. 이러한 데이터를 처리하려면 고성능 컴퓨팅 자원과 분산 처리 기술 등이 필요합니다. 페이스북은 매일 수백억 건의 게시글, 사진, 동영상 등의 데이터가 생산됩니다. 한 대의 차량이 1초마다 생성하는 센서 데이터는 1GB 이상입니다. 의료 산업에서는 수천 개의 환자 데이터를 수집하고 분석합니다. Velocity (속도) 빅데이터는 데이터 생성 속도가 매우 빠릅니다. 예를 들어, 온라인 쇼핑몰에서는 수많은 고객들이 매

좋은질문이란 무엇일까? [내부링크]

질문을 잘하는게 왜 중요한가? 스마트한 질문은 문제 해결과 학습을 더욱 효과적으로 도와줍니다. 스마트한 질문은 다양한 정보를 수집하고, 문제를 이해하고, 새로운 아이디어를 발굴하는 데 도움을 주며, 상호작용과 협력에도 큰 역할을 합니다. 스마트한 질문은 문제 해결 과정에서 중요한 역할을 합니다. 문제 해결을 위해서는 문제의 본질을 파악하고, 관련된 정보를 수집하고, 그 정보를 분석하여 해결책을 도출하는 것이 필요합니다. 이 때 스마트한 질문을 통해 문제를 이해하는 것이 매우 중요합니다. 스마트한 질문은 문제를 더욱 정확하게 이해할 수 있도록 도와주며, 문제 해결에 필요한 정보를 수집하고, 이를 분석하여 문제를 해결하는 데 도움을 줍니다. 스마트한 질문은 학습에도 중요한 역할을 합니다. 학습은 지식을 습득하고 이를 활용하는 것입니다. 스마트한 질문을 통해 지식을 습득하고 이를 바탕으로 문제를 해결하는 것은 학습에 큰 도움이 됩니다. 스마트한 질문은 새로운 아이디어를 발굴하는 데에도 큰

코딩테스트 문제해석시 필요한 과정 [내부링크]

문제를 해결하기 위해 올바른 알고리즘과 데이터 구조를 선택하는 경우 초보자 개발자에게 어려운 경험이 될 수 있습니다. 그러나 약간의 연습과 준비를 통해 자신 있게 코딩 테스트 문제에 접근하고 원하는 결과를 얻을 수 있습니다. 다음은 코딩 테스트 문제에 효과적으로 접근하는 데 도움이 되는 몇 가지 팁입니다. 문제를 주의 깊게 읽기 요구 사항과 제약 조건을 이해하려면 문제 설명을 여러 번 읽으십시오. 솔루션에 영향을 줄 수 있는 극단적인 경우를 기록해 두십시오. 문제 유형 식별 문제가 정렬, 검색 또는 그래프 이론과 같은 일반적인 범주에 속하는지 확인합니다. 이렇게 하면 사용할 알고리즘과 데이터 구조를 더 잘 이해할 수 있습니다. 알고리즘 및 데이터 구조 학습 다양한 알고리즘과 데이터 구조에 익숙해지고 각각을 언제 사용해야 하는지 이해합니다. 자습서, 비디오 및 온라인 코스와 같이 학습에 도움이 되는 많은 리소스를 온라인에서 찾을 수 있습니다. 종이에 문제 풀기 코딩을 시작하기 전에 솔

파이썬이 많이 사용되는 이유 [내부링크]

Python의 장점에 대해 알아봅시다. Python은 웹 개발에서 과학 컴퓨팅 및 데이터 분석에 이르기까지 다양한 응용 프로그램에 널리 사용되는 배우기 쉬운 고급 프로그래밍 언어입니다. Python이 훌륭한 언어인 몇 가지 이유는 다음과 같습니다. 배우기 쉬움 Python은 읽고 쓰기 쉬운 단순하고 직접적인 구문을 가지고 있어 초보자 프로그래머에게 훌륭한 선택입니다. 이 언어는 가독성에 중점을 두고 복잡한 구문을 덜 강조하여 배우기 쉽게 설계되었습니다. 다재다능함 Python은 웹 개발에서 과학 컴퓨팅 및 데이터 분석에 이르기까지 다양한 응용 프로그램에 사용됩니다. 다양한 프로그래밍 영역을 탐색하고 관심 있는 것을 찾을 수 있으므로 초보 프로그래머에게 탁월한 선택입니다. 대규모 커뮤니티 및 광범위한 라이브러리 Python에는 크고 활동적인 사용자 커뮤니티가 있습니다. 즉, 언어를 배우고 프로그래밍을 시작하는 데 도움이 되는 많은 리소스가 있습니다. 또한 Python에는 광범위한 표준

[알고리즘]백트래킹 개념 [내부링크]

백트래킹의 개념 원하는 답을 찾는 방법은 여러가지가 있습니다. 주어진 데이터를 전부 확인하는 방법이 있습니다. 가장 쉽게 떠올릴수 있는 방법이고 답을 찾는게 보장되는 확실한 알고리즘 입니다. 하지만 어떤 문제에서는, 모든 경우를 전부 탐색하는 것은 비효율적인 경우가 많습니다. 예를 들어 출근하면서 집에다 시계를 놓고온 경우에, 내가 사는 아파트를 전부 뒤지는 경우는 없을 겁니다. 보통의 경우에는 본인의 집에서 시계를 찾을 것입니다. 왜냐하면 시계가 내 집에 있는건 확실하니까요. 백트래킹Backtracking도 이와 비슷한 알고리즘 입니다. 내가 원하는 답을 찾을때, 전체탐색을 하지 않고 답이 존재할 가능성이 있는 경우만 탐색을 진행합니다. 이것을 그림으로 나타내면 아래와 같습니다. 백트래킹 동작의 예시 전체탐색의 경우엔 옆집도 보고, 내집도 보는 탐색방법이라고 보시면 됩니다. 백트래킹을 할경우, 옆집은 탐색대상이 아니기 때문에, 더이상 탐색을 진행하지 않고, 내집만 탐색합니다. 이때

[알고리즘]백트래킹-sum of subset [내부링크]

Sum of subset Sum of subset 문제에 대해 정의하면 아래와 같습니다. 1부터 N까지 숫자를 조합했을때 , 합이 K가 되는것을 찾는 문제 입니다. 우리가 해결해야 할 문제는 N이 4이고 K가 5라고 합시다. 이때, 가능한 조합은 {①,④},{②,③}이 될 것입니다. 해당 문제를 bruteforce와 backtracking 방식으로 접근해보겠습니다. Brute force 방식 각 숫자마다 뽑는경우와, 뽑지 않는경우 2가지 상태가 존재합니다. 따라서 시간복잡도는 N개의 숫자가 있는경우 O(2N)이라고 할 수 있습니다. 아래는 N이 4일때의 예시 입니다. 백트래킹 방식 물론 Brute Force의 경우에도 가능한 모든 경우를 탐색하므로, 문제가 풀립니다. 하지만 필요없는 탐색을 하는 경우가 있습니다. 유망 함수는 아래와 같이 정의할수 있습니다. 첫째, 이미 현재 조합으로 합이 K가 된경우가 있습니다. 이럴경우 더이상 탐색하지 않아도 됩니다. 둘째, 해당 숫자를 추가했을때

[알고리즘]백트래킹-N Queen [내부링크]

N Queen 해당 문제에서 Queen은 체스의 Queen을 말합니다. N Queen 문제에 대해 정의하면 아래와 같습니다. N Queen이라는 것은 NXN 체스판에 N개의 Queen을 배치시켰을때, 서로를 공격할수 없는 위치에 놓는 문제 입니다. 단 체스판에서 각 열당, Queen은 한개만 위치할 수 있습니다. 예를 들어 설명 할때는 N을 4로 해서 설명드리겠습니다. Queen의 이동범위는 8방향으로 쭉 뻗어나갈수 있습니다. 아래는 Q가 이동할수 있는 범위를 나타낸 그림입니다. X는 Q가 현재 위치기준으로, 한번에 움직일수 있는 공간을 나타냅니다. 이제 Queen들간 서로 공격할수 없는 위치에 놓인 경우와, 공격할 수 없는 위치에 놓인 경우에 대한 예시를 보겠습니다. 아래는 Queen들간 서로 공격이 가능한 경우 입니다. Q1이 이동가능한 범위에 Q2의 위치가 포함 되있습니다. 역으로 Q2의 이동가능한 범위에 Q2의 위치가 포함 되있습니다. Queen의 이동범위가 8방향으로 쭉 뻗

[알고리즘] 그래프의 개념(용어) [내부링크]

그래프의 용어 어원을 살펴보면, 그래프는 무언가를 쓰거나, 묘사하고 그리는 것을 말합니다. 알고리즘에서 다루는 그래프들은 데이터들 간 관계를 표현했다고 보시면 됩니다. 일단 간단한 그래프를 보면서, 그래프 자료구조에서 사용되는 용어정리부터 해보겠습니다. 그래프 구성요소 위 그림에서 파란색 동그라미안에 각 데이터들이 있는것을 볼수 있습니다. 이와같이 그래프를 구성하는 각 데이터들을 정점Vertex이라고 합니다. 정점과 정점을 잇는 선이 있습니다. 이를 간선Vertex라고 합니다. 간선은 가중치를 가질 수 있습니다. 마트에서 꽃집을 보시면 이 둘을 잇는 간선이 있고, 그 위에 30이라고 써져있는 것을 볼 수 있습니다. 이를 가중치Weight라고 합니다. 그래프의 종류 무방향 그래프 정점 사이를 잇는 간선의 방향이 없는 그래프를 의미합니다. 간선의 방향이 없으므로, 정점이 연결되었는지 여부만 판단합니다. 아래 그래프 A/B 모두 무방향 그래프 입니다. 무방향 그래프는 가중치와는 연관이 없

파이썬 - 변수의 타입 [내부링크]

파이썬의 특징 파이썬은 1990년대 초 Guido van Rossum이라는 개발자가 만든 언어 입니다. 최근들어 파이썬은 웹 개발, 데이터 프로그래밍, 인공지능 등 다양한 분야에서 많이 사용되고 있으며, 코딩테스트를 준비하는 학생들 사이에서도 가장 많이 사용되는 언어 입니다. 본 책에서도 모든 알고리즘 문제를 파이썬으로 설명하고 있습니다. 왜 파이썬일까요? 첫 째, 가용성Availability 입니다. 파이썬은 오픈 소스 언어이므로, 모든 개발자들이 무료로 사용할수 있으며, 모든 운영체제에서 제한 없이 사용가능 합니다. 둘 째, 가독성Readability 입니다. 파이썬 코드는 쉽게 작성할수 있고, 쉽게 이해할 수 있습니다. 그리고 많은 라이브러리가 제공되기 때문에 세부적인 구현이 아닌, 핵심동작을 구현하는데 집중할 수 있습니다. 셋 째 커뮤니티Community 입니다. 오픈소스 기반이고, 사용하는 개발자들이 많기때문에 커뮤니티 자체가 활발하빈다. 따라서 개발과정에서 내가 원하는 정

파이썬-컬랙션(기본개념) [내부링크]

컬렉션 타입 컬렉션은 여러 개의 값을 담는 자료형을 말합니다. 대표적으로 리스트List,튜플Tuple,딕셔너리Dictionary, 셋Set 문자열 String등이 있습니다. 그리고 이 컬렉션들은 데이터의 수정 가능 여부에 따라 변경가능한객체Mutable Object와 변경불가능한객체Immutable Object 이렇게 2개로 구분 됩니다. 먼저 변경가능한객체와, 변경 불가능한객체 개념에 대해 설명드리고 언급한 컬렉션을 간단하게 하나씩 설명하겠습니다. 변경가능한 객체 변경가능한객체는, 객체가 생성된 후 객체를 수정할 수 있습니다. 리스트,딕셔너리,셋이 대표적인 예 입니다. 예시코드를 보시면 변경불가능한객체의 동작을 이해하기 쉽습니다. my_list = [1, 2, 3, 4, 5] # ① 리스트 객체 생성 my_list[4] = 6 # ② 리스트의 원소 변경 print(my_list) # 출력값: [1, 2, 3, 4, 6] 코드에 대한 상세설명은 아래 표를 참조하시면 됩니다. 리스트에

파이썬-컬랙션(리스트) [내부링크]

리스트의 개념 리스트는 시퀀스 형태를 가지는 자료형입니다. 쉽게 말해서 순서가 존재합니다. 이런 특성으로 인해 인덱싱과 슬라이싱이 가능합니다. 먼저 인덱싱은 다른 프로그래밍언어에서 배열을 인덱스로 접근하는것과 같다고 보시면 편합니다.(엄연히 말하면 추가적인 부분도 있지만, 코딩테스트에 필요한 문법만 다루겠습니다.) 정리하면 리스트에서 “[]”를 통해 특정 위치의 원소에 접근할수 있습니다. 예시코드는 아래와 같습니다. my_list = [1,2,4] # 값 추가 my_list.append(6) print(my_list) #① 출력값 : [1, 2, 4, 6] # 값 삭제 del my_list[2] print(my_list) #② 출력값 : [1, 2, 6] # 인덱싱 print(my_list[2]) #③ 출력값 : 6 print(my_list) #④ 출력값 : [1, 2, 6] 코드의 상세동작은 아래 표를 참조하시면 됩니다. [표] 리스트의 상세동작 리스트선언 리스트를 선언합니다. 1

코딩테스트 공부하는방법 [내부링크]

안녕하세요 알고리즘에 대한 강의는 많은것 같은데, 정작 어떻게 공부해야 하는지 알려주는 강의는 없는것 같아서 준비 해봤습니다. 어떤방식으로 공부를 해야하고, 코딩테스트 시험을 응시할때 좋은 전략에 대해 다뤄봤으니 관심있는 분은 봐주세요 반응이 좋으면 주기적으로 문제풀이 강의 같은걸 꾸준히 올려보겠습니다. 혹시 듣고싶은 강의주제나, 이런 부분은 좀더 세심하게 다뤄줬으면 좋겠다는 부분이 있으면 댓글 달아주세요^^ 오늘도 화이팅 입니다. 커리큘럼 알고리즘이란? Pseudo coding(의사 코드) 문제를 해석하는 순서 코드로 구현하는 과정 공부하면서 정리하는 방법 강의자료 https://docs.google.com/presentation/d/10Kw-Ntt0SBgGzu1NizS9bUhKPcouEPq14sCssHUZhFc/edit?usp=sharing 코딩테스트 대비 코딩테스트 대비 cafe.naver.com/dremdeveloper docs.google.com 강의 영상 https://y

파이썬-컬랙션(튜플) [내부링크]

튜플은 변경불가능한 컬렉션 입니다. 따라서 리스트와는 달리 한번 튜플이 생성되 면 삽입,삭제가 불가능 합니다. 튜플은 선언할때에는 “()”를 사용 합니다. 예시코드는 아래와 같습니다. 원소가 3개인 튜플을 생성한 것을 알 수있습니다. my_tuple = (1, 2, 3) # 인덱싱 print(my_tuple[0]) # 출력값 : 1 print(my_tuple[1]) # 출력값 : 2 print(my_tuple[2]) # 출력값 : 3 # 슬라이싱 print(my_tuple[1:]) # 출력값 : (2, 3) print(my_tuple[:2]) # 출력값 : (1, 2) print(my_tuple[1:2]) # 출력값 : (2,) 관점에 따라서, 리스트에서는 다 되는데 튜플은 안되는게 있으니 리스트만 사용하면 되는거 아닌가? 라고 충분히 생각하실 수 있습니다. 사실 동작관점에서 보면 틀린생각은 아닙니다. 하지만 튜플의 경우에는 불가변한 자료형이기 때문에 같은 데이터를 저장할때 메모리를

파이썬-문자열 [내부링크]

문자열은 문자들의 집합의 형태로 구성된 변경 불가능한 컬렉션 입니다. 큰 따옴표나 작은따옴표로 문장을 감싸는 형태로 되어있습니다. 문자열을 선언하는 부분부터 알아보겠습니다. 아래 예시코드를 보시면 금방 이해가 되실 겁니다. 아래와 같이 초기화를 할때에는 큰따옴표와 작은따옴표 모두 가능합니다. string = "Hello, World!" # 큰 따옴표 사용 string2 = 'Hello, World!' # 작은 따옴표 사용 print(string) #출력값 : Hello, World! print(string2) #출력값 : Hello, World! 다음은 문자열을 추가하고 삭제하는 동작입니다. 분명히 문자열은 변경불가능한 컬렉션이라고 했습니다. 문자열에서 원소를 추가,삭제하는 작업은 현재 참고하고 있는 객체의 값을 수정하는게 아니고, 새로운 객체를 반환하는 것입니다. 일단 문자열의 추가 예시코드를 보여드리고, 상세히 설명드리겠습니다. string = "He" # ① string +=

파이썬-함수 [내부링크]

함수의 정의 함수는 프로그램에서 작업을 하는데 중요한 요소 입니다. 함수는 def라는 예약어를 활용하며, 구성요소는 함수의 이름,매개변수Parameter,수행되는 코드,반환값 입니다. 함수를 호출할 때는 함수의 이름을 사용 합니다. 예시코드를 활용해서 설명드리겠습니다. ①함수의 이름은 function_name이고 매개변수는는 param1,param2…paramN까지 있는걸 알수 있습니다. 매개변수는 없을수도 있습니다. 다음으로 ② 실제 함수를 호출하면 실행된 코드들이 나열 됩니다. ③함수에는 반환값이 존재할수 있습니다. 함수가 종료되는 순간 특정 값을 반환할수 있습니다. 이는 필수는 아니며, 반환값이 없는 함수도 존재 합니다. def function_name(param1, param2, param3...,paramN): #① # ② 함수의 실행 코드 # ... # ... return result #③ 반환 값 함수의 호출 함수를 정의한 후에는 함수를 호출할수 있습니다. 함수를 호출할

VS(Visual Studio) 설치하기 [내부링크]

안녕하세요, 일단 첫시간은 개발을 할 수 있는 툴을 설치 하는 시간 입니다. 저희는 Visual Studio를 활용할 계획입니다. 일단 아래에서 무료로 다운 받을 수 있습니다. https://visualstudio.microsoft.com/ko/vs/community/ Visual Studio 2022 커뮤니티 버전 – 최신 무료 버전 다운로드 Windows, Android 및 iOS용 최신 개발자 앱을 만들기 위한 모든 기능을 갖춘 확장 가능한 무료 IDE를 사용해 보세요. 지금 무료로 커뮤니티를 다운로드하세요. visualstudio.microsoft.com 해당 페이지 에서 아래를 누릅니다. 1. 아래와같이 다운받은 파일을 실행합니다. 2. 실행하면 아래와 같은 화면이 나올겁니다. 계속을 누릅니다. 3. 노란색으로 체크한 부분을 주목합니다. - C++을 사용한 데스크탑 개발 부분에 체크 표시를 하고 - 다운로드하는 동안 설치라고 뜬걸 확인한 후 설치를 누릅니다. "다운로드하는

vs(visual Studio) 프로젝트 생성 [내부링크]

안녕하세요 오늘은 실제 프로그래밍 전에 프로젝트를 생성하는 법을 배우겠습니다. 하나의 프로젝트 안에는, 여러게의 header file과 source file이 존재 할 수 있습니다. header file과 source file에 대해서는 다음 포스팅에서 설명을 드리는 걸로^^ 일단 프로그래밍 시작전 마지막 단계인, 프로젝트 생성 방법에 대해 알아보겠습니다. 일단 설치했던 Visual Studio 2022를 실행합니다. 설치 하고 처음 시작 전에는 반드시 재부팅을 합니다. 아래 아이콘을 클릭 합니다. 실행 하면 아래와 같은 화면이 뜰겁니다.(첫 실행시에만 뜹니다.) 마이크로소프트 아이디가 있는경우 "1."에서 바로 아이디에 해당 되는 이메일을 써주시면 됩니다. 아이디가 없는경우 "2."에서 계정을 생성하시면 됩니다. 이 후 생성된 계정을 "1."에 입력해주시면 됩니다. 아이디를 입력했다면 "3." 다음을 누릅니다. 이 후 비밀번호 까지 입력하고 로그인 합니다. 다음 화면입니다. 만약

[CPP]표준출력 [내부링크]

이전에 저희는 간단한 프로그램을 작성해봤습니다. 콘솔에 Hello, World라는 문자열을 출력하는 간단한 코드였죠, 이번시간에는 해당 코드를 한번 분석해 봅시다. 먼저 첫줄에 보면 아래와 같은 부분이 보이실 겁니다. #include<iostream> iostream은 표준 입출력이 구현되어있는 헤더파일 입니다. 여러분들이 CPP 개발환경을 구축하게 되면 사용하실수 있는 표준라이브러리 입니다. 헤더파일은 2가지가 있습니다. 1. 표준으로 제공하는 라이브러리에서 제공하는 헤더파일 2. 사용자가 임의로 구현한 헤더파일 표준라이브러리에서는 여러분들이 무언가 프로그래밍할때 사용할수 있는 굉장히 유용한 함수들을 많이 제공합니다. 여러분들을 이것들을 가져다가 사용해서 프로그래밍을 하면 됩니다. 아래 링크를 들어가보시면, 표준라이브러리들을 보실 수 있습니다. 두 필요하지만 여러분은 공부하시면서 아래 헤더파일을 많이 사용하실겁니다. 일단 이해는 안되시겠지만 한번 쑥 훑어보는 것도 좋을것 같습니다.

[CPP]변수-기본타입 [내부링크]

이번 시간에는 변수에 대해서 알아보겠습니다. 우리가 cpp로 프로그래밍을 한다고 가정해봅시다. 출력만 할 수 있는 프로그래밍이라면 그렇게 쓸모있는 프로그램을 만들기 굉장히 어려울 것입니다. 예를 들어 게임을 만들더라도 캐릭터가 죽으면, 이전에 게임을 시작한곳에서 다시 게임이 수행될 수 있어야 합니다. 이를 가능하게 하려면 "게임을 시작한 곳"을 기억하고 있어야 겠죠. 이렇듯 우리는 괜찮은 프로그램을 만들기 위해서는 값을 저장하는 공간이 필요합니다. 이런 역할을 하는것이 변수 입니다. 변수는 2가지로 이루어져 있습니다. 1. Type 2. 이름 Type은 우리가 저장하고 싶은 값의 크기와 형태에 따라 정해집니다. 자주 사용하는 타입을 아래정도가 있습니다. 변수형 역할 int 10진수 정수 float 소수점 표현(유효숫자 7자리) double 소수점 표현(유효숫자 15자리) char 문자 bool true or false type이 정해졌다면, 우리는 unique 즉 유일한 이름을 하나

[CPP]Namespace [내부링크]

namespace란 말그대로 이름 공간입니다. 실생활을 예를 들어봅시다. 철수라는 이름을 가진사람은 우리나라에 굉장히 많습니다. 하지만 우리는 서울에 사는 철수, 영희 친구 철수 이렇게 본인만의 이름공간을 만들어서 철수를 구분할 수 있습니다. CPP에서도 namespace라는 개념이 있습니다. 동일한 이름일지라도, 각 네임스페이스를 정의하고, 이 네임스페이스에 정의할 수 있습니다. 이럴 경우 얻을수 있는 장점은 아래와 같습니다. 1. 변수명이 겹치지 않고 간단해 집니다. 2. 해당 변수가 어디에 속하는지 명확해집니다. 3. 개발은 혼자하는게 아닙니다. 협업을 할때 어느 사람이 작성한 코드인지 명확해집니다. 일단 namespace가 없는 경우를 먼저 봅시다. int main() { int seoul_chulsoo = 32; int daejeon_chulsoo = 41; int gunsan_chulsoo = 555; std::cout << seoul_chulsoo << " " << da

[CPP]조건문-if [내부링크]

이번 시간에는 조건문에 대해서 알아 보겠습니다. 조건문은 복잡한 설명보다는 예제를 보면서 해야 이해가 빠릅니다. 조건문의 형태는 아래와 같이 사용 됩니다. if( expression) { //조건문이 참일때 실행될 문장들 } expression안에 사용되는 문법은 어떤 것들이 있을까요? 가장 가단한게 등호 입니다. 여러분이 알고 계신 그 등호가 맞습니다. 크다, 작다, 크거나 같다, 작거나 같다, 같다 이런 류 입니다. 아래 예제를 한번 보시죠 if문 안에서도 단순히 변수와 상수들을 비교할수도 있고, 연산한 결과를 비교할수도 있고 변수와 변수간 비교도 가능합니다. 물론 상수와 상수 비교도 가능합니다. 두번째 num * 2 > num -3에 주목할 필요가 있는데요. 어떤게 먼저 연산이 되는지가 중요합니다. 부등호는 연산자 중에서도 우선순위가 가장 낮습니다. 즉 제일 나중에 실행됩니다. 따라서 num*2가 계산되고, num-3이 계산된 이후에 크기를 비교한다고 보시면 되겠습니다. #in

[CPP]반복문 [내부링크]

오늘은 반복문에 대해서 알아 보겠습니다. 우리가 프로그램을 만들어서 컴퓨터에 작업을 시키는 이유는 무엇일까요? 일단 우리가 프로그램을에 들이는 시간보다, 이 프로그램을 통해 세이브할수 있는 시간이 훨씬 이득이기 때문일 겁니다. 가장대표적인 예가 반복적인 작업을 하는 것입니다. 사람은 체력이 존재하지만, 컴퓨터는 반복적인 작업에 굉장히 능숙합니다. CPP에는 반복문은 for문 While문이 있습니다. For문 일단 for문의 문법부터 확인해보겠습니다. 초기화 / 판단조건/loop가 한번 수행되고 할 동작은 각각 생략이 가능합니다. for(초기화;반복문을 계속 수행할지 여부를 판단하는 조건, 반복문의 loop가 한번 수행되고 할 동작) { //반복문을 계속 수행할지 여부를 판단하는 조건이 참이면 수행, 조건이 비어있으면 무조건 참이다 } 예를들어서 hello라는 문자열을 10번 출력하는 코드를 아래와 같이 할 수 있습니다. #include<iostream> using namespace

인지적 능력을 활용한 디버깅 방식 [내부링크]

고백을 통한 디버깅 고백을 통한 디버깅(Debugging through confession) 방법은 소프트웨어 버그를 찾기 위한 비공식적인 방법 중 하나입니다. 이 방법은 개발자가 스스로 버그를 찾기 위해 코드나 알고리즘을 다시 검토하고, 문제가 발생한 이유를 자신의 문제 해결 과정을 공개하며 이야기하는 방식으로 이루어집니다. 이 방법은 다른 디버깅 기법들과는 다르게 개발자의 심리적인 요소를 고려하는 방식으로, 개발자들이 자신이 생각하는 문제의 원인을 다른 사람에게 직면하고 설명함으로써 자신이 간과한 부분이나 생각지 못한 측면을 파악하고 수정할 수 있도록 도와줍니다. 이 방법을 사용하려면, 개발자는 자신의 코드나 알고리즘을 다시 검토하고, 문제가 발생한 이유를 찾아내는 것부터 시작합니다. 그리고 자신이 찾은 원인을 다른 개발자나 동료에게 고백하면서 이야기합니다. 이때, 고백하는 과정에서 자신의 생각을 명확하게 표현하고, 고민과 검토 과정을 자세히 이야기하는 것이 중요합니다. 이 방법

기업이 코딩테스트를 선호하는 이유(개인생각) [내부링크]

코딩 시험을 준비하는 학생으로서 기업이 채용 과정에서 코딩을 사용하는 이유를 이해하는 것이 중요합니다. 많은 학생들이 코딩 테스트를 직장에서 수행할 작업과 동떨어진 것으로 보지만 그렇지 않습니다. 회사에서 코딩 테스트를 수행하는 이유와 채용 프로세스에서 코딩 테스트가 중요한 부분인 이유를 살펴봅시다. 제가 코딩테스를 좋아하는 건 아니지만, 피할수 없는 현실인것도 맞습니다. 왜 코딩테스트를 기업이 선호하는지 알면 방향을 잡는데도 도움이 되지 않을까 싶어서 정리해봤습니다. 기술 능력 평가 회사에서 코딩 테스트를 실시하는 주된 이유 중 하나는 지원자의 기술 능력을 평가하기 위한 것입니다. 코딩 테스트는 기업이 후보자가 문제에 접근하는 방식과 코드의 품질을 확인할 수 있는 기회를 제공합니다. 이것은 기술적인 능력이 중요한 소프트웨어 개발 역할에 특히 중요합니다. 문제 해결 능력 측정 코딩 테스트는 지원자의 문제 해결 능력을 측정하는 데에도 사용됩니다. 후보자가 문제에 접근하는 방식과 그들이

CPP를 공부하고나서 해볼만한 것들 [내부링크]

C++ 고급 개념 학습 C++의 기초를 학습한 후 템플릿, 상속, 다형성 및 예외 처리와 같은 고급 개념을 학습하는 것이 좋습니다. 좀 더 많은 책 읽기 입문 및 고급 주제를 모두 다루는 C++ 관련 훌륭한 책이 많이 있습니다. C++ 및 해당 기능에 대한 이해를 돕기 위해 책을 선택하는 것을 고려해보세요 프로그래밍 실습 C++에 대한 이해를 심화시키는 가장 좋은 방법은 배운 개념을 사용하여 코드를 작성하는 것입니다. 개인 프로젝트 작업, 오픈 소스 프로젝트 기여 또는 온라인 코딩 챌린지에 참여하여 더 많은 실무경험을 얻을 수 있습니다. 자료구조 및 알고리즘 학습 데이터 구조 및 알고리즘을 이해하는 것은 효율적이고 효과적인 코드를 작성하는 데 필수적입니다. C++ 프로그래밍 기술을 향상시키기 위해 이러한 주제를 공부하는 것이 좋습니다. 학습한 개념을 사용하는 간단한 프로젝트의 경우 다음과 같은 기본 프로그램을 만드는 것이 좋습니다. 1. 기본적인 산술 연산을 수행하는 계산기입니다.

자료구조를 공부할 때 생각해볼만한 것들 [내부링크]

자료구조를 공부하는 것은 데이터를 효과적으로 구성하고 제어하는 방법을 이해하는 데 도움이 됩니다. 따라서 능숙한 프로그래머가 되기 위한 중요한 요소입니다. 자료구조를 공부할때 중요한 것들에 대해서 한번 알아보겠습니다. 기본적인 자료구조부터 공부하기 배열, 연결 목록, 스택, 큐, 트리 및 그래프와 같은 데이터 구조의 기본 개념을 이해합니다. 실습 공부한 데이터 구조를 실제구현하고, 이를 사용하여 여러가지 문제를 풀어 봅니다. 장단점 파악 자료 구조의 시간 및 공간 복잡성에 대해 알아보고 특정 문제에 대해 어떤 데이터 구조를 사용해야 하는지 이해해야 합니다. 출력값이 맞아도 시간내에 출력이 나오지 않으면 정답이 아닌건 모두 알고 계실겁니다. 문제에 맞는 자료구조를 고르기 위해서는 장단점을 파악해야 합니다. 라이브러리 사용 라이브러리는 테스트 코딩에 유용한 도구가 될 수 있지만 기본 데이터 구조를 이해하지 않고 라이브러리에만 의존하면 문제를 분석하고 효율적인 솔루션을 작성하는 능력이 제

코딩테스트를 하면서 공부한 내용을 정리하는 방법 [내부링크]

코딩 테스트를 위해 공부한 내용을 체계적으로 정리하는 방법을 생각해봤습니다. 1. 문제요약 2. 입력 및 출력값에 대한 설명 3. 의사코드 4. 구현시 실수한 내용 및 디버깅한 부분 5. case에 대한 동작 방식 6. 요약 조금더 상세화 시키면 아래와 같습니다. 문제 요약 학습한 코딩 문제에 대한 간략한 요약을 작성하는 것으로 시작하십시오. 여기에는 문제 설명, 입력 및 예상 출력에 대한 설명이 포함되어야 합니다. 입력 및 출력값에 대한 설명 문제의 입력 및 출력 값을 명확하게 설명합니다. 여기에는 데이터 유형 및 예상되는 값 범위와 같은 입력 및 출력 형식에 대한 세부 정보가 포함되어야 합니다. 의사 코드 의사 코드로 문제에 대한 솔루션에 대한 높은 수준의 단계별 설명을 작성합니다. 여기에는 특정 프로그래밍 언어 구문이 포함되어서는 안 되지만 솔루션의 논리를 개략적으로 설명해야 합니다. 핵심 코드 솔루션의 핵심 코드를 더 작고 관리하기 쉬운 청크로 분해하여 구성합니다. 의사 코드