[알고리듬] 부분집합 생성
·
코딩테스트/알고리듬
1. 비트 마스킹#include #include using namespace std;int main() { vector arr = {1, 2, 3}; int n = arr.size(); // 부분집합의 모든 경우의 수 탐색 -> 0 ~ (2^n-1) for (int i = 0; i
[코딩테스트] 경우의 수 구하기
·
코딩테스트/알고리듬
1. 종류별 포함int main(){ // 입력 값 vector> v = { {"yellow_hat", "headgear"}, {"blue_sunglasses", "eyewear"}, {"green_turban", "headgear"} }; // 경우의 수 카운트 int resultCount = 1; // 각 종류별 의상 수 unordered_map myMap; // 종류별 의상 수 카운트 for(auto& a : v) { ++myMap[a.second]; } // 종류별 최소 1개 포함 공식 for(auto& a : myMap) { resultCount..
[프로그래머스] H-Index
·
코딩테스트/프로그래머스
1. 문제 설명  2. 이중 포문#include using namespace std;int solution(vector citations) { int answer = 0; unordered_map m; for(int n : citations) { for(int i = 0; i 논문의 수가 1000개 이하이고, 인용 횟수가 10,000이하라고 주어져서 높은 시간 복잡도 알고리듬을 요구하는 문제구나 싶었어요. 삼중 포문 쓸 생각까지 해야겠네 라고 예상을 했지만, 의외로 이중포문으로 해결할 수 있었습니다. 만약 인용횟수가 5로 주어지면 0~5까지의 "~이상 인용 횟수"를 1증가시켜주는 방식으로 작동합니다. 나름 논리적인 접근이라고 생각하며 만족했지만, 다른 사람의 풀이..
[코딩테스트] 자릿수 정렬
·
코딩테스트/알고리듬
1. while 문 활용int n = 897324711;vector v; // 각 자릿수를 벡터로 변환while(n > 0){ v.push_back(n%10); n/=10;}// 오름차순 정렬sort(v.begin(), v.end()); // 원소 출력for(int i : v){ cout 지금까지 활용해온 자릿수 치환 방법인데요. 자릿수를 정렬해서 출력하라는 문제에서 유용하게 활용했습니다. 하지만, 이보다 더 간단한 방법이 있었다는 것 .. string을 활용하면 단 한줄로도 해결이 될 것 같더라구요.2. string 활용 **int n = 897324711; string s = to_string(n);sort(s.begin(), s.end()); cout 완전 코드..
[코딩테스트] 원형 연속부분수열 합
·
코딩테스트/알고리듬
1. 삼중 for문int n = elements.size(); set s; for(int i=1; i= n) { index %= n; } sum += elements[index]; } s.insert(sum); }}vector의 원소가 {1, 2, 3, 4, 5}라고 가정을 했을 때 삼중 포문의 로직은 원소가 1개 일 때 → 원소가 2개 일 때 → 원소가 3개 일 때 → ... → 원소가 5개 일 때 처럼 원소의 개수를 순차적으로 체크해 나가는 방식이다. 문제를 풀고 난 후 굉장히 뿌듯해 했지만, 다른 분들의 코드를 참고 해보니 알고리듬에 유연하지 못 한 사고방식으로 구현한 로직..
[코딩테스트] value 값을 기준으로 정렬
·
코딩테스트/알고리듬
1. 개요key-value의 쌍으로 값을 저장하는 자료구조인 map이 있다. map은 기본적으로 key 값을 기준으로 정렬이 된다. 하지만 value 값으로 정렬을 하고자 할 때에는 어떻게 해야할까 ? 번거롭기는 하지만 map을 vector>으로 옮긴 후 second 값을 기준으로 sort를 해주면 된다.2. 코드#include #include #include int main(){ map m = { { 1, 3 }, { 5, 4 }, { 2, 1 } }; vector> v(m.begin(), m.end()); sort(v.begin(), v.end(), [](const auto& a, const auto& b){ return ..
[프로그래머스] 멀리 뛰기
·
코딩테스트/프로그래머스
1. 문제 1234567로 나눈 나머지를 리턴하라는 부분이 있다면 오버플로우가 발생할 가능성이 있다는 의미인 것 같다. 실제로 이 문제를 조합을 활용해서 풀었는데 오버플로우로 인해 문제를 해결할 수 없었다. 다른 방법을 찾아봤고 사람들은 피보나치 수열을 활용하여 풀었다고 한다.. 어떻게 이 문제를 보고 피보나치를 떠올릴 수 있었을까 ..2. 조합 코드long long solution(int n) { long long answer = 0; int m = n/2; int left = 0; int right = n; do{ long comb = 1; // 조합 값 저장 for (int i = 0; i = l..
[코딩테스트] set
·
코딩테스트/자료구조
1. set중복을 허용하지 않고, 저장된 데이터를 자동으로 정렬하는 컨테이너이다. map과 동일하게 내부 구조는 균형이진탐색트리(레드블랙트리) 방식으로 동작한다.검색, 삭제, 삽입의 시간복잡도는 O(logN)이다.#include // 선언set mySet;// 초기화set mySet = { 1, 2, 3, 3, 4 } // 1, 2, 3, 4 (1) 특정 키 접근int num = mySet[1]; set은 인덱스 기반 접근이 가능하다. (2) 값 변경set은 값의 변경이 불가하다. (3) 삽입mySet.insert(5);set에 새로운 값을 삽입하는 경우 내부적으로 균형이진탐색트리 방식으로 정렬을 수행한다. (4) 삭제mySet.erase(2);auto it = mySet.find(2);mySet.era..