본문 바로가기

알고리즘 & 코딩테스트/코딩테스트

(45)
Programmers Lv.1 "크기가 작은 부분문자열" 주어진 문자열 t에서 p의 길이만큼 앞에서 부터 순차적으로 잘라 하나의 리스트에 다 담는다. 그 뒤 각 요소에 대해 크기를 비교하여 정답을 추출해주면 된다~! def solution(t, p): answer, temp= 0, [] for idx in range(0, len(t)-len(p)+1): temp.append(t[idx:idx+len(p)]) for target in temp: if int(target)
Programmers Lv.1 "최소직사각형" 문제를 잘 읽어보면 주어진 가로길이의 최댓값, 세로길이의 최댓값을 선택하는 단순한 문제가 아님을 알 수 있다. 즉, 각 명함의 크기가 가로, 세로의 전환도 고려해야한다는 것. 가장 심플한 해결방법은 주어진 sizes를 반복을 하되 큰값을 가로와 세로 중 어디로 할 것인지 임의로 정한뒤 순차적으로 비교하여 최대의 수치를 저장해주면 된다. 아래 코드를 보면 이해가 될 것이다. def solution(sizes): w = 0 h = 0 for element in sizes: if element[0] > element[1]: element[0], element[1] = element[1], element[0] if element[0]>w: w = element[0] if element[1]>h: h = elem..
Programmers Lv.1 "시저 암호" 시저암호를 만드는 알고리즘은 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 말하는데 알파벳의 순서를 일정거리만큼 밀어서 대응시키는것이 중점이다. 다만, 맨 마지막 알파벳은 맨 처음 알파벳과 이어지는것을 유의해서 구하면 되는데, 필자는 아스키 코드값을 기억하고 있기에 (A가 65, a가 97이다.) 이 테이블을 이용하여 알고리즘을 구현했다. def solution(s, n): answer = '' for i in list(s): if i != " ": if i.isupper() : answer += chr(ord(i)+n) if ord(i)+n < 91 else chr(ord(i)-26+n) elif i.islower() : answer += chr(ord(i)+n) if ord..
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