Coding

    [C++] Split #2 - multiple delimiter split 함수 구현

    split string이 주어져 있을 때 내가 원하는 글자를 기준으로 잘라 배열에 저장시키는 기능. strtok( 문자열의 시작 주소, 찾기 시작할 위치 ) String 함수로써 string 글자에서 원하는 글자를 찾아 시작 위치를 반환받을 수 있습니다. ( Overloading 되어있기 때문에 parameter가 더 있음 ) 관련 글 [C++] Split #1 - String delimiter split 함수 구현 이번에는 지난번 글에 이어서 C++에서의 split 기능을 두번째로 구현해보겠습니다. 이번 글에서 구현할 split은 이전 글에서도 언급했지만 다수의 delimiter를 기준으로 String을 나눠주는 기능입니다. 이러한 기능의 split은 얼핏 기억을 떠올려보면 사칙연산의 식이 input으..

    [C++] Split #1 - String delimiter split 함수 구현

    split string이 주어져 있을 때 내가 원하는 글자를 기준으로 잘라 배열에 저장시키는 기능. find( 찾을 글자, 찾기 시작할 위치 ) String 함수로써 string 글자에서 원하는 글자를 찾아 시작 위치를 반환받을 수 있습니다. ( Overloading 되어있기 때문에 parameter가 더 있음 ) 관련 글 [C++] Split #2 - multiple delimiter split 함수 구현 이번에는 C++에서 split 기능을 구현해보겠습니다. C++로 string 알고리즘 문제를 푼 사람들은 알 겁니다. 다른 언어에 비해 C++가 string 관련 함수가 아주 빈약하다는 것을... 저도 마찬가지로 string 알고리즘 문제를 풀 때마다 "C++ split" 이라는 키워드로 구글링을 했..

    [C++] 2차원 배열 행렬 바꾸기

    2차원 배열 행렬 바꾸기 2차원으로 선언된 배열을 2중 for문을 이용하여 행렬을 바꿀 수 있습니다. memmove( 배열 A 시작 주소, 배열 B 시작 주소, 크기 ) 배열간의 값 복사를 할 수 있는 함수로 B의 배열 값들을 A로 복사하는 기능을 제공합니다. 관련 글 [C++] 2차원 배열 90도 회전 지난번에 올렸던 2차원 배열 90도 회전에 이어서 이번에는 2차원 배열 행렬 바꾸기를 소개하겠습니다. 사실 행렬 바꾸기는 90도 회전에 비해서 상당히 간단합니다. 하지만 유용한 함수를 사용하지 않으면 2중 for문이 반복적으로 사용되기 때문에 지저분한 코딩이 될 수 있습니다. 그래서 90도 회전과 마찬가지로 memmove() 함수를 사용하면서 코드를 비교적 깔끔하게 작성할 수 있습니다. 행렬 바꾸기의 좌..

    [C++] 2차원 배열 90도 회전

    2차원 배열 90도 회전 2차원으로 선언된 배열을 2중 for문을 이용하여 90도 회전 시킬 수 있습니다. memmove( 배열 A 시작 주소, 배열 B 시작 주소, 크기 ) 배열간의 값 복사를 할 수 있는 함수로 B의 배열 값들을 A로 복사하는 기능을 제공합니다. 관련 글 [C++] 2차원 배열 행렬 바꾸기 알고리즘 문제를 풀다보면 2차원 배열을 계속해서 회전시켜야할 때가 있습니다. 90도, 180도, 270도 회전을 시킬 때 각각을 구현하여 문제를 해결할 수 있겠지만, 90도 회전하는 법을 알면 함수로 선언 후 반복적으로 이용하면 됩니다. 이렇게 하는 것이 코드도 깔끔해지고 시간도 절약할 수 있습니다. 2차원 배열을 90도 회전시키는 방법은 2중 for문을 이용해 행렬을 서로 바꿔주면 쉽게 해결할 수..

    [C++] 2차원 배열 특정 값 초기화

    2차원 배열 값 할당 2차원으로 선언된 배열을 fill 함수를 사용하여 특정 값을 할당시킬 수 있습니다. fill( 시작 주소, 끝 주소, 값 ) fill() 함수를 적용시켰을 때 배열의 값이 바뀌는 범위는 [시작주소, 끝 주소) 입니다. C++에서 배열 값을 특정 값으로 설정하는 함수들이 존재합니다. 대표적으로 memset(), fill() 함수가 있습니다. 하지만 memset()의 경우 초기화시킬 수 있는 값은 0과 -1로 제한이 됩니다. 알고리즘 문제를 풀 때 보통 0으로 초기화시키는 경우가 많아서 memset()을 흔히 사용하긴 하지만, 가끔씩 0과 -1이 아닌 값으로 초기화시키고 싶을 때가 있습니다. 이럴 때 memset() 함수를 사용하지 못하는 점이 아쉽긴 합니다. 하지만 memset()을 ..

    [Algorithm] Sort #6 - 퀵 정렬 Quick Sort

    퀵 정렬이란? Pivot을 기준으로 작은 값, 큰 값들로 나눠 정렬하는 알고리즘 시간 복잡도 최상 : \( O(n \log n) \) 최악 : \( O(n^2) \) 관련 글 [Algorithm] Sort #1 - 버블 정렬 Bubble Sort [Algorithm] Sort #2 - 선택 정렬 Selection Sort [Algorithm] Sort #3 - 삽입 정렬 Insertion Sort [Algorithm] Sort #4 - 병합 정렬 Merge Sort [Algorithm] Sort #5 - 힙 정렬 Heap Sort 평균 시간 복잡도가 \( O(n \log n) \)인 정렬 알고리즘 중 마지막은 퀵 정렬입니다. Pivot을 정한 후 두 그룹으로 나눈다는 것에서 병합 정렬과 비슷하게 보이지만..

    [C++] 구조체 생성자 오버로딩 Struct Constructor Overloading

    구조체 생성자란? 구조체를 생성과 동시에 내부 변수들의 값을 초기화 시키는 함수. C++에는 구조체와 비슷한 클래스가 존재하기 때문에 OOP(Object Oriented Programming)를 위해선 보통 클래스를 사용합니다. 하지만 프로젝트가 아닌 일반적인 알고리즘 문제를 풀 때는 구조체를 많이 사용하는데, 이를 위한 기능들을 소개해드리겠습니다. 일반적인 생성자를 따로 선언하지 않는 경우에는 아래와 같이 사용합니다. 하지만 알고리즘 문제를 풀다보면 vector, queue, stack 등 여러가지 자료구조에 구조체 템플릿을 선언해야할 때가 있습니다. 위와 같은 방법을 사용하게 되면 구조체 임시 변수를 하나 선언해놓고 값을 넣은 후, 자료구조에 다시 넣어줘야하는 번거러운 작업이 필요합니다. #inclu..

    [Algorithm] Sort #5 - 힙 정렬 Heap Sort

    힙 정렬이란? 힙 자료구조의 루트를 뽑아 정렬하는 알고리즘 시간 복잡도 최상 : \( O(n \log n) \) 최악 : \( O(n \log n) \) 관련 글 [Algorithm] Sort #1 - 버블 정렬 Bubble Sort [Algorithm] Sort #2 - 선택 정렬 Selection Sort [Algorithm] Sort #3 - 삽입 정렬 Insertion Sort [Algorithm] Sort #4 - 병합 정렬 Merge Sort [Algorithm] Sort #6 - 퀵 정렬 Quick Sort 병합 정렬에 이어서 평균 시간 복잡도가 \( O(n^2) \)인 정렬 알고리즘 중 두번째는 힙 정렬입니다. 자료구조 중에서 힙(heap)의 특성을 이용해 정렬을 구현한 알고리즘입니다. 선..