Algorithm 100

[프로그래머스] 이진 변환 반복하기 with C++

문제 설명 제한 사항 및 입출력 예제 개념 1과 0으로 구성된 문자열에서 특정 조건을 만족할 때까지 이진 변환 프로세스를 반복하는 문제다. 프로세스는 다음과 같다. 문자열에서 0을 제거 (제거한 횟수 카운트) 문자열의 길이를 이진법으로 표현 (입력 문자열이 1이 될때까지, 횟수 카운트) 이때 문자열의 길이를 이진법으로 표현하기 위해 bitset 라이브러리를 사용하면 효율적으로 문제를 풀 수 있다. 풀이 #include #include #include using namespace std; vector solution(string s) { vector answer(2); int cnt = 0; while (s[0] != '1' || s.size() != 1) { int num = count(s.begin()..

[프로그래머스] 최솟값 만들기 with C++

문제 설명 제한 사항 및 입출력 예제 개념 두 수열 A와 B의 각 원소를 한 번씩 곱한 값을 더했을 때, 그 합이 최소가 되도록 만드는 문제다. 즉, 한 수열에서 최솟값을 다른 수열에서의 최댓값과 곱하는 과정을 반복하여 합을 최소화하는 것이 목표다. 이를 구현하는 방법은 여러 가지가 있다. 풀이 (1) multiset 활용 #include #include using namespace std; int solution(vector A, vector B) { int answer = 0; multiset ms1(A.begin(), A.end()), ms2(B.begin(), B.end()); while (!ms1.empty()) { answer += (*ms1.begin() * *ms2.rbegin()); ms..

[프로그래머스] 최댓값과 최솟값 with C++

문제 설명 제한 사항 및 입출력 예제 개념 공백으로 구분된 문자열에서 최솟값과 최댓값을 뽑아 출력하는 문제다. 공백을 만날 때마다 벡터에 문자열을 정수로 바꾼 후 값을 넣어주는 방식을 사용하면 된다. 풀이 #include #include #include using namespace std; string solution(string s) { string tmp; vector v; int max, min; for (const auto& str : s) { if (str != ' ') tmp += str; else { v.push_back(stoi(tmp)); tmp = ""; } } v.push_back(stoi(tmp)); min = *min_element(v.begin(), v.end()); max = ..

[프로그래머스] 올바른 괄호 with C++

문제 설명 제한 사항 및 입출력 예제 개념 대괄호가 올바르게 짝지어졌는지 확인하는 문제다. 스택을 사용하는 대표적인 문제로서 특정 조건을 만족할 때 스택에서 문자를 뽑아서 스택이 비었는지 여부를 체크하면 쉽게 해결할 수 있다. 풀이 #include #include #include using namespace std; bool solution(string s) { stack st; bool answer = true; for (const auto& ch : s) { if (st.empty()) st.push(ch); else if (st.top() == '(' && ch == ')') st.pop(); else st.push(ch); } if (!st.empty()) answer = false; return..

[프로그래머스] JadenCase 문자열 만들기 with C++

문제 설명 제한 사항 및 입출력 예제 개념 첫 문자를 대문자로 처리하고 나머지 알파벳을 소문자로 처리하는 문자열 처리 문제다. 입력 문자열에서 각 단어의 첫 문자를 대문자로, 그 외의 알파벳을 소문자로 바꾸는 작업이 필요하다. 여기서 '단어'는 공백 문자로 구분되므로, 문자열을 순회하며 공백 문자를 만났을 때 그 다음 문자를 대문자로 바꿔주면 된다. 풀이 #include #include using namespace std; string solution(string s) { string answer; bool isTrue = false; answer += toupper(s[0]); s = s.substr(1); 공백 문자를 만났는지 여부를 체크할 플래그 변수 isTrue를 false로 초기화해준다. 그리고..

[프로그래머스] 이중우선순위큐 with C++

