Computer Science/프로그래머스
-
프로그래머스 Lv2 땅따먹기Computer Science/프로그래머스 2023. 10. 6. 11:22
더보기 이 문제는 DP로 풀면 된다. 0번째 행에서 접근하는 방법을 찾아보자. 1 2 3 5 5 6 7 8 4 3 2 1 100 1 2 3 1번째 행 입장으로 생각하면 1번째 행에서 0번 열을 선택하면 {2, 3, 5}중 한가지를 선택해야 하므로 5를 선택한다. 1번째 행에서 1번 열을 선택하면 {1, 3, 5}중 한가지를 선택해야 하므로 5를 선택한다. 1번째 행에서 2번 열을 선택하면 {1, 2, 5}중 한가지를 선택해야 하므로 5를 선택한다. 1번째 행에서 3번 열을 선택하면 {1, 2, 3}중 한가지를 선택해야 하므로 3을 선택한다. 선택한 값을 다음 행에 누적시킨다. 1 2 3 5 10 11 12 11 4 3 2 1 100 1 2 3 2번째 행 입장으로 생각하면 2번째 행에서 0번 열을 선택하면..
-
프로그래머스 Lv2 멀리 뛰기Computer Science/프로그래머스 2023. 10. 6. 10:45
n = 1 {1} n = 2 {2} {1, 1} n = 3 {2, 1} {2, 1} {1, 1, 1} n = 4 {2, 2} {2, 1, 1] {1, 2, 1} {1, 1, 2} {1, 1, 1, 1} 나는 이 문제를 점화식을 세워서 해결했다. DP[n] = DP[n - 1] + DP[n -2]로 풀면 해결된다. 하지만,,, n = 0 일 때 1을 줘야하는 부분이 헷갈렸다. n = 2일 때를 생각하면 쉽게 풀리는 문제였다... #include #include using namespace std; int DP[2001] = {}; long long solution(int n) { long long answer; DP[0] = 1; DP[1] = 1; for(int i = 2; i
-
프로그래머스 Lv2 숫자 블록(소수)Computer Science/프로그래머스 2023. 10. 5. 11:45
나는 이 문제를 1'000'000'000보다 작거나 현재 블록 보다 작지만 가장 큰 약수를 구하는 문제로 이해했다. 예를들어 18번째 위치에 있는 블록을 생각해보자. "1, 2, 3, 6, 9, 18"의 블록이 18번째에 올 수 있다. 나중 블록이 이전에 깔린 블록을 덮으므로 18번째 블록은 9이다. 여기서 "1"은 약수가 아니므로 가장 큰 약수는 "2"로 나눈 "9이다" (18 / 2 = 9) 결국 처음에 오는 가장 작은 약수로 18번째를 나누면 되는 문제이다. 하지만 조건에 블록이 "1'000'000'000' 을 초과하면 안된다 하므로 가장 큰 약수를 구하는 조건에 추가했다. 또한 소수인 경우에 약수는 1이므로 가장 큰 약수를 찾지 못했을 땐 약수 1을 추가한다. 1번째에는 0의 블록이 들어가므로 b..
-
프로그래머스 Lv2 숫자의 표현Computer Science/프로그래머스 2023. 10. 5. 10:17
문제의 접근을 먼저 N이 될 수 있는 수를 만들고 그 다음 수가 오면 그 다음 수만큼 배열에서 값을 뺀다. 만약에 다음에 오는 수보다 뺀 값이 크다면 다시 다음 수를 빼고 다음수를 추가한다. 따라서 재귀를 사용해서 문제를 해결하면 될 것 같다. 첫번째로 N만큼의 배열을 만든다. 두번째로 N만큼의 배열에서 다음 수 만큼 뺀다. 세번째로 뺀 수가 다음 수 보다 크다면 앞의 수를 빼고 다음 수를 추가한다. 라고 접근하고 풀이했다. sum이 n보다 작거나 같다면 deque에 원소를 더했다. sum이 n보다 크다면 deque의 원소를 뺐다. sum이 n과 같은 경우는 answer를 증가했다. deque의 마지막 값이 n과 같다면 반복문을 종료 시켰다. #include #include #include using n..
-
프로그래머스 Lv2 최솟값 만들기Computer Science/프로그래머스 2023. 10. 5. 09:29
두 배열의 곱에서 최솟값을 구하려면 한 배열은 오름차순 정리, 한 배열은 내림차순 정리를하면 된다. sort 함수에서 greater 를 사용하면 내림차순으로 정리된다는 것을 외워야겠다. #include #include #include using namespace std; int visit[1001]; int solution(vector A, vector B) { int answer = 0; sort(A.begin(), A.end()); sort(B.begin(), B.end(), greater()); int Sum = 0; for(int i = 0; i < A.size(); ++i) { Sum += A[i] * B[i]; } return Sum; }
-
프로그래머스 Lv2 피보나치 수Computer Science/프로그래머스 2023. 10. 5. 09:07
이 문제는 피보나치 수열을 구하면된다. 재귀적으로 푸는데, 이미 계산한 피보나치수는 다시 계산을 하지 않도록 하는 것이 중요하다. #include #include using namespace std; long long arr[100'001]; long long fibonacci(int n) { if(n == 1) { return 1; } if(n == 2) { return 1; } if(arr[n] == 0) { arr[n] = fibonacci(n - 1) + fibonacci(n - 2); return arr[n]; } return arr[n]; } int solution(int n) { long long answer = 0; answer = fibonacci(n); return answer; }
-
프로그래머스 Lv2 줄 서는 방법Computer Science/프로그래머스 2023. 10. 3. 12:47
https://school.programmers.co.kr/learn/courses/30/lessons/12936 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr k번째 순열이 어떤 모습인지 순회하지 않고 바로 알아내는 방법 n = 4, k = 16을 예로 들어보자. 즉 [1, 2, 3, 4]로 이루어지는 순열의 16번째 순열이 어떤 모습인지 규칙을 찾아내보자 [1, 2, 3, 4] 즉 n =4의 순열은 총 4! = 24가지가 나올 수 있다. 4!는 4*3!와도 같다. [1, 2, 3, 4] 순열 순서의 규칙 (총 4*3! = 24개) [1, 2, 3, 4..
-
프로그래머스 Lv2 행렬의 곱셈Computer Science/프로그래머스 2023. 10. 2. 19:20
https://school.programmers.co.kr/learn/courses/30/lessons/12949 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 나는 이 문제를 3중 반복문으로 풀었다. 첫번째 반복문은 arr1의 행, 두번째는 arr2의 열, 세번째는 arr1의 열만큼 행렬의 연산을 했다. #include #include using namespace std; vector solution(vector arr1, vector arr2) { vector answer; for(int i = 0; i < arr1.size(); ++i) { vect..