장르 이름 및, 장르에 속한 곡들의 재생수의 합으로 간단하게 맵을 만들어도 될 것 같다. 여기서는 정렬을 해야하니까 해시보다는 맵이 잘 어울리리라 생각했다. Index를 또 참고하기 싫어서 넣는김에 인덱스 값도 문자열로 변환해서 더해줬다. map genresMap; for(int i = 0; i < genres.size(); i++) { genresMap[genres[i]].first+=plays[i]; genresMap[genres[i]].second += to_string(i); } genre name : classic genre playtime : 1450 genre index : 023 genre name : pop genre playtime : 3100 genre index : 14 출력하면 이..
1. 문자열을 쪼개서 문자 하나로 저장한 뒤, 조합 가능한 모든 수를 생성한다. 2. 소수 검사 함수를 만든다. 1. 조합 가능한 모든 수를 생성하고 중복 제거하여 저장하기 조합 가능한 모든 수를 어떻게 만들지에서 고민을 많이 했다. algorithm STL의 next_permutation을 쓰면 순열을 만들 수 있다고 한다. '내림차순'으로 해당값이 정렬을 마칠때까지 순서대로 작업을 진행한다. 그렇기 때문에 모든 경우의 수를 파악하고 싶다면, sort로 오름차순을 만들어주고 next_permutation이 false를 반환할때까지 계속하면 되는 것이다.(이 함수는 작동하지 않으면 false를 반환한다.) 배열뿐만 아니라 string에도 가능하다. sort(numbers.begin(),numbers.en..
i 0 1 2 3 4 답 1 3 2 4 2 1번 1 2 3 4 5 2번 2 1 2 3 2 3번 3 3 1 1 2 1번 수포자 1, 2, 3, 4, 5 반복. if(answers[i] == i%5+1) points[0]++; 2번 수포자 2 1 2 3 2 4 2 5 ... 반복. 홀수번째는 2, 짝수번째는 1, 3, 4, 5를 반복하고 있다. i을 8으로 나눈 나머지 값을 기준으로 채점. 2로 나눈 나머지값이 0이면 2와 비교, 1이면 범위를 나눠서 채점한다. temp = i % 8; if(temp % 2 == 0 && answers[i] == 2) points[1]++; else if(temp % 2 == 1 && answers[i] == p2[(temp-1)/2]) points[1]++; 3번 수포자 ..
예시로 주어진 것들을 직접 머릿속으로 돌려보면서 솔루션을 어떻게 짤 지 파악했다. 먼저 너비 및 높이에서의 최댓값과 해당 값의 인덱스를 루프문을 돌려 파악해둔다. 예시의 경우, (3, 80)과 (1, 70)이 각각 저장된다. 여기서, 가장 큰 값인 80은 명함을 어떻게 돌리던간에 무조건 최대값이므로 80은 고정인 셈이다. 그렇기 때문에 더 작은값인 높이 70에 해당하는 명함을 돌려봐야 한다. 여기서 문제... 무조건 명함을 돌려볼 필요가 있는가? 아니다. 명함을 돌리는 이유는, 이 예시의 경우 높이의 최대값을 줄이기 위함이다. 그런데, 돌리고 나서 그 값이 더 커지면 의미가 없어진다. 즉, 이 예시에서는 30과 70의 값을 비교해서, 30이 더 작기 때문에 돌릴 가치가 있다고 판단하고 명함을 돌린다.(명..
내림차순으로 정렬하면 6 5 3 1 0 6부터 점검한다. 6 1 X h=6번 이상 인용된 논문 : 1편. h=6보다 작으므로 아님 5 2 X h=5번 이상 인용된 논문 : 2편. h=5보다 작으므로 아님 3 3 O h=3번 이상 인용된 논문 : 3편. h=3보다 크거나 같으므로 h-index 1 4 O 0 5 O 보면 index+1의 값이 곧 인용논문의 수가 된다. #include #include #include using namespace std; bool cmp(int a, int b) { return a>b; } int solution(vector citations) { int answer = 0; sort(citations.begin(),citations.end(),cmp); for(int i =..
모든 조합을 짜고 max를 찾는건 미친짓이므로 패스... sort를 쓰되, 세번째 인수로 커스텀 함수를 넣어주려고 한다. a와 b가 있다면, 이를 문자열로 붙여주고 ab와 ba의 크기를 비교해서 큰 쪽으로 정렬되도록 만든다. 3, 30이 있따면 330, 303의 조합이 되고, 330이 크니까 3, 30으로 정렬되게끔 한다는 이야기이다. 이를 위해서는 모든 배열값들의 문자화가 필요했다. sort의 사용자 정의 함수를 어찌 짜야할지 감이 안잡혀서 다시 한 번 공부했다. bool compare(int a, int b) { return a b;//a > b가 true일때 정..
기본적인 배열 사용법과 sort 사용하기 문제. #include #include #include using namespace std; vector solution(vector array, vector commands) { vector answer; for(auto input : commands) { vector sliceArray; for(int i = input[0]-1; i < input[1]; i++) { sliceArray.push_back(array[i]); //배열 잘라서 새로운 배열 생성 } sort(sliceArray.begin(),sliceArray.end()); answer.push_back(sliceArray[input[2]-1]); } return answer; } sliceArra..
의상의 이름은 크게 중요하지 않다. 의상 종류에 몇가지의 의상이 있는지 숫자로 바꾸면 된다. 종류 이름 얼굴 안경, 선글라스 상의 티셔츠 하의 바지 겉옷 코트 before unordered_mapmap; for(auto i : clothes) { map[i[1]]++; } 2차원 배열을 어케 쓰나 했는데, 그냥 각 element마다 [0]으로 옷 이름, [1]로 옷 종류 접근이 가능했다. key value 얼굴 2 상의 1 하의 1 겉옷 1 after 옷의 조합 계산하기 하.. 나란 바보.. 어케 이런방법을 생각 못하다니 나는 옷 껴입을 개수 별로 계산을 해서 더할 생각을 하고있었는데, 그냥 종류 이름 얼굴 안경, 선글라스, 안입음 상의 티셔츠, 안입음 하의 바지, 안입음 겉옷 코트, 안입음 이렇게 옷 ..
처음 떠오른 방법은 2중 반복문으로 문자열을 비교하는 방법이었는데, 보나마나 시간초과가 뜰 것이라 패스했다 다음으로 떠올린 방법은, 주어진 값들을 sort해서 인근값이랑 비교하기. 1중 반복문을 사용한다. bool solution(vector phone_book) { sort(phone_book.begin(),phone_book.end()); for(int i = 0; i < phone_book.size()-1; i++) { int m = min(phone_book[i].size(),phone_book[i+1].size()); if(phone_book[i].substr(0,m) == phone_book[i+1].substr(0,m)) return false; } return true; } phone_bo..
가져갈 개수를 따로 계산해준 뒤, 중복값을 value로 카운트하도록 해시테이블을 만들어보자. 두번째 케이스인 [3,3,3,2,2,4]를 예시로 들겠다. int count = nums.size()/2; unordered_map map; for(int element : nums) { map[element]++; } key(해시 함수 전으로 고려) value 3 3 2 2 4 1 count에는 nums의 size인 6을 2로 나눈 값 3이 저장된다. 다양성을 고려하기 위해, count와 key 종류의 개수를 비교할 필요가 있다. key의 개수는 이 해시 테이블의 크기를 이용하면 될 것이다. .size()를 통해 알 수 있다. int keyNum = map.size(); if(count