문제 설명 제한 사항 및 입출력 예제 개념 최댓값과 최솟값 모두 처리할 수 있는 이중 우선순위 큐를 구현하는 문제다. 최소힙과 최대힙을 나눠서 처리하는 방법과, 동일한 요소를 여러 번 저장하는 multiset 자료구조를 이용하는 방법 두 가지가 있다. 풀이 (1) 최소힙, 최대힙 #include #include #include #include using namespace std; vector solution(vector operations) { vector temp, answer; for (const auto& str : operations) { string tmp = str.substr(2); if (str[0] == 'I') temp.push_back(stoi(tmp)); else { if (tmp ..

[프로그래머스] 신고 결과 받기 with C++

문제 설명 제한 사항 및 입출력 예제 개념 id_list에 포함된 사용자가 신고 결과 이메일을 얼마나 많이 받았는지 파악하는 문제다. 각 신고 처리 내역은 "신고자 신고할 사람"의 형식으로 제시된다. 단, 본 문제에서 핵심적인 고려 사항은 동일한 사용자에 대한 중복 신고가 단 한 번의 신고로만 처리된다는 점이다. 따라서, 동일한 대상에 대한 다수의 신고가 있더라도 이를 단일 신고로 간주하며, 이는 신고 결과 이메일의 수를 결정하는 데 중요한 요소가 된다는 점을 놓치면 안 된다. 따라서 map 자료구조를 활용하여 "신고자" "신고한 사람"의 형태의 쌍을 받아 처리할 수 있다. 각 신고자를 키로 설정하고, 신고한 사람을 값으로 설정한다. 동일한 신고자가 동일한 신고한 사람을 여러 번 신고하더라도, map 구..

[백준] 9935 문자열 폭발 with C++

문제설명 입출력 예제 개념 문제의 목표는 주어진 문자열에서 특정 '폭발' 문자열을 제외하고 출력하는 것이다. 이를 해결하기 위해 입력 문자열에서 특정 문자열을 식별하고 삭제하는 과정이 필요하다. 이러한 과정은 문자열을 찾는 작업에서 O(n)의 시간 복잡도와 특정 문자열을 삭제한 후 남은 요소들을 이동시키는 작업에서 O(n)의 시간 복잡도를 갖게 된다. 따라서 두 연산을 합치면 전체 알고리즘의 최악의 경우 시간 복잡도가 O(n^2)이 되므로, 큰 입력에 대해 비효율적이라는 결론을 내릴 수 있다. 이를 해결하는 가장 효과적인 방법은 스택을 사용하는 것이다. 폭발 문자열의 마지막 문자와 현재 입력받은 문자를 비교하여, 완전히 일치할 경우 해당 문자열을 제거하는 방식으로 진행하면 된다. 풀이(1) 스택 활용 #..

Algorithm/백준 2023.05.24

[백준] 11286 절댓값 힙 with C++

문제설명 입출력 예제 개념 우선순위 큐의 정렬 순서를 직접 지정하면 풀 수 있는 문제다. 구조체를 이용하여 연산자를 오버로딩하여도 되고, 단순히 비교 함수를 인자로 추가해도 된다. 풀이 #include #include #include using namespace std; bool abs_operator(int a, int b) { return abs(a) == abs(b) ? a > b : abs(a) > abs(b); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, n; priority_queue pq(abs_operator); cin >> N; while (N--) { cin >> n; if (n == 0) { if (pq.e..

Algorithm/백준 2023.05.23

[백준] 1927 최소 힙 with C++

문제설명 입출력 예제 개념 지난 게시글인 최대 힙 문제처럼 우선순위 큐를 이용하여 풀면 쉽게 해결할 수 있다. 즉, 우선순위 큐를 최소 힙으로 정렬하면 된다. 풀이 #include #include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, n; priority_queue pq; cin >> N; while (N--) { cin >> n; if (n == 0) { if (pq.empty()) printf("0\n"); else { printf("%d\n", pq.top()); pq.pop(); } } else pq.push(n); } }

Algorithm/백준 2023.05.22