Computer Science/프로그래머스
-
프로그래머스 Lv3 GPSComputer Science/프로그래머스 2023. 10. 12. 10:56
https://school.programmers.co.kr/learn/courses/30/lessons/1837 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이 문제는,,,너무 어려웠다,,, 처음에는 다익스트라로 풀고, 처음부터 마지막 경로까지 가는데 막힌 부분이 있다면 로그를 확인해서 경로를 수정하는 방법으로 풀려고 했다. 하지만 위 풀이는 막히기 전에 경로를 수정할 때 해결을 하기가 어려웠다. 다른 사람들은 dp(dynamic programming)으로 풀었다. 현재 시간에 모든 거점에서 이전 시간의 모든 거점과 이전 시간의 거점에서 연결 된 거점들..
-
프로그래머스 Lv2 리틀 프렌즈 사천성Computer Science/프로그래머스 2023. 10. 10. 13:01
이 문제는 bfs로 풀어야한다 생각은 했다. 1. map을 만들어서 각 케릭터에 대한 좌표 값을 모아둔다. 2. 타일이 모두 빌 때 까지 반복문을 돌리고, 반복문 안에서는 타일에 대해 순회한다. 이 때 타일을 한번 순회 했는데 한번도 케릭터를 제거하지 못하면 실패 처리한다. 3. 순회를 하는 코드는 케릭터의 시작 위치를 가져오고 제일 먼저 4개의 주변 방향을 큐 안에 넣는다. 이 때 "위치, 이동 방향, 꺽은 적이 있는지"를 확인 할 수 있는 데이터를 같이 넣어준다. #include #include #include #include #include #include using namespace std; struct pos { int m; //m 좌표 int n; //n 좌표 int r; //이동 방향 boo..
-
프로그래머스 카카오캠핑 Lv2Computer Science/프로그래머스 2023. 10. 9. 19:53
나는 이 문제를 2차원 배열을 x좌표에 대해서 오름차순으로 정리했다. 그러면 위와 같은 사각형 꼴로 정렬이 된다. (정확하게는 y축도 정렬을 해주긴 해야한다) 첫번째로 (1, 1)을 선택하고 이후에 있는 (3, 2) 를 선택 후 (2, 2)가 범위 안에 있는지 검사하는 꼴로 문제를 풀면된다. (1, 1)을 선택하고 이후에 있는 (3, 2) 를 선택 이 부분의 구현은 min max 함수를 사용하고 행과 열이 일치하는 좌표가 있는지 검사하면된다. for(int i=0; i
-
프로그래머스 Lv 보행자 천국Computer Science/프로그래머스 2023. 10. 9. 18:38
나는 이 문제를 dfs로 접근했다. 각 칸을 경로로 생각하고 1. 0을 만나면 2방향을 모두 탐색 2. 1을 만나면 탐색 중지 3. 2를 만나면 이전 방향이 오른쪽 진행이면 오른쪽으로 이동 아래로 진행이면 아래로 이동 하도록 코드를 짰다. 하지만 코드를 실행하면 실패가 떴다.. 코드는 아래와 같다. #include #include using namespace std; int MOD = 20170805; bool visit[501][501]; void dijkstra(int x, int y, int m, int n, const vector& city_map, int dir, int* dx, int* dy, int& answer) { if(y == m - 1 && x == n - 1) { ++answer; ..
-
프로그래머스 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 ..