컴파일컴파일 과정이란 사람이 작성하는 High Level Programming Language로 구성된 소스 코드를 기계가 이해할 수 있는 Low Level Programming Language로 바꾸는 과정을 의미합니다. 그 중에서 컴파일러가 어떻게 동작하는지 간단하게 정리해보았습니다. 컴파일러 소스 코드가 기계어로 변환되기 위해선 Front End → Middle End(IR) → Back End의 변환을 거쳐야 합니다. Front EndFront End는 C나 Java 등의 언어의 문법을 해석하는 역할을 합니다. Front End는 다음과 같은 순서로 진행됩니다.Scanner가 소스 코드를 받습니다.Scanner는 소스 코드를 의미가 있는 단어로 쪼개어 단어들을 토큰으로 만드는 역할을 합니다.숫자,..
컴파일컴파일 과정이란 사람이 작성하는 High Level Programming Language로 구성된 소스 코드를 기계가 이해할 수 있는 Low Level Programming Language로 바꾸는 과정을 의미합니다. 흔히 우리가 프로그래밍을 하고 실행 코드를 실행하는데, 실행이 되기 위해선 컴퓨터는 해당 코드를 ‘컴파일’하게 되는 것입니다. 그 결과로 우리가 원하는 결과를 얻을 수 있는 것입니다. GCC를 통해 C언어가 컴파일되는 과정을 알아보겠습니다. 컴파일 4단계컴파일 과정은 전처리(Preprocessing) → 컴파일(Compiler) → 어셈블리(Assembly) → 링커(Linker) 순서로 이루어집니다. 전처리기(Preprocessor)전처리 과정은 소스 코드 파일(.c)을 .i 파일로..
Graph 그래프는 물체 사이의 관계를 정의해주는 자료 구조입니다. 그래프는 모서리(edge)로 연결된 꼭짓점(vertices)들로 만들어져있습니다. Weighted graphs 가중치가 부여된 그래프에서 모든 엣지는 이 엣지를 사용하는 비용을 나타내는 가중치를 가집니다. 이러한 가중치는 꼭짓점 사이에 있어서 가장 저렴하거나 가장 짧은 경로를 선택할 수 있도록 해줍니다. 항공의 예시를 통해 비행 경로를 다양하게 하는 네트워크의 예시를 생각해봅시다. 위의 예시에서 꼭짓점은 주나 나라를 나타내고, 모서리는 지점 간의 경로를 나타냅니다. 각각의 엣지에 있는 가중치는 두 지점 간의 항공료를 나타냅니다. 이 네트워크를 통해 샌프란시스코에서 싱가폴로의 가장 싼 항공권을 결정할 수 있습니다. Directed grap..
되게 오랜만에 블로그 글을 작성하는 것 같습니다,,! Apple Developer Academy @ POSTECH의 마무리, 휴식, 다음 계획 등으로 인해 잠시 쉬었다가 다시 시작하려고 합니다. 올해 이룬 목표 중 하나는 정보처리기사를 취득한 것인데, 이와 관련해서 포스팅하고자 합니다. 우선 저는 필기는 2023년 2회에 합격을 하였고, 실기는 2회에 떨어지고, 3회에 합격을 하였습니다 ㅎㅎ,, 학위가 있기 때문에 응시를 할 수 있었고, 올해 목표 중 하나였기 때문에 올해 안에 취득하고 싶었는데 다행이 취득하게 되었습니다. 정보처리기사를 응시한 이유는 데이터베이스, 운영체제와 같은 기초 지식을 습득하고자 응시하였습니다. 제가 공부한 방법과 실기에서 한 번 떨어진 이유, 그리고 합격을 위한 공부 방법 등을..
디자인 패턴 디자인 패턴이란 소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제에 대해 자주 쓰이는 설계 방법을 정리한 패턴입니다. 디자인 패턴을 참고하여 개발할 경우 개발의 효율성과 유지보수성, 운용성이 높아지며, 프로그램의 최적화에도 도움이 됩니다. 따라서 다양한 디자인 패턴을 숙지하고 있다면 해당 패턴의 이름만으로 구조를 파악할 수 있게 되어 더욱 원활한 의사소통이 가능해집니다. Gamma 디자인 패턴이라고도 불리는 GoF 디자인 패턴이 가장 잘 알려진 디자인 패턴인데, 이는 디자인 패턴을 목적과 범위로 분류하였습니다. 목적에 따른 분류를 보자면, 디자인 패턴은 “생성”, “구조”, “행위” 중 한 가지의 목적을 갖는다고 하였습니다. 구분 유형 설명 목적 생성 객체 인스턴스 생성에 관여, ..
누적 합 누적 합이란 수열에 대해 각 인덱스까지의 구간의 합을 구하는 것을 의미합니다. 모든 구간에 대해 단순하게 반복하여 하나씩 더해가는 방법을 사용하게 되면 최악의 경우 O(n^2)의 시간 복잡도를 가질 수 있습니다. 하지만 이전 인덱스까지의 누적합에 현재 값을 더하는 방식인 누적 합을 사용하면 O(n)의 시간 복잡도를 가질 수 있습니다. 배열에 따라 누적합을 저장해놓은 뒤, 구하고자 하는 범위까지의 누적합에서 해당 범위에 포함되지 않는 범위를 빼주면 구할 수 있습니다. 따라서 배열의 특정 범위의 구간 합을 구하고자 한다면, 해당 알고리즘이 매우 유용할 수 있습니다. 예시 백준 11659 문제인 구간 합 구하기 4를 통해 누적합에 대해 알아보겠습니다. 우선 5 4 3 2 1에 대한 누적합을 구하고 배..
슬라이딩 윈도우 슬라이딩 윈도우란 일정한 길이를 이동시키면서 조건에 맞는 값을 찾는 알고리즘입니다. 배열에서 일정 범위의 합을 비교할 때 매우 유용한 방법으로, 값을 이동시킬 때 배열의 처음 값을 제거하고 배열의 마지막 값을 더해주기만 하면 되는데, 배열의 모든 값을 불러와서 더하는 연산을 피할 수 있어 매우 효율적입니다. 양 옆에 지점을 둔다는 점에서 투 포인터와 비슷한 점이 있지만, 투 포인터는 범위가 유동적으로 변하지만, 슬라이딩 윈도우는 범위가 고정되어 있다는 점이 차이점입니다. 다음은 투 포인터를 그림으로 표현한 예시입니다. 조건에 따라 범위가 유동적으로 변경되는 것을 볼 수 있습니다. 다음은 슬라이딩 윈도우를 그림으로 표현한 예시입니다. 범위는 항상 고정되어 있고, 배열은 좌우로만 이동합니다.
투 포인터 투 포인터란, 배열에서 원래 이중 for문으로 O(N^2)으로 처리되는 작업을 2개의 포인터를 통해 O(N)으로 해결해주는 알고리즘입니다. 여기서의 포인터는 C언어에서의 포인터의 개념이 아니라, 해당 지점을 의미하기 위해 사용되는 개념입니다. 이중 for문으로 처리할 때 주로 i가 계산되고, 그 안에서 j가 계산되는데, j가 계산될 때 i에 대한 정보가 쓰이지 않습니다. 하지만 투 포인터 같은 경우에는 i에 대한 정보를 사용하여 포인터를 이동시킵니다. 투 포인터 문제는 이분 탐색으로도 풀 수 있는 경우가 많고, 그 반대의 경우 또한 많습니다. 투 포인터 문제는 크게 두 가지 유형이 있습니다. 정렬 후 양 옆에서 다가오는 것 left, right를 지정하고, 상황에 따라 left나 right가 ..