본문 바로가기

Algorithm/PS

(60)
[1일 1알고] 택배 배달과 수거하기 택배 배달과 수거하기https://school.programmers.co.kr/learn/courses/30/lessons/150369 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 택배를 배달해야합니다.아이디어만 떠올리면 쉽게 해결할 수 있는 문제입니다. cap제한에 따라 택배를 배달할 수 있는데 결국 한번 왕복할 때 cap개의 박스를 배달하고 cap개의 빈박스를 수거할 수 있습니다. 그렇다면 한번 왕복할 때 배달하는 집 혹은 수거하는 집들 중 제일 멀리있는 집의 거리를 더해가면 답이 나온다는 것을 알 수 있습니다.#include #include using namespace std;long long solut..
[1일 1알고] 카드 짝 맞추기 해당 문제는 빡센 구현 문제입니다. 간단해보이지만 여러가지 기술이 합쳐진 컴비네이션 문제입니다. 기본적으로 뒤집어야할 카드의 위치는 모두 공개되어있습니다. 최소 이동값을 구해야하는데 이를 위해 카드를 어떤 순서로 뒤집어야할지 정해야합니다. 최대 카드는 6개까지이고, 카드의 한쪽을 고르면 반드시 다음 선택은 같은 번호의 짝 카드이기 때문에 최대 경우의 수는 12 * 10 * 8 ... * 2일 것입니다. 따라서 모든 경우를 따져도 시간초과가 발생할 문제는 아닙니다.각 경우를 탐색하기 위해서는 조합을 만드는 것 처럼 dfs를 사용해야할 것입니다. 또한 카드를 고를 때 같은 번호라도 어떤 것을 먼저고르는지에 따라 경우가 달라지기 때문에 이는 별도로 백트래킹으로 관리해야할 것입니다.카드에서 카드 간 이동하는 거..
[1일 1알고] 주차 요금 계산 https://school.programmers.co.kr/learn/courses/30/lessons/92341 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr카카오에서 출제한 lv2문제치고는 굉장히 간단한 문제입니다.다만 구현할거리가 적진 않았네요 기본적으로 주어진 문자열을 파싱하고 이를 통해서 자료구조에 저장해가며 해결하는 방식입니다. 단순 구현문제이기에 사람마다 해결방식이 다를 수 있습니다.저는 차가 들어간 시간만을 기록하는 map과 결과를 기록하는 map을 사용했습니다. 문제의 시간이 빡빡하지는 않을 거라 마지막에 정렬하는게 귀찮기 때문에 ordered_map을 그대로 사용했습니다. 파싱은 문자열의 형식..
[1일 1알고] 택배 상자 꺼내기 https://school.programmers.co.kr/learn/courses/30/lessons/389478 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 배열을 사용하면 굉장히 쉽게 풀 수 있지만 이런 문제는 또 수학적으로 풀고 싶은 마음이 생기죠 // 1~n 번호의 택배 상자// snake형식으로 쌓음 좌하단부터 시작// 특정 숫자를 찾을 때 몇 열인지 확인int solution(int n, int w, int num) { int answer = 0; int q = (num-1) / w + 1; int r = (num-1) % w + 1; int offset; if (q ..
[1일 1알고] [PCCP 기출문제] 4번 / 수식 복원하기 그동안 문제는 계속 풀었는데 포스팅을 못했었네요오늘은 약간 복잡한 문제었던김에 적어보려고 합니다. 2~9진법 중 하나를 사용하는 체계일 때 expresion 의 X를 채워넣어야합니다. 예를 들어 expressions가 ["14 + 3 = 17", "13 - 6 = X", "51 - 5 = 44"] 라면 51-5=44를 통해 8진법임을 알 수 있습니다.다만 ["1 + 1 = 2", "1 + 3 = 4", "1 + 5 = X", "1 + 2 = X"]라면 1+2가 3인 것은 1+3이 4임을 통해 알 수 있지만, 1+5에 대해서는 6, 7, 8, 9 진법인지 알 수 없습니다. 따라서 1+5=?가됩니다.따라서 해야할 것은 2~9진법까지 그냥 하나하나 해가면서 정합한지 확인하는 것입니다. 다만 expression..
[1일 1알고] 유연 근무제 https://school.programmers.co.kr/learn/courses/30/lessons/388351 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 시간이라는 조건을 이용하는 간단한 문제입니다. 문제 조건에 직원이 출근하지 않는 날이 있을 수 있다는 언급이 없으며schedules[i]자체가 1100보다 작기 때문에 날짜가 넘어갈 일이 없습니다. 일반적으로 하는 시간 낚시가 없기 때문에 50 + 10 = 110같은 기본적인 시간 연산만 신경쓰면 쉽게 통과할 수 있습니다. #include #include using namespace std;int solution(vector schedules, vec..
[1일 1알고] 완전 범죄 https://school.programmers.co.kr/learn/courses/30/lessons/389480 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 이번 문제는 DP문제입니다.보면 A혹은 B도둑이 물건을 훔치는 경우를 고려해야하는데 depth가 최대 40이므로 dfs 등 완전탐색 기반의 알고리즘을 사용하기에는 무리가 있습니다. 따라서 일단 DP방식을 생각해야합니다. 필요한 정보는 현재 시점에서 a가 남긴 흔적, b가 남긴 흔적입니다.그런데 하나의 이차원 배열로만 상태를 관리하기에는 이전의 상태만 고려해야하지 그보다 이전의 상태는 고려하면 안되기 때문에 두 개의 배열을 통해 왔다갔다 하도록 했습니다..
[1일 1알고] 서버 증설 횟수 https://school.programmers.co.kr/learn/courses/30/lessons/389479 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr Lv2라고 하는데 굉장히 간단한 문제입니다. 서버의 최소 증설 횟수를 알아야하는데 배열 범위안에서 간단한 사칙연산을 통해 계산해 구할 수 있습니다.#include #include using namespace std;int solution(vector players, int m, int k) { int time = players.size(); vector servercnt(time, 0); int answer = 0; for (in..