본문 바로가기

Algorithm/프로그래머스(Programmers)50

[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - 소수 찾기 📍 프로그래머스 2단계 - 소수 찾기 문제 보기 카테고리가 완전 탐색으로 나와있지만, 재귀 중에서도 중복을 허용하지 않는 순열을 이용해서 풀었다.(부분집합, 순열, 조합을 구하는 방법은 다음 글을 참고해주세요.) 로직을 작성하기 이전에 최대 numbers의 길이가 7이면 순열을 구하는 최악의 경우의 수는 9999999!라고 생각해서 시간 초과가 나는 거 아니야..?라는 생각을 했는데, 0부터 9999999를 탐색하는 게 아니라 numbers의 length를 돌며 순열을 구하는 로직이기 때문에 9999999!가 아니라 7!인것을 깨달았다. 문제를 풀며 주의할 점은, 11과 011은 같은 숫자로 취급합니다.라는 조건을 미루어 보아 중복된 값은 제거해야 하는데, 처음에 check배열(const check = .. 2022. 4. 4.
[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - H-Index 📍 프로그래머스 2단계 - H-Index 문제 보기 정렬을 사용하여 푸는 문제인데, H-Index라는 정의를 처음에 잘 이해하지 못했다. 여기저기 찾아보다 H-지수가 무엇인지 알려주는 기사를 봤고, 해당 기사를 통해 구현해보니까 정답 판정을 맞았다. (기사 보러 가기) 기사에 작성된 핵심 내용을 토대로 만약, citations = [8, 4, 5, 10, 3]이라고 가정한 후 로직을 작성하면 다음과 같다. 전체 논문 중 많이 인용된 순으로 정렬(내림차순 정렬) 인용 수(citation[i])와 논문 개수(idx)를 하나씩 비교해나가면서 인용수가 논문수와 같아지거나, 인용수가 논문수보다 작아지기 시작하는 숫자(논문 개수)가 h가 된다. 결론적으로, 인용 횟수 3번이 넘는 논문의 수가 적어도 4편이 된다는.. 2022. 3. 31.
[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - 위장 📍 프로그래머스 2단계 - 위장 문제 보기 이 문제에서의 핵심은 서로 다른 옷의 조합수를 return 하는 것인데, 처음에 부분집합을 사용하여 모든 옷을 입지 않는 경우의 수를 제외하고 로직을 구현하려 했으나 동일 key값에 있는 value는 동시에 입을 수 없기 때문에 부분집합을 사용하지 못했다. 결론적으로 하나의 공식을 이용해서 풀어야 하는데 공식은 다음과 같다. key값마다 의상을 입을 수 있는 경우의 수에서 1을 더해준다. 1을 더해주는 이유는 해당 의상을 입지 않을 수도 있기 때문이다. 모든 key값에 동일하게 공식을 적용하고 마지막에 1을 빼주는데, 그 이유는 스파이는 하루에 최소 한 개의 의상은 입습니다.라는 조건을 통해 모든 옷을 벗지 않는다는 점을 유추할 수 있기 때문이다. 이를 식으로 .. 2022. 3. 29.
[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - 구명보트 📍 프로그래머스 2단계 - 구명보트 문제 보기 무게 제한이 있는 구명보트를 최대한 적게 사용하여 사람을 태우는 문제인데, 처음에 people을 sort하는 것 까진 생각 했으나, 이후 로직(무게가 적은 순을 먼저 태워야 할지 높은 순을 먼저 태워야 할지?)은 해결하지 못했다. 해결법을 찾아보니 무게가 제일 많은 사람과 무게가 제일 적은 사람을 구명보트에 태우는 방법이 있었다. (왜 이런 생각을 못했을까 😄) 구체적인 로직은 다음과 같다. people을 내림차순으로 정렬한다. 무게가 제일 많이 나가는 사람과 무게가 제일 적게 나가는 사람의 합이 limit보다 작다면 둘 다 구명보트에 태운다. 무게가 제일 많이 나가는 사람과 무게가 제일 적게 나가는 사람의 합이 limit보다 크다면 무게가 제일 많이 나가는.. 2022. 3. 28.
[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - 큰 수 만들기 📍 프로그래머스 2단계 - 큰 수 만들기 그리디를 활용하는 문제인데, 너무 어렵게 생각했다. 결론적으로 k가 남아있는지 없는지에 여부에 따라 로직을 분리했다. 2번 순서까지만 작성하면 12번 테스트 케이스가 실패로 뜨는데, k 값이 남아있기 때문에 처리하는 로직을 작성해야 한다. (3번 참고) 반복문으로 number을 탐색한다. answer의 마지막 값이 num보다 작으면 가장 큰 수를 만들기 위해 num을 push하기 위해 answer의 마지막 값을 pop해준다. 이때, 1개의 수를 제거했으므로 k를 1씩 빼준다. 반복문을 모두 돌고 난 이후에도 k가 남아있다면 k개 수만큼 제거해야하기 때문에 k번 만큼 pop을 해준다. 하단에는 입출력 3번째 예시의 number = 4177252841, k = 4의 .. 2022. 3. 25.