본문 바로가기

ㄴ 알고리즘/프로그래머스풀이126

[프로그래머스 lv3] 숫자 게임 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 A의 출전 순서를 알고 있으므로 원하는대로 A 선수와 B 선수를 매칭시킬 수 있다. B의 승리 횟수를 최대화 하기 위해서는 A의 작은 수들부터 차례로 이겨나가야 한다. A의 여러가지 수들 중에서 작은 수를 이기는 것이 큰 수를 이기는 것보다 가성비가 좋기 때문이다. 따라서, A와 B를 오름차순으로 정렬한 뒤 A[i]를 이길 수 있는 B의 원소를 탐색한다. A[i]를 이길 수 있는 B의 원소가 존재할 때 nwin을 1 증가시키고 최종 nwin 값을 리턴하면 정답이다. 코드 #include #include #include #include #include #include #include #include #include #include #include #in.. 2022. 9. 5.
[프로그래머스 lv3] 야근지수 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 n만큼의 시간을 이용해서 n만큼의 작업을 할 때, 남은 작업들의 제곱 합을 최소로 만드는 문제이다. 현재 남아있는 작업 중에서 가장 값이 큰 작업을 먼저 줄여야 제곱의 합을 최소로 만들 수 있다. 우선순위큐를 이용하여 현재 남아있는 작업들 중 가장 큰 값을 뽑고, 해당 값을 1로 줄여 다시 우선순위큐에 넣는다. 이를 n만큼 반복하면, 제곱합을 최소로 할 수 있는 남아있는 작업 배열이 완성된다. 남아있는 작업 배열에서 각 원소를 제곱하여 더한 후 리턴하면 정답이다. 코드 #include #include #include #include #include #include #include #include #include #include #include #inc.. 2022. 9. 4.
[프로그래머스 lv3] 최고의 집합 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 가장 단순하게 백트래킹 방법이 떠오르지만, 백트래킹으로 n개의 합이 S가 되는 모든 경우를 탐색하면 TLE가 발생한다. dp 점화식도 세울 수 있지만, n과 s의 입력범위가 너무 커 해당 방법도 TLE가 날 것이 분명하다. 이 문제는 완전 탐색 없이 간단한 트릭을 통해 해결할 수 있다. 특정 배열의 원소의 곱이 최대가 되려면, 각 원소가 최대한 균등해야 한다. 예를 들어 n = 4 이고 s = 10일 때, 각 원소를 최대한 균등하게 하려면 s/n = 10/4 = 2 를 4개 마련하고 {2, 2, 2, 2} 여기에 나머지 2를 하나씩 더해준다. 결과적으로 {2, 2, 3, 3}이 최대 곱을 만드는 배열이 된다. n > s 이면 자연수 n개의합이 s가 되.. 2022. 9. 4.
[프로그래머스 lv3] 보석 쇼핑 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 해당 문제는 2020 카카오 인턴십에 출제되었던 문제로 공식 해설이 있습니다. 2020 카카오 인턴십 for Tech developers 문제해설 처음에는 이분탐색 + 슬라이딩 윈도우 기법으로 O(NlogN)에 해결하였으나, 이상하게 WA + TLE 이 떠서 결국 투포인터 방법으로 해결하였다. 왼쪽 포인터 l과 오른쪽 포인터 r을 0번 진열대에 위치시키고, map m; 에 0번 진열대의 보석 개수를 1로 기록한다. 이후, [l, r] 구간이 모든 종류의 보석을 포함하고 있는지 확인한다. 1) 만약, [l, r] 구간이 모든 종류의 보석을 포함하고 있다면, 길이가 r-l+1인 [l, r] 구간을 기록하고 l을 오른쪽으로 하나 이동시켜 구간의 길이를 줄여.. 2022. 9. 3.
[프로그래머스 lv3] 입국심사 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 이분탐색의 대표적인 유형으로, 소요 시간의 탐색 범위를 반으로 줄여 나가면서 n명의 줄서기가 가능한 최소 소요시간을 log(n)에 구하는 문제이다. 탐색 범위의 시작을 first, 탐색 범위의 마지막을 last라 했을 때, 주어진 시간이 mid = (first+last)/2 이면 n명의 사람이 모두 입국심사를 받을 수 있는지 확인한다. 만약, 가능하다면 일단 최소 시간을 mid로 기록하고, 탐색 시간의 끝을 last = mid-1로 조정한다. 만약, 가능하지 않다면 최소 시간의 탐색 범위를 first = mid+1로 조정한다. n명의 사람이 모두 mid 시간 내에 입국심사를 받을 수 있는지 확인하기 위해서는, 각 입국심사대에서 mid 시간에 몇명의 심.. 2022. 9. 3.
[프로그래머스 lv3] 베스트앨범 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 해시를 이용하여 장르별 정보를 처리하는 문제이다. 1) map nplay: 장르별 재생 횟수를 저장한다. 2) map minfo: 장르별로 곡의 (재생수, 번호) 배열을 저장한다. 3) minfo[장르]을 내림차순으로 정렬한다. 이때, 같은 재생 수를 가진 곡에 대해서는 곡 번호가 작은 녀석이 앞에 오도록 정렬한다. 4) nplay를 배열(vnplay)로 만들고 재생수 기준 내림차순으로 정렬한다. 이후, vnplay에 저장된 순으로 장르를 순회하면서 minfo[장르]의 가장 앞쪽 두 곡 번호를 벡터에 저장한다. 곡 번호가 기록된 벡터를 리턴하면 정답이다. 코드 #include #include #include #include #include #inclu.. 2022. 9. 2.
[프로그래머스 lv3] 불량 사용자 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 banned_id 의 각 패턴에 일치하는 user_id 를 고르는 경우의 수를 구하는 문제이다. 백트래킹 기법으로 banned_id[0], banned_id[1] .... banned_id[k-1] 에 일치하는 user_id[i]를 선택해 나가면 된다. banned_id[k] 에 해당하는 user_id[i]를 선택할 때는, 1) user_id[i]가 banned_id[0] ~ banned_id[k-1] 를 고르는 과정에서 선택되지 않았어야 하고 2) user_id[i] 가 banned_id[k] 패턴과 일치해야 한다. 조건을 만족하는 user_id[i]를 선택한 후 k개의 선택된 user_id를 기록해놓는다. 문제에서 아이디 목록의 내용이 동일한 경우.. 2022. 9. 2.
[프로그래머스 lv3] 표 편집 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해당 문제는 2021 카카오 채용연계형 인턴십 문제로 공식 해설이 있습니다. 2021 카카오 인턴십 for Tech developers 코딩 테스트 해설 해설 표를 구성하고, 이동(U, D), 삭제(C), 복구(Z) 명령어를 구현하는 문제이다. 이 문제의 핵심은 표를 구성할 자료구조를 선택하는 것이다. 가장 먼저 생각했던 자료구조는 set이었다. U X, D X 명령어에서 X의 총합이 1000000 이하이고, set에서는 원소의 삭제가 log(n)에 가능하므로 총 시간복잡도는 최대 t = 1000000 + cmd.size()*log(n) 이 된다. cmd와 n의 최대 범위를 고려했을 때 1초 내에 연산 가능하므로 통과할 것이라 생각했는데 이런! 효율성 통과.. 2022. 9. 1.
[프로그래머스 lv3] [1차] 셔틀버스 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 콘이 셔틀을 타기 위해 나갈 수 있는 가장 늦은 시간을 구하는 문제이다. 일단, 모든 크루들의 대기 시간을 정렬하고, 각 시간대별 셔틀에 한명씩 태운다. 이 때, 콘은 가장 마지막 버스에 타야 한다. 따라서, 마지막 셔틀까지 크루들을 태웠을 때, 버스의 정원이 남는다면 가장 늦게 나가도 마지막 버스를 탈 수 있으므로 정답은 마지막 버스의 도착 시간이 된다. 반면, 정원이 다 찬 경우, 콘은 마지막으로 탄 사람보다 1분 먼저 나와야 버스에 탈 수 있으므로 정답은 마지막에 탄사람의 대기시간-1분이 된다. 팁 문자열이 특정 포맷으로 이루어져있을 때 sscanf() 함수를 사용하면 값을 쉽게 추출할 수 있다. 특정 포맷으로 문자열을 만들어야 할 때 sprin.. 2022. 8. 31.
[프로그래머스 lv3] 추석 트래픽 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 요청 종료 시간과 수행시간이 여러 개 주어질 때, 1초당 최대 처리량을 구하는 문제이다. 1) 문자열을 순회하면서 파싱하고, 요청 시작시간과 요청 종료시간을 구해 각각을 다른 벡터에 넣어준다. 문자열을 파싱할 때는 sscanf 함수를 사용하면 포맷에 따른 정보를 바로 가져올 수 있다. hh, mm, ss, sss, t1(T의 소수점 앞부분), t2(T의 소수점 뒷부분)을 파싱 하고, 종료 시간을 정수형 시간으로 바꾼 뒤 시작 시간을 구해보자. T의 소수점 앞부분 t1에 대하여, 시작시간을 만들려면 종료시간에서 t1*1000-t1을 빼주어야 한다. t1*1000이 아닌 t1*1000-t1인 이유는, 처리시간에 시작과 끝을 포함한다고 주어졌기 때문이다. .. 2022. 8. 31.