42747 H-Index [문제 바로가기]
solution
1. 내림차순으로 citations 배열을 정렬한다.
2. citations의 크기에서부터 0까지 i를 감소시키면서 for문을 돈다.
2-1. 가능한 h의 최대는 citations의 크기이다. (ex. [2, 2])
3. 이때의 i값이 가능한 h값인지 탐색한다.
3-1. citations의 값이 i보다 크거나 같으면 정렬이 안되어 있으므로 탐색 인덱스를 증가시킨다.
3-2. 이때 같은 경우에도 증가시키는 이유는 문제 조건이 "이상" 이기 때문에 값에 포함되기 때문이다.
3-3. citations 값이 맨 처음으로 i보다 크거나 같아지는 순간이 정답이다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> citations) {
int answer = 0;
sort(citations.begin(), citations.end(), greater<>());
for(int i = citations.size();i >= 0;i--) {
int idx = 0;
while(idx < citations.size() && citations[idx] >= i)
idx++;
if (idx >= i) {
answer = i;
return answer;
}
}
return answer;
}
42746 가장 큰 수 [문제 바로가기]
solution
1. numbers의 원소를 string으로 바꾼다.
2. string으로 변환된 원소를 큰 수를 만들 수 있는 내림차순으로 정렬한다.
3. 정렬된 배열을 돌면서 answer 문자열에 차례대로 추가한다.
4. answer 문자열이 모두 0이라면 0을 하나로 만들어준다.
2-1. 이때 문자열의 자릿수마다 배열을 돌면서 int(or char)로 변환하여 크기를 비교한다. (c++는 ascii 코드고 char == int)
2-2. 자릿수가 다르다면 가장 앞의 문자와 비교한다.
즉 89, 899 를 비교할 때는 => 898, 899 를 비교하도록 만든다.
이 경우 899 > 898 이기 때문에 정렬하면 [899, 89] 이 된다.
2-3. 만약 길이가 달라서 가장 앞의 문자를 붙였더니 두 문자열이 같아진다면 가능한 경우의 수를 따진다.
즉 89, 898 을 비교할 때 2-2 을 적용하면 => 898, 898 으로 두 문자열이 같아진다.
이 경우 가능한 경우의 수인 89898, 89889 를 비교한다.
이때 89898 > 89889 이기 때문에 정렬하면 [89, 898] 이 된다.
2-4. 2-3으로 만든 두 문자열이 같다면 return false 한다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(string str1, string str2) {
int idx1 = 0, idx2 = 0;
while(idx1 < str1.size() || idx2 < str2.size()) {
// 길이가 다르면 맨 앞자리 문자와 비교
int char1 = (idx1 >= str1.size()) ? str1[0] : str1[idx1];
int char2 = (idx2 >= str2.size()) ? str2[0] : str2[idx2];
if (char1 != char2) {
return char1 > char2;
}
idx1++;
idx2++;
}
// 맨 앞자리를 붙여도 문자열이 같으면 가능한 경우의 수 비교
string temp1 = str1+str2, temp2 = str2+str1;
// 그래도 문자열이 같으면 return false
if(temp1 == temp2)
return false;
return compare(temp1, temp2);
}
string solution(vector<int> numbers) {
string answer = "";
vector<string> result;
for(int i = 0;i < numbers.size();i++) {
result.push_back(to_string(numbers[i]));
}
sort(result.begin(), result.end(), compare);
string temp = "";
for(int i = 0;i < result.size();i++) {
answer += result[i];
temp += "0";
}
// 문자열이 모두 0이면 하나의 0으로 만들어준다.
if (answer == temp)
answer = "0";
return answer;
}
사실 이렇게 풀긴 했는데 이 부분을 true로 만들면 segfault 가 발생한다.,..
// 그래도 문자열이 같으면 return false
if(temp1 == temp2)
return false;
'ALGORITHM > c&c++ programmers' 카테고리의 다른 글
[C++] Heap 모음 (Priority Queue) (0) | 2023.04.07 |
---|---|
[MySQL] SQL 문제 모음 (0) | 2023.04.06 |
[C++] DFS/BFS 모음 (0) | 2023.04.06 |
[C++] Hash 모음 (0) | 2023.04.02 |
[C++] 완전 탐색 모음 (0) | 2023.04.01 |