목록알고리즘 (547)
N
주어진 배열에서 3개의 수를 더했을 때 소수인지 판별하면 된다..! 우선 1000 이하의 자연수이고, 3개의 수를 더해야 하기 때문에 구할 수 있는 소수의 최댓값은 1000 + 999 + 998이다. 2997이므로 소수를 판별하는 배열 prime[2998]을 선언하여 false로 초기화해준다. (소수 판별하는 for문의 설명) https://eunchanee.tistory.com/18 (프로그래머스 c++)소수 찾기 소수 찾는 기본적인 문제..! 종종 알고리즘 문제를 풀다보면 나오는 것 같다..! 그래서 풀이 형태를 외워두는 게 나을 것 같다..! 전역 변수로 1000001 크기의 bool 형태 배열을 선언해준다. 2부터 n까� eunchanee.tistory.com 그리고 nums를 오름차순으로 정렬해..
문자열을 int형으로 바꿔서 문제를 풀어야 한다. 우선 괄호와 ',' 때문에 조건을 많이 걸어야 했다. 2차원 int형 벡터 v와 1차원 int형 벡터 num, string을 int로 변환하기 위한 임시 변수 tmp가 핵심이다. for문은 1 ~ s.size() - 1까지 반복하도록 하였다. s의 맨 처음 괄호와 맨 끝 괄호는 고려하지 않아도 되기 때문이다..! 튜플을 구분하기 위한 괄호를 이용하여 flag를 썼다. if(open == false && s[i] == '{') open = true; 각 튜플이 시작되면 open을 true로 바꿔주었다. 이후 '}'가 나올 때까지 해당 튜플의 수를 int로 바꿔준다. s[i]가 숫자라면 tmp에 넣어주면 된다. 만약 s[i]가 ','가 나온다면 tmp를 st..
bitset을 이용하여 문제를 풀었다..! bitset은 int형 n을 bit 형태로 만들어 주기 때문에 이 문제에 적용하기 좋다..! 우선 1의 개수를 알아야 하기 때문에 count 변수에 n의 1의 개수를 넣어준다. 그리고 answer에는 n + 1을 넣어주고, n + 1을 bit로 바꾸었을 때 1의 개수가 count와 같은 것이 나올 때까지 answer++을 해주면 쉽게 구할 수 있다. #include #include #include using namespace std; int solution(int n) { int answer = n + 1; int count = bitset(n).count(); while(bitset(answer).count() != count) answer++; return ..
DP를 이용하여 문제를 풀었다..! 우선 열의 개수는 무조건 4개이다. 시간은 충분할 것 같다..! 3중 for문을 이용하도록 하자. i = 1부터 시작하여, i - 1 행의 수를 모두 비교해야 한다. 단, j != k여야 같은 열 번호의 수를 선택하지 않는다. m은 현재 행의 위치에서 이전 행의 각 열을 더했을 때 가장 큰 값을 저장하는 변수이다. 그리고 이전의 최댓값이 누적이 되므로 마지막 행에서 최댓값만 찾으면 된다..! #include #include #include using namespace std; int solution(vector land) { int answer = 0, m = 0; for(int i = 1; i < land.size(); i++) { for(int j = 0; j < ..
문제는 길지만 막상 풀어보면 쉬운 문제다..! 우선 max = 가져갈 수 있는 폰켓몬의 수이므로 nums.size() / 2를 넣어준다. 그리고 같은 종류는 가져가지 않도록 check[200001] = {false, }로 하여 체크하도록 한다. for문으로 answer == max 일 때까지 반복한다. 만약 check[nums[i]] == false라면 처음 가져가는 폰켓몬의 종류이므로 answer++을 해주고, 해당하는 종류 번호를 true로 바꿔주면 끝..! #include #include using namespace std; int solution(vector nums) { int answer = 0, max = nums.size() / 2; bool check[200001] = {false, };..
연속된 숫자들의 합이 n과 같으면 answer++을 해주면 된다..! 우선 start = 1 을 선언해준다. start로 연속된 숫자의 시작을 알 수 있도록 하기 위함이다. 이제 while문으로 start
문자열로 들어온 값 중에서 최댓값과 최솟값을 찾아야 한다. 우선 문자열을 int 형태로 바꿔줘야 한다. 그리고 공백 문자를 제외하고 숫자만 가져와야 하기 때문에 token을 이용하여 문자열을 나누었다. for문이 token을 이용하여 공백을 제외하고 숫자만 받아와 int 형태로 v벡터에 넣어주고 있는 부분이다. 모든 숫자를 가져왔으면 sort()를 통해 오름차순으로 정렬을 해준다. 그러면 v.front()는 최솟값, v.back()은 최댓값이 되므로 to_string()으로 int를 string형태로 바꿔주고 알맞게 answer에 넣어주면 끝..! #include #include #include #include #include using namespace std; string solution(string..
벡터를 정렬하여 최솟값을 만드는 문제..! 우선 A와 B 벡터를 오름차순과 내림차순으로 정렬한다. 내림차순으로 정렬할 때에는 desc() 함수를 이용하도록 하였다. 그리고 각각의 자리에 있는 값을 곱하여 answer에 누적시키면 끝..! 추가적으로 sort()를 내림차순으로 만들 때, sort(B.rbegin(), B.rend())를 사용하여도 된다! rbegin()과 rend()는 역방향 반복자다..! #include #include #include using namespace std; bool desc(int a, int b) { return a > b; } int solution(vector A, vector B) { int answer = 0; sort(A.begin(), A.end()); sor..