목록알고리즘 (547)
N
옷의 모든 조합을 구하여 문제를 푸는 방식이다. 우선 맵을 이용하여 의상의 종류에 따른 개수를 구하였다. clothes[i][1]는 의상의 종류를 나타내므로 맵의 KEY 값이 된다. 그렇다면 해당하는 KEY의 값을 +1 씩 해주어서 종류에 따른 의상의 개수를 구하였다. 맵을 순회하면서 각각의 VALUE + 1 을 answer에 곱하여 마지막에는 answer - 1을 하여 반환해주면 된다. -1을 하는 이유는 모든 옷을 안입는 경우는 존재하지 않기 때문이다. 예를들어 옷의 종류가 A, B, C라고 하자. A 옷의 개수 : n(A) B 옷의 개수 : n(B) C 옷의 개수 : n(C) 그리고 해당 옷을 안입는 경우를 고려하여 각각 + 1을 해주도록 한다. 결국 (n(A) + 1) * (n(B) + 1) * ..
카테고리는 해시가 나와있지만, 간단하게 sort()를 활용하여 문제를 풀었다..! 우선 phone_book을 오름차순으로 정렬을 한다. 그리고 for문으로 0 ~ phone_book.size() 만큼 반복하고, 안에서는 i + 1 ~ phon_book.size() 만큼 반복한다. 1번째 for문)str은 현재 전화번호, size는 str의 크기를 나타낸다. 2번째 for문)tmp는 str을 접두어로 가지고 있는지 비교하기 위한 임시 변수로, i + 1부터 끝까지 탐색한다. substr을 이용하여 str의 size만큼 잘라내어 tmp에 저장한다. 그리고 tmp와 str을 비교하여 서로 같으면 바로 retrun false를 해주었다..! 만약 반복문을 끝까지 돌 때까지 return하지 않고 빠져나오면 한 번..
정렬을 활용하여 문제를 푸는 방식이다..! 우선 sort()함수를 사용하여 오름차순으로 정렬을 해준다. 그리고 H-Index를 찾기 위해 count 변수를 선언하여 1을 저장. 이제 H-Index를 citations 벡터 안에서 찾으면 된다..! u는 h번 이상 사용한 횟수, d는 h번 이하 사용한 횟수를 나타낸다. citations를 돌면서 count 이상이면 u++, count 미만이면 d++을 한다. 그리고 u >= count && d < count && answer < count 이면 answer = count 로 하여 answer 값을 최댓값으로 만들어주면 된다..! 여기서 이상한 문제점은 문제 설명에서는 h번 이상, h번 이하라고 하였는데, 예시를 보면 h번 이상, h번 미만으로 나와있어서....
처음 문제를 풀었을 때는 벡터를 이용해서 문제를 풀었다..! 하지만 효율성 테스트에서 시간 초과로 통과하지 못했다.. 그래서 priority_queue를 이용하여 문제를 풀었다. priority_queue는 우선순위 큐로 greater, less 함수를 이용하여 오름차순, 내림차순으로 정렬을 할 수 있다..! 시간 복잡도는 O(logn)이기 때문에 벡터를 이용해 sort 하는 것보다 빠르다..! 코드는 어렵지 않으니 천천히 보면 따라갈 수 있다..! #include #include #include #include using namespace std; int solution(vector scoville, int K) { int answer = 0; priority_queue pq; for(int i = 0..
우선 numbers를 내림차순으로 정렬을 하도록 하였다. 그러면 numbers의 최대값이 나오고, int형으로 변환하여 max 변수에 저장하였다. 그리고 for문과 전역변수로 선언한 prime 배열을 이용하여 2 ~ max 사이에 있는 소수를 false로 바꿔주도록 한다. (for문과 배열을 이용하여 소수 찾는 형태는 외워두면 알고리즘 문제에서 유용하게 쓸 수 있다..!) for(int i = 2; i
탐욕법을 이용하여 문제를 풀어야 한다..! 우선 변수를 여러 개 선언하였다. string s 는 while문을 탈출하기 위한 조건으로, name을 모두 'A'로 바꿨을 때 탈출하도록 하였다. 그래서 s에는 name 길이만큼 'A'를 넣어주었다. int형 변수로는 name의 길이를 나타내는 size, 현재 인덱스의 위치를 나타내는 current, 오른쪽으로 움직이는 횟수를 나타내는 right, 오른쪽으로 움직였을 때 바꿔야 하는 인덱스를 나타내는 go, 왼쪽으로 움직이는 횟수를 나타내는 left, 왼쪽으로 움직였을 때 바꿔야 하는 인덱스를 나타내는 back 이다. while문으로 name이 모두 'A'로 바꿔질 때까지 반복하도록 한다. 그리고 크게 if문을 잡았는데 현재 name[current]가 'A'인..
탐욕법을 이용한 알고리즘 문제이다..! 우선 limit 변수를 선언하여 number.size() - k 를 대입하였다. while문을 통해 구하고자 하는 큰 수의 size 를 구하기 위함이다..! 그리고 answer.size()가 limit이 될 때 까지 반복하도록 한다. 1) 반복자를 선언하여 number.begin()으로 위치시킨다. 2) k가 1이 아니면 number.begin()부터 k + 1 까지의 수 중 최댓값의 위치를 찾고, k가 1인 경우 number.begin()부터 2 까지의 수 중 최댓값의 위치를 찾아 itr에 넣어준다. (k가 1인 경우는 2개의 숫자만 비교하는 이유는 최악의 경우를 생각해야 하기 때문..!) 3) answer에 최댓값을 넣어주고, number에서는 begin()부터..
BFS를 이용하여 문제를 풀었다. 이중 for문을 사용하여 picture 벡터를 순회하였다. bfs함수를 통해 순회한 위치에는 -1을 넣어 탐색하지 않도록 설정한다. 현재 picture[i][j]가 0이거나 -1이면 무시하도록 하자..! 0, -1이 아니면 영역의 수를 나타내는 number_of_area를 1씩 늘려주고, 현재 picture[i][j] 원소의 개수를 bfs 함수를 통해 세어본다..! bfs(int m, int n, int x, int y, vector& picture, int target) --> m과 n은 그림의 크기, x와 y는 현재 순회하고 있는 인덱스, picture는 그림. 우선 종료조건을 만들어주자..! x ,y 가 0보다 작거나 x, y가 각각 m, n과 같거나, target..