프로그래머스
-
프로그래머스 Lv3 야근 지수Computer Science/프로그래머스 2023. 10. 18. 15:20
접근법 야근 지수를 구하는 공식이 a^2 + b^2 + c^2 .... n^2이므로 수학적으로 접근하면 크기가 균등하게 작아지면 된다는 점으로 접근하면 된다. 따라서 우선순위 큐를 사용해서 현재 가장 큰 값을 줄이는 방식으로 접근하면 된다! 풀이 우선순위 큐를 사용하면 제일 큰 값이 top()에 오기 때문에 감소 시킨다. 이 때 N시간 동안 일을 할 수 있기 때문에 N을 감소시키고 우선순위 큐도 갱신하기 위해 pop() 을 진행 후 push()를 해준다. works의 원소가 모두 0이 되는 경우가 있기 때문에 push() 전에 원소가 0인지 아닌지를 체크한다. works의 모든 원소가 0이되는 예) works n result [1,1] 3 0 코드 #include #include #include #inc..
-
프로그래머스 Lv2 올바른 괄호Computer Science/프로그래머스 2023. 10. 6. 11:49
더보기 올바른 문자열이 아닌 경우는 '(' 이 없는데 ')' 문자가 오는 경우 '(' 이 있는데 문자열이 끝난 경우 따라서 나는 코드를 아래와 같이 설계했다. 스택이 비었는데 ')' 문자가 오면 잘못된 문자열 스택이 비어있지 않을 때 스택의 top() == '(' 이고, 현재 문자가 ')'이면 스택에서 문자열을 제거한다. 모든 문자열을 탐색했는데 스택이 차있으면 ')' 문자가 부족하다는 것이므로 잘못된 문자열 코드는 아래와 같다. #include #include #include using namespace std; bool solution(string s) { bool answer = true; stack st; for(int i = 0; i < s.size(); ++i) { if(st.empty() &..
-
프로그래머스 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..