목록Algorithm/Programmers 문제풀이 (36)
Dolphins의 HelloWorld
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42883 풀이 level 2 인 것 치고 생각보다 풀기 어려웠던 문제였다. 일단 주어진 숫자에서 k개의 수를 빼 나간다고 가정했을 때 큰 숫자를 만들기 위해서는 앞쪽에 큰 숫자를 배치해야하며 만약 동일한 숫자가 연달아 나온다면 큰 수를 만들기 위해 뒤쪽에 있는 숫자를 빼야함을 알 수 있다. 이런 문제를 해결하기 위해 stack을 써서 이 문제를 해결하였으며 주어진 number를 스택에 쌓으면서 예를들어 첫 예제인 "1924"를 처리한다고 가정하였을 때 일단 첫 숫자인 1을 스택에 쌓고 다음 숫자인 9 같은경우 스택에 있는 1보다 크기 때문에 1을 제거한 후 9를 스택에 넣으며 다음 숫자인 2 같은 경..
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42860 풀이 이 문제를 복잡하지 않게 풀기 위해서는 조이스틱으로 이름을 만드는 경우의 수가 2가지라는 것을 먼저 파악하는 것이 중요하다. 이 2가지 경우의 수에는 맨 처음 문자를 수정한 뒤 맨 끝으로가서 이름을 만들기 시작하는 경우와 맨처음부터 그냥 순서대로 끝까지 이름을 만드는 경우가있다. 난 이 2가지를 모두 구현하고 두 방법중 조이스틱을 움직인 횟수가 적은걸 return하도록 하였다. 유의할 점으로는 예를들어 'ABCAA'라는 문자를 처음부터 순서대로 만든다고 했을 때 'C'를 만든뒤 뒤에 있는 문자들은 모두 'A'이기 때문에 이대로 더이상 조이스틱을 움직이지 않아도 된다는 것을 반영해야 한다..
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42862/solution_groups?language=cpp 풀이 먼저 여분의 옷을 가지고 있는 친구와 잃어버린 친구를 쉽게 구분하기 위해 다음과같이 map을 써서 저장해 놓았다. for(int i=0; i
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42841 풀이 완전탐색을 이용해 이 문제를 풀 수 있다는 것을 알아낸다면 그렇게 어려운 문제는 아니나 이를 깨닫지 못해 꽤 오랫동안 풀었던 문제이다. 가능한 답이 되는지 검사해볼 수는 모든 세자리 수 이므로 대충 900개라고 하고 질문은 최대 100개까지 할 수 있으므로 최대한 검사해도 90000번 검사를 수행하며 고로 완전탐색이 가능하다. 만약 문제가 잘 안풀린다면 반복문을 수행할 때 0이 나오는 경우를 배제하지 않았을 경우가 있으므로 이에 유의하도록 하자. #include #include #include using namespace std; int solution(vector baseball) {..
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/43162 풀이 DFS/BFS 중 어떤 방법을 써서 풀어도 상관없는 문제이다. 일단 computers 벡터에 들어있는 수들을 처리하기 쉽게 다시 벡터함수에 저장하였다. for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (computers[i][j] == 1) { v[i].push_back(j); v[j].push_back(i); } } } 이와같이 처리하였는데 이렇게 처리했을 때 노드별로 이어져 있는 노드들만 저장이 된다. 예를들어 1번노드가 2,3번 노드와 연결돼있다면 v[1][0] = 2 , v[2][0] = 1v[1][1] = 3 , ..
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/43104 풀이 처음으로 이런 문제를 만나면 당황할 수는 있겠지만 숫자들을 쭉 나열하고 규칙성을 찾아보면 생각보다 쉽게 풀릴 수 있다. 타일의 길이들을 처음부터 쭉 나열하면 1 1 2 3 5 8 13..... 이 되고 여기서 memo배열에 이 수를 저장한다고 했을 때 memo[i] = memo[i-3] + memo[i-2] + memo[i-1] 이런 식을 통해 길이가 도출됨을 알 수 있다. 둘레도 마찬가지 인데 가로 세로가 만들어지는 걸 관찰하다 보면 한 변 a = memo[N-2] + memo[N-1] 이 되고b = memo[N-1] + memo[N]이 되어 2 * (a + b) 를 하면 답을 도출할..
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42842 풀이 빨간색은 무조건 갈색으로 둘러싸여져야한다. 그 말은 일단 카펫의 가로, 세로가 3보다는 크다는 얘기이다. 그리고 갈색 격자의 수 + 빨간색 격자의 수 = 카펫의 넓이 이기 때문에 가로 * 세로를 해서 카펫의 넓이가 나오는 것을 구한다. 이 때 (가로-2) * (세로-2) 를 한 넓이가 빨간색 부분의 넓이이므로 이것까지 조건을 충족하는 것을 구하면 문제의 답을 구할 수 있다.
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42839 풀이 일단 먼저 에라토스테네스 방법을 통해 소수인 것과 소수가 아닌것을 bool형 배열에 구분해놓았다. bool check[10000000]; void eratosthenes() { for (int i = 2; i
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42746 풀이 꽤 많이 고민했는데 풀이가 생각보다 간단해서 짜증났던 문제이다.... 암튼 풀이는 진짜 별게 없고 sort알고리즘에서 활용하기 위한 비교함수를 만드는게 핵심이다. 비교함수에는 매개변수로 string 변수 2개를 가져와서 예를들어 string s1과 string s2가 있다면 s1+s2와 s2+s1중 더 큰것을 먼저오도록 작성하면 이 문제는 끝이 난다. #include #include #include #include using namespace std; bool cmp(string s1, string s2) { if (s1 + s2 > s2 + s1) return true; else re..
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42891 정답률 : 정확성 42.08% / 효율성 5.52% 풀이 결국 효율성 부분을 잡아야하는 문제이다. 만약 정확성만 고려한다면 매 초마다 처리해주어 시간은 오래걸리지만 정답은 맞는 코드를 짤 수 있을것이다. 아무튼 맨 처음에 한 것은 vector tmp(size) //size는 food_times의 크기 이것을 선언해 주어 food_times와 그 index를 넣어준 것이다 이후 이것을 food_times의 오름차순으로 정렬하였다. 만약 1 3 5 7 9 라고 정렬이 되었다 치면 처음에는 1*5 -> 5초를 한번에 처리할 수 있고, 다음엔 (3-1)*4 -> 8초를 한번에 처리할 수 있다. 이런..