본문 바로가기

알고리즘 & 코딩테스트

(48)
Programmers Lv. 1 "삼총사" 으음~ 각 학생한테 매겨진 숫자가 있고 주어진 number중 3명을 골라 그 합이 0이 되는 경우의 수를 반환하는 문제이다. 즉, 주어진 배열 number에서 3개씩 그룹을 지은다음 이들의 총합이 0인 경우를 세면되는데 그룹을 지을때 조합(=combinations)를 사용하면 된다! from itertools import combinations def solution(number): answer = 0 tmp = list(combinations(number, 3)) for item in tmp: if sum(item)==0: answer += 1 return answer
Programmers Lv.1 "예산" 문제가 굉장히 길지만 사실 가만히 살펴보면 각 팀별 신청한 예산목록 리스트인 d와 주어진 예산인 budget을 두고 budget의 범위안에서 얼마나 많은 팀의 신청 예산 누적합이 포함될 수 있는지 따져보면 된다. 필자는 계산을 순차적으로 편하게 하기위해 정렬시키고, 순차적으로 누적합을 구하면서 budget보다 커질 경우 반복을 끝내면 된다. def solution(d, budget): answer = 0 tmp = 0 d.sort() for target in d: tmp += target if budget < tmp: break answer += 1 return answer
소수와 소인수 분해 (Prime Number, Prime Factorization) 소수 (Prime Number)는 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수를 의미한다. 예를 들어, 5는 1x5 혹은 5x1로, 수를 곱한 결과를 적는 유일한 방법이 그 수 자신을 포함하기 때문에 소수에 해당한다. 반대개념으로 합성수(Composite Number)가 있는데 여기서는 소수에 집중해보자. 정수론의 기본 정리에 의해, 모든 자연수는 꼭 한가지 방법으로 "소수의 곱"으로 표현할 수 있고 이를 소인수 분해의 일의성이라고 한다. 즉, 곱셉의 관점에서 소수는 자연수를 이루는 성분이라 할 수 있다. 아래 예시를 보자. $$23244 = 2^2 \times 3 \times 13 \times 149$$ `23244`는 약수의 순서를 무시하면 단 1개의 방법으로 소인수 분해가 된다. 현재..
Programmers Lv.1 "이상한 문자 만들기" 주어진 문자열을 공백 기준으로 각각의 원소로 생각하고, 각 원소들에 대하여 index의 홀짝 여부를 판단하여 요소들을 알맞게 리턴해주면 된다. 음.. 뭔가 말이 이상한것 같은데 코드를 보면 바로 이해할 수 있을 것이다. 반환할 때 요구하는 형태와 맞는지 꼭 체크하자! def solution(s): answer = "" target = s.split(" ") for elem in target: for idx, char in enumerate(elem): if idx%2==0: answer += char.upper() else: answer += char.lower() answer += " " return answer[:-1]
Programmers Lv. 1 "3진법 뒤집기" 가끔 나오는 '진법 변환'과 문자열 뒤집기가 응용된 문제이다. 문자열 뒤집기는 말 그대로 주어진 문자열을 역순으로 뒤집으면 되서 큰 문제가 되지 않는다. 우리가 눈여겨봐야할 것은 진법 변환에 대한 내용이다. 요것도 자세한 내용은 알고리즘 카테고리의 "진법변환"에서 다룰예정이니 참고해보라. 파이썬에는 아쉽게도 10진수 숫자를 2, 8, 16진수로 표현하는 것 이외의 진법으로 표현하는것엔 달리 방법이 없다. 즉, 직접 구현해야 한다는 말이므로 원리 그대로 진행하자. import string def solution(n): def convert(num, base): tmp = string.digits + string.ascii_lowercase q, r = divmod(num, base) if q==0: ret..