전체 글 50

Data Structure / Algorithm / Theory of Computation

Data Structure 주어진 추상적인 문제를 어떠한 자료구조를 사용하여 컴퓨터의 구조에 최적화된 형태로 표현할 수 있을까? Algorithm 주어진 추상적인 문제를 어떠한 알고리즘으로 컴퓨터를 사용하여 가장 효율적으로 해결할 수 있을까? Complexity (cf. Efficiency) 과연 컴퓨터가 주어진 문제를 효율적으로 해결할 수 있을까? An algorithm is regarded as efficient or good if there exist a polynomial P(n) such that the time required for solving any instance of size n is bounded above by P(n) Computablity (cf. Finiteness) 과연 컴..

[BOJ9663] N-Queen

문제 https://www.acmicpc.net/problem/9663 Note 백트래킹 모든 경우를 탐색하되 조건을 만족하는 경우를 제외하는 가지치기를 잘 수행해야 한다. 백트래킹이라는 개념을 오해하고 있었는데, 아래 잘 정리된 게시글을 보고 제대로 이해할 수 있었다. 나쁜 습관 문제를 빨리 풀려고 성급하게 접근하다 보니 잘못 푸는 경우가 잦다. 이 문제도 시간초과를 받았는데, 굉장히 비효율적인 방식으로 완전 탐색을 수행했었다. 시간 복잡도 계산 일반적인 구현은 O(N!)의 시간복잡도를 갖는 것 같다. (확인 및 검증 필요) Reference https://medium.com/@jeongdowon/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-backtracking-%EC%9D%B4..

Problem Solving 2020.03.02

[BOJ10814] 나이순 정렬

1. 문제 https://www.acmicpc.net/problem/10814 10814번: 나이순 정렬 온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오. www.acmicpc.net 2. Note 구조체에 가입 순서를 포함하여 정렬해도 되지만, 안정 정렬(Stable sort)을 가능하게 하는 정렬 알고리즘을 사용하는 것이 좋다. 3. Reference https://en.cppreference.com/w/cpp/algorithm/stable_sort std::stable_sort - cppreference.com template< class RandomIt..

Problem Solving 2020.03.01

동적 계획법(Dynamic Programming)의 두 가지 속성

Dynamic Programming (DP) DP는 복잡한 문제를 여러 개의 부분 문제(sub-problems)로 쪼개서 해결하는 알고리즘 패러다임이다. 이때, 이러한 부분 문제들의 해(solution)을 기록하여 중복되는 부분 문제를 여러 번 계산하지 않도록 한다. DP로 풀 수 있는 문제는 다음의 두 가지 속성을 갖는다. (1) Overlapping Subproblems (2) Optimal Substructure Overlapping Subproblems DP는 부분 문제의 해를 결합한다는 점에서 분할 정복(Divide and Conquer)과 비슷하지만, 같은 부분 문제의 해를 여러 번 이용한다는 점에서 분할 정복과 다르다. 따라서 중복된 부분 문제(Overlapping Subproblems)를 ..

Programming/Note 2020.02.12

Ch1. Computer Abstractions and Technology

What You Will Learn 어떻게 프로그램이 기계어로 번역되는지 (또한 하드웨어가 어떻게 기계어를 실행하는지) 하드웨어와 소프트웨어의 인터페이스 프로그램의 성능은 어떻게 측정하는지 (또한 어떻게 성능을 향상시킬 수 있는지) 하드웨어 디자이너는 어떻게 성능을 향상시키는지 병렬 처리는 무엇인지 Understanding Performance 알고리즘: 연산의 수를 결정 프로그래밍 언어, 컴파일러, 아키텍처: 연산 당 machine instruction의 개수를 결정 프로세서와 메모리 시스템: instruction의 수행 속도를 결정 I/O 시스템: I/O 연산의 수행 속도를 결정 (일반적으로 I/O 호출은 Appliaction -> (OS) -> HW) Inside the Processor (CPU)..

순열 (Permutation)

1. 순서가 중요한 완전 탐색에 종종 사용된다. 2. 개수가 고정된 선택 문제를 순열로 바꿔서 풀 수 있다. (조합-Combination으로 활용 가능) (BOJ6603 로또 , https://www.acmicpc.net/problem/6603) # std::next_permutation, std::prev_permutation C++은 std::next_permutation, std::prev_permutation로 사전순(lexicographically ordered)의 다음 순열, 이전 순열을 제공한다. # Time Complexity 한 번 호출하면 O(n), 모든 가능성을 전부 호출하면 Amortized O(1) https://stackoverflow.com/questions/4973077/th..