알고리즘 64

프로그래머스 - 체육복 (Greedy)

🔸 문제 접근 방식 체육복 여벌은 자신 기준 앞, 뒤로만 빌려줄 수 있다는 건 유의 체육복 여벌이 있는데 도난 당한 경우를 먼저 고려할 것. 예외 처리 발생 💧 Source code def solution(n, lost, reserve): ''' 프로그래머스-체육복 문제 풀이 (Greedy) Notes: 1. 체육복 여벌은 자신 기준 앞, 뒤로만 빌려줄 수 있다는 것 주의 2. 체육복 여벌이 있는데 도난 당한 경우를 먼저 고려할 것. 예외 처리 발생 Args: n (int) : 학생 수 lost (list) : 체육복을 잃어버린 학생 번호를 담은 리스트 reserve (list) : 체육복 여벌을 가져온 학생 번호를 담은 리스트 Returns: answer (int) : 체육 수업에..

알고리즘 2021.06.20

프로그래머스 - H-index

🔸 문제 접근 방식 다음 방식으로 문제를 접근하였다. 논문이 인용될 최대값을 H-index로 설정한 뒤 1씩 감소시켜가며 H-index 조건을 확인한다. 인용될 최대값은 len(citations) H-index는 두 조건을 만족한다. H-index 회 이상 인용된 논문의 수가 H-index 이상이다. H-index 회 이하 인용된 논문의 수가 H-index 이하이다. H-index 의 최대값을 선택한다. 📌 문제 풀이 정렬 문제이기는 하나, H-index가 될 target값을 기준으로 citations을 분리했다. target값보다 크거나 같은 논문은 bigList에 추가 target값보다 작거나 같은 논문은 smallList에 추가 그리고 2 조건을 만족하면 H-index 그룹인 resultList에 ..

알고리즘 2021.06.17

프로그래머스 - 가장 큰 수 (정렬)

🔸 문제 해결 방향 문자열 처리를 통해 풀어야한다. 문자열 비교가 어떻기 이루어지는지 숙지할 것 문자열 곱셈을 수행한 뒤 비교한 이유는? 문자열 비교 → 숫자 변환 → 문자열 변환 후 반환 숫자로 바꾸어 주지 않을 시 발생하는 문제는? 문제 접근 리스트 정렬 기능 이용하기 처음 시도는 리스트 정렬 기능을 이용했다. 정렬 시 기준이 되는 key 값을 문자열의 첫 번째 값으로 설정했다. 첫째자리수가 가장 클 경우 앞 쪽에 배치된다. ❌ 첫째 자리 수가 같은 경우 발생 5와 50은 어떻게 비교할까? → 정렬 시 2번째 기준을 문자열 길이로 설정한다. 둘째 자리 수가 같을 경우 문자열 길이가 짧은 쪽이 앞에 배치된다. ❌ 그럼 5, 56, 3의 경우는 어떨까? → 정렬 시 2번째 기준 56, 5, 3이 되어야 ..

알고리즘 2021.06.16

그리디 문제풀이 - 볼링공 선택하기

🔸 볼링공 고르기 A,B 두 사람이 볼링공을 고를 수 있는 조합의 수를 구하는 문제이다. 볼링공 수는 N으로 최대 1,000 볼링공 무게는 M으로 최대 10 서로 같은 무게의 볼링공은 고를 수 없음 같은 무게의 공이 여러 개 존재할 수 있지만, 다른 공으로 간주 📌 예시 5 3 1 3 2 3 2 → 8가지 8 5 1 5 4 3 2 4 5 2 → 25가지 📌 초기 접근 방법 A가 첫 번째 공을 골랐다고 가정한다. 1을 골랐으므로, 나머지 공 중 1이 아닌 것의 개수를 구한다. 그 뒤 3을 골랐을 경우, 나머지 공 중 3이 아닌 것의 개수를 구한다. ... 위의 방식으로 첫 번째 공, 두 번째 공, 세 번째 공을 골랐을 때마다 뒤의 공 중 무게가 다른 공의 개수를 합해가며 최종 답을 구하였다. 📌 교재 접근..

알고리즘 2021.06.13

그리디 문제 풀이 - 만들 수 없는 금액

🔸 만들 수 없는 금액 동전 n개가 주어졌을 때, 해당 동전들로 만들 수 없는 금액을 구하여라. 동전은 최대 1000개, 각 동전의 크기는 최대 1,000,000원이다. ex) 1,2,3, 7원 동전이 주어졌을 때, 1원 : 1 2원 : 1 3원 : 3 4원 : 1+3 5원 : 2+3 6원 : 1+2+3 7원 : 7 8원 : 1+7 9원 : 2+7 10원 : 3+7 11원 : 1+3+7 12원 : 2+3+7 13원 : 1+2+3+7 14원 : X 📌 초기 접근 방법 처음에 생각한 접근 방식은 어려웠다. 동전의 모든 조합을 구한다. 조합 별 최종 합을 구한다. 최종 합을 set에 담는다. 여기서 문제는 모든 조합을 구할 때 너무 많은 비용이 든다. Combination 연산 시에는 팩토리얼 단위로 연산하기..

알고리즘 2021.06.12

그리디 알고리즘 개념 총 정리

🔸그리디 알고리즘 Greedy는 탐욕스럽다는 뜻으로 매 순간 최선의 선택을 수행함으로써 문제를 해결하는 방식입니다. 따라서 몇몇 예외를 제외하면 문제 유형이나 테크닉한 기술 없이도 풀 수 있는 문제입니다. 하지만, 문제를 접했을 때 해결할 수 있는 최소한의 아이디어는 떠올릴 수 있어야 해결이 가능하므로 문제풀이를 통해 감을 익힐 필요가 있는 유형이라고 볼 수 있습니다. 단, 다익스트라 알고리즘, 정렬 알고리즘과 함께 출제되는 경우 미리 숙지가 필요한 경우도 있습니다. 📌 정리 그리디 알고리즘을 해결하기 위해서는 다음 능력을 키울 필요가 있습니다. 매 번 최선의 선택만 수행해도 문제를 해결할 수 있는지를 파악해야 합니다. 문제를 해결하기 위한 최소한의 아이디어를 떠올릴 수 있어야 합니다. 명확한 문제 유형..

알고리즘 2021.06.01

코딩테스트 문제 풀이 전, 시/공간 복잡도 이해하기

🔸복잡도 코딩테스트를 준비하기 전, 시간 복잡도와 공간복잡도 이해하기 대부분의 코딩테스트 문제에는 제한 시간과 메모리가 존재합니다. 이를 바탕으로 적절한 시/공간 복잡도를 계산한 뒤 적절한 알고리즘을 사용할 필요성이 있습니다. 따라서 시간 복잡도와 공간복잡도에 대해 이번 기회에 정리하려고 합니다. 🔸시간복잡도 '제한시간'안에 알고리즘 문제를 해결하기 위해서는 시간복잡도를 이해해야 합니다. 일반적으로 O(N)과 같은 빅오 표기법을 기준으로 연산 횟수를 계산합니다. for 문으로 문제를 해결할 시 시간복잡도는 다음과 같습니다. 단일 for문: $O(N)$ 이중 for문: $O(N^2)$ 삼중 for문: $O(N^3)$ N값이 어떻게 주어지냐에 따라 시간복잡도를 계산해보겠습니다. N=500 N=500일 경우 ..

알고리즘 2021.05.31

백준 9012 괄호 문제풀이

📌문제설명 📌문제접근방식 핵심은 Valid한 PS임을 검증하는 것이다. 그래야 VPS와 VPS를 결합해도 VPS가 나오기 때문이다. 문자열 중 '(' 와 ')'를 스택을 이용해 검증했다. (가 나오면 스택에 넣고, )를 만나면 (를 꺼냈다. 단, 다음과 같은 경우 NO를 출력한다. 1. 스택에 (가 없는데 )를 만났다. 2. 검증이 끝난 후 스택에 (가 남아있다. 위 과정이 끝난 후 문제가 없으면 YES를 출력한다. 즉, '(' 와 ')' 의 개수가 같아야 하며 '('가 오기 전에 ')'가 오면 안된다. 📌문제풀이 import sys n = int(sys.stdin.readline().rstrip()) exlist = [sys.stdin.readline().rstrip() for x in range(n)..

알고리즘 2021.03.25

백준 11650 좌표정렬 문제풀이

📌문제설명 📌문제접근방식 정렬 문제였고, 기존에 풀었던 문제들처럼 기준을 2개로 설정하면 되는 문제였다. x 좌표 비교 후 같다면 y 좌표를 정렬했다. 📌문제풀이 소스코드 import sys n = int(input()) locations = [list(map(int,sys.stdin.readline().rstrip().split())) for x in range(n)] locations.sort(key = lambda location : (location[0], location[1])) for x in locations: print(x[0], x[1])

알고리즘 2021.03.24