본문 바로가기
반응형

알고리즘58

[ps] 문자열 사전 오름차순 비교 및 정렬 문제를 풀다보면 ID가 작은 기준으로 하되, 동일한 ID인 경우에는 알파벳 오름차순으로 우선순위를 가지도록 하는 조건이 있습니다. 여러 기준에 의해 우선순위가 결정되는 경우 입니다. 숫자를 비교하는 경우에는 단순 비교를 하면 되지만, 아래 두가지를 처음 구현한다면 쉽지 않습니다. 대표적인 문제로 S사 코딩 기출 문제가 있습니다. [BOJ] 백준 21608 상어 초등학교 삼성 SW 코딩 테스트 준비(A형) 삼성 SW 기출 모음 출처: https://www.acmicpc.net/problem/21608 Approach BFS + 완전탐색을 구현하는 문제이다. ▶ BFS (Breadth-First Search, 너비 우선 탐색) BFS (Breadth-.. zoosso.tistory.com [BOJ] 백준 2.. 2021. 5. 30.
[ps] 순환되는 행렬 인덱스 (Index) N × N 행렬 탐색 문제를 풀다보면 1번 행(열)과 N번 행(열) 연결되는 경우가 있다. ▶ 1번 행 위에 N번행이 존재하고 / N번 행 아래에 1번행이 존재하는 경우 임의의 위치 (x, y)에서 상 / 하 / 좌 / 우 방향 중 한 가지 방향으로 k 칸 이동한다고 했을 때, ▶ 10 × 10 크기의 map[10][10] 변수가 주어지고, 인덱스 범위는 0 ~ 9 이다. K = K % N; int nextX = (cur.x + (dx[dir] * K) + N) % N int nextY = (cur.y + (dy[dir] * K) + N) % N (K의 수치가 크게 주어지는 경우 1 Cycle 기준으로 나머지 연산 처리) 도착하는 위치를 크게 아래 4가지 경우로 고려한다. - 증가해서 (우측 이동) 범위.. 2021. 5. 30.
freopen( )을 이용한 파일 입출력 freopen() 필요성 알고리즘 문제를 풀다보면 주어진 Input Data를 입력받아 Logic을 수행한 후 정해진 Output Data를 출력한다. scanf()나 cin 으로 표준 입출력 하는 경우에는 계속해서 Copy & Paste해야 하는 번거로움이 있다. 이러한 작업을 쉽게 해주는 것이 파일 입출력이다. freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); [리소스 파일] 하위에 "input.txt"와 "output.txt" 파일을 둔다. (파일명은 임의로 설정하면 된다.) 해당 파일은 프로젝트에서 .cpp와 같은 경로에 있는 것을 확인할 수 있는데 다른 위치에 두는 경우에는 그것에 맞춰서 경로를 지정할 수 있다. #inc.. 2021. 5. 24.
동적계획법(Dynamic Programming, DP) 동적 계획법(Dynamic Programming)은 큰 의미에서 분할 정복과 같은 접근 방식을 의미한다. 처음 주어진 문제를 더 작은 문제들로 나눈 뒤 각 조각의 답을 계산하고, 이 답들로부터 원래 문제에 대한 답을 계산해 내기 때문이다. 동적 계획법과 분할 정복의 차이가 발생하는 부분은 문제를 나누는 방식이다. 동적 계획법(DP)은 다른 알고리즘과 함께 이용해서 문제를 풀어야 하는 경우가 있다. 특정 Case를 여러번 계산하는 대신 한 번만 계산하고 계산 결과를 재활용하여 속도를 높이다. 그러기 위해 각 문제의 답을 메모리에 저장해 둘 필요가 있다. → DP[ ][ ] ▶ 연속된 부분 합(연속합) - 1 (완전 탐색) ▶ 연속된 부분 합(연속합) - 2 (Prefix Sum) ▶ 연속된 부분 합(연속합.. 2021. 5. 22.
순열과 조합 (백준 N과 M 시리즈) 순열과 조합 순열(Permutation) / 조합(Combination)에서 개수를 구하는 경우에는 ▶ P(n, r) = n × (n - 1) × (n - 2) × ... × (n - r - 1) = n! / (n - r)! 상황에 따라서는 주어지는 Data가 나올 수 있는 모든 경우가 필요할 수 있다. - 순서 의미 O → 순열 - 순서 의미 X → 조합 - 중복 허용 순열 접근 방식 ① P(4, 3) = 4 x 3 x 2 ② P(4, 3) = 4개 중 1개 선택 x 3개 중 1개 선택 x 2개 중 1개 선택 ③ 재귀탐색하는 모습은 아래와 같다. [1, 2, 3, 4] 에서 『1』 선택 [2, 3, 4] 에서 『2』 선택 [3, 4] 에서 『3』 선택 ▶ 1 2 3 [3, 4] 에서 『4』 선택 ▶ 1.. 2021. 5. 8.
아스키(Ascii) 코드 활용 아스키(Ascii) 코드 활용 프로그래밍 문제를 풀 때(PS)는 0 ~ 9 숫자를 문자로 표현하는 경우도 있고, 반대로 "A ~ Z" 혹은 "a ~ z" 문자를 정수형으로 이용하는 경우가 있다. 이때 이용하는 것이 아스키(Ascii) 코드이다. (* 일부만 표기) 아스키 코드(ASCII Code)란? 미국표준협회(ANSI)에서 지정한 표준 부호로, 숫자 ↔ 문자를 표현하기 위한 문자 인코딩이다. 아스키는 컴퓨터와 통신 장비를 비롯한 문자를 사용하는 많은 장치에서 사용되며, 대부분의 문자 인코딩이 아스키에 기초를 두고 있다 - A ~ Z 까지 연속되다가 a ~ z 시작전에 중간에 다른 특수문자가 존재한다. - 알파벳은 a ~ z 까지는 26개이다. - A (65) ~ Z (90) 이며, a (97) ~ z.. 2021. 5. 6.
[알고리즘] 시간 성능 향상을 위한 코드 최적화 (C/C++) register 변수 사용 변수를 선언할 때 앞에 register 라는 키워드를 붙이면 변수는 RAM 대신 CPU의 레지스터를 사용한다. 따라서 변수에 접근하는 속도가 다른 일반적인 변수보다 빨라진다. 단, 레지스터의 개수는 한정되기에 "register"를 붙인다고 해서 모두 적용되는 것은 아니다. 많이 접근하는 변수에 사용할수록 효율이 좋아지기에, 반복문에서 많이 사용한다. register int i, j; for(i=0; i 5 (나눗셈 연산 자제하기) ② 홀수 / 짝수 판별 만일 어떤 정수가 홀수라면, 2진수로 나타냈을 때 맨 마지막 자리가 "1" ex) if ( x % 2 == 1) → if ( x & 1) ▶ 비트마스크 (Bitmask) 비트마스크 (Bitmask) 비트마스크 정수의 이진수 표현.. 2021. 5. 5.
[알고리즘] 코딩 테스트 문제 풀 때, 시간 복잡도 계산해보기 시간 복잡도 계산해보기 프로그램 작성 전에 어느정도 Input Data의 범위와 Logic 시간 복잡도로 수행 시간을 어림짐작할 수 있어야 합니다. SW 알고리즘 문제에서는 크게 시간 / 공간 제한이 존재합니다. ※ 대부분 알고리즘 문제를 풀 때는 메모리 제한이 엄격하기 보다는 시간 복잡도에서 주의해야 할 부분이 많으므로 이에 대해 다루고자 합니다. ※ 해당 글에서는 Big-O (빅오) 계산법을 중점으로 작성하였습니다. Big-O 계산 Big-O 계산은 쉽게 큰 수치가 시간 복잡도를 크게 좌우한다고 보면 된다. ex) N2 + N → O(N2) N3 + N2 + N + 1 → O(N3) 최고 차항만 차수만을 표기, 다항식에서 작은 단위의 계수들이 아무리 커도 최고차항의 계수에 큰 영향 X ▶ 1억 (10.. 2021. 5. 5.
[구간합] Sum of sub-matrix가 무엇이고, 어떻게 하는 것일까? Sum of sub-matrix 란? N × N와 같은 2차원 배열상에서 특정 영역의 합을 의미한다. 위에서 표시한 4 × 2 크기의 사각형이 가지고 있는 영역의 합은 어떻게 구할까? Brute Force 방식으로 구한다면 아래와 같이 구할 수 있다. #include const int N = 7; int main() { int map[N][N] = { {0, 0, 0, 0, 0, 0, 0}, {0, 1, 2, 3, 4, 5, 6}, {0, 2, 2, 2, 2, 2, 2}, {0, 3, 3, 3, 3, 3, 3}, {0, 4, 4, 4, 4, 4, 4}, {0, 5, 5, 5, 5 ,5 ,5}, {0, 6, 6, 6, 6, 6, 6}, }; int sx, sy, ex, ey; sx = 2, sy = 4; .. 2021. 5. 3.
비트마스크 (Bitmask) 비트마스크 정수의 이진수 표현(Bit)을 자료 구조로 쓰는 기법 현대의 모든 CPU는 이진수를 이용해도 모든 자fy 표현 내부적으로 이진수를 사용하는 컴퓨터들은 이진법 관련 연산들을 아주 빨리 할 수 있다. - 더 빠른 수행 시간 비트마스크를 활용하는 것이 원소의 수가 많지 않겠지만, 큰 속도 향상이 없을 수는 있다. 하지만 연산을 여러 번 수행할 때는 괴장히 효율적이다. - 더 작은 공간 복잡도(메모리) - 비트 연산자를 활용한 가독성(간결한 코드) 다양한 집합 연산들을 반복문 없이 사용 ex) 8개의 비트를 사용할 때, 아래와 같이 표현. ※ [BOJ] 11723 집합 arr[8] = {1, 2, 4, 8, 16, 32, 64, 128} arr[i] = 1 2 = 000010 // 공집합 (모든 Bi.. 2021. 3. 20.
반응형