본문 바로가기

C C++/C C++ 유용한 알고리즘 기법16

[C/C++] 연속된 숫자 한자리씩 나누어 입력 받기 방법 1. scanf 이용하여 나누어 받기 가장 흔한 방법이다. C에서 주로 사용하는 scanf에서는 입력 형식을 지정해주어야한다. 이 때 입력을 "%1d"로 지정하면 된다. 이렇게 지정하면 하나의 정수가 들어오면 입력이 모두 된 것으로 간주하고 다음 입력으로 넘어가게 된다. 같은 방식으로 이중 for문에도 활용할 수 있다. #include using namespace std; int main() { int a[10]; for (int i=0; i 2023. 3. 16.
알고리즘 병합 정렬 완벽 이해하기 병합 정렬이란? 병합 정렬은 나누고 붙이는 과정을 기반으로 한 정렬 알고리즘이다. 하나의 배열을 둘로 나누고, 이를 정렬하여 다시 붙이게 된다. 병합 정렬은 재귀 함수 호출로 정렬할 수 있는 데, 배열을 1/2씩 최대한 쪼갠 후 쪼개진 배열을 정렬하고, 최대한 쪼개진 배열을 둘씩 붙이고, 다시 정렬하고, 다시 붙이고...를 반복한다. 사실 설명보다 아래 그림을 이해하는 편이 더 쉽다. 이 정렬 방식은 최악, 최선 어느 경우에도 O(Nlong(N))의 시간 복잡도를 가진다. 공간 복잡도는 O(n)이다. 코드 부분 부분 해설 코드는 아래와 같은 형식으로 풀 수 있다. 1. 반으로 최대한 쪼갤 수 있을 때까지 쪼갠다. (재귀 함수 호출, 더 쪼갤 수 없을 때는 리턴) 2. 정렬의 가장 왼쪽을 가리키는 값(p1.. 2022. 10. 29.
[C/C++] 배열값 옮기기 배열값 한 칸씩 옮기기 오늘은 배열값을 한칸씩 옮길 때 유의할 점을 따져 보려고 한다. 예를 들자면, [1,2,3] 값을 [3,1,2] 등으로 옮겨본다고 하자. 쉽다고 생각할만 하지만 유의할 점이 하나 있다. #include #include #define endl "\n" using namespace std; int arr[]={1,2,3}; void print() { for (int i=0; i 2022. 10. 15.
[C/C++] 2차원 배열 90도 회전하기 2차원 배열 회전하기 2차원 배열을 90도 회전하는 것을 알아보도록 하겠음. 알고리즘 문제를 풀다 보면 배열로 여러 가지 변형을 줘야할 때가 있는 데, 그 중 하나가 회전임. 어려워 보이지만 실제로 그렇지 않음. 풀이 방법은 복잡한 공식 외우듯이 외우는 게 아니라 아래와 같이 단 하나의 행 또는 열로 회전한다고 생각하고 for문에서 일부 변형만 주면 나머지는 쉽게 구현 가능함. 아래는 핵심 코드임. 행과 열을 살펴 보겠음. map[(MAX-1)-j)[i]를 살펴 보면, MAX-1이 행의 마지막 값이고, 이를 회전된 행렬 값에 갖다 붙임.그리고 MAX-1-j이므로 MAX-1-1, MAX-1-2, MAX-1-3, ...... 이런식으로 가면서 각각 갖다 붙이고 마지막은 0번 행도 갖다 붙임. 위 내용을 열마.. 2022. 10. 8.