Computer Science
-
프로그래머스 Lv2 브라이언의 고민Computer Science/프로그래머스 2023. 10. 8. 16:09
첫번째로 나는 (규칙1, 규칙2, 규칙1 + 규칙2)의 조건을 검사하기로 했다. 첫번째 문자가 대문자이면 규칙1 첫번째 문자가 소문자이면 규칙2 규칙 1일 경우 if (isupper(sentence[i])) { word += sentence[i]; first_rule = true; if (i + 1 == sentence.length()) { first_rule = false; words.push_back(word); word = ""; } else if (isupper(sentence[i + 1])) { first_rule = false; words.push_back(word); word = ""; } else if (islower(sentence[i + 1])) { if (checked[sentence..
-
프로그래머스 Lv2 가장 큰 정사각형 찾기Computer Science/프로그래머스 2023. 10. 6. 13:29
더보기 나는 첫번째로 이 문제를 dfs로 풀려고 했다. board의 행과 열이 1000이하의 자연수 이므로 최대 시간 복잡도가 1000 ^ 4가 되므로 시간 초가가 될 거라는 것을 예상하고 풀었다... 당연히 시간 복잡도에서 실패,,,아래는 틀린 코드이다. #include #include using namespace std; int n = 0; int m = 0; bool visit[1001][1001]; int rectangle(const vector& board, int x, int y, int depth) { if(x + 1 >= m || y + 1 >= n) { return depth * depth; } if(board[y][x + 1] && board[y + 1][x] && board[y + 1..
-
프로그래머스 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:36
더보기 이 문제는 n을 늘려가면서 2진수 일 때 1 개수가 같은지 확인하면 된다. 가장 작은 수를 찾으면 되기 때문에 조건 1, 2가 맞는지 확인하고 바로 리턴하면 된다. 2진수의 개수가 같은지 확인하는 부분이 어려웠는데 bitmasking을 통해서 풀었다. n의 최대값이 1'000'000이므로 24비트까지 검사를 했다. int bitmask(int n) { int result = 0; for(int i = 0; i >i) & 1) == 1) ++result; } return result; } 더보기 위와 같이 bitmasking 코드를 구현하면된다. #include #include using namespace std; int bitmask(int n) { int result = 0; for(int i ..
-
프로그래머스 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..