본문 바로가기

Algorithm17

[Programmers] 133499.ts 옹알이 (2) 아래와 같이 해결. function solution(babbling: string[]): number { let answer: number = 0; for (let str of babbling) { if (str.match(/aya(aya)+|ye(ye)+|ma(ma)+|woo(woo)+/g)) continue; if (!str.replace(/aya|ye|woo|ma/g, "")) answer++; } return answer; } 어렵지 않게 푼 문제이나 다른 사람의 풀이에서 아래와 같은 정규표현식 사용을 확인해서 포스트를 남긴다. function solution(babbling) { const regexp1 = /(aya|ye|woo|ma)\1+/; const regexp2 = /^(aya|ye|w.. 2023. 7. 14.
[Programmers] 120911.ts 문자열 정렬하기 (2) 문제는 간단하게 해결 function solution(my_string: string): string { return my_string.toLowerCase().split('').sort().join(''); } 다른 사람의 풀이에서 string을 array로 변환할 때 split(' ') 대신 전개구문 [... ] 을 사용한 방식을 발견했다. 테스트해보니 split(' ')을 사용한 방식보다 전개구문을 사용한 방식이 더 빨랐다. function solution(my_string: string): string { return [...my_string.toLowerCase()].sort().join(''); } 2023. 7. 14.
[Programmers] 131128.py 숫자 짝꿍 문제 그대로 풀었으나 시간 초과로 실패! def solution(X, Y): arr_z = [] arr_x = sorted(list(X), reverse=True) arr_y = list(Y) for num in arr_x: if num in arr_y: arr_z.append(num) arr_y.remove(num) return str(int(''.join(arr_z))) if len(arr_z) else "-1" arr_x를 정렬하는 대신 필터링이 끝난 arr_z를 정렬해서 약 50%로 시간이 감소되었으나 여전히 시간 초과 실패했다. 위 코드와 거의 비슷해서 코드 첨부는 생략. dictionary 형식으로 구조를 만들면 반복 횟수를 10회로 고정해서 풀 수 있겠다 생각해서 아래와 같이 해결. def .. 2023. 7. 11.
[Programmers] 12973.py 짝지어 제거하기 먼저 문제 그대로 풀었으나 역시나 시간초과로 실패. 사실 문제 그대로 풀기는 테스트를 통과해야겠다는 마음보다 어떤 식으로 접근하면 풀리겠구나, 하는 찔러보기 느낌. def solution(s): index = 1 arr = list(s) while True: if index >= len(arr): break if arr[index-1] == arr[index]: arr.pop(index) arr.pop(index-1) index = 1 if index - 1 0 and c == arr[-1]: arr.pop() else: arr.append(c) if arr: return 0 else: return 1 그렇게 위 코드로 해결. 그동안의 경험으로 연산 횟수를 줄이려면 method 사용을 줄이는 편이 좋다... 2023. 7. 6.
[Programmers] 136798.py 기사단원의 무기 먼저 문제 그대로 구현하여 풀었으나 시간 초과로 실패 def solution(number, limit, power): answer = 0 for knight_num in range(1, number+1): knight_attack = 0 for n in range(1, knight_num + 1): if knight_num % n == 0: knight_attack += 1 if knight_attack > limit: answer += power else: answer += knight_attack return answer 1과 n을 제외한 약수의 최대값은 항상 n/2 이하인 조건을 고려하여 약수의 갯수를 구하는 반복횟수를 1/2로 감소시켰으나 다시 시간초과로 실패. 다른 사람의 조언글에서 제곱근까지만.. 2023. 7. 3.
[Programmers] 12985.py 예상 대진표 게임에서 승리할 경우 대진번호는 (a + 1) // 2의 값으로 변경되며 a와 b가 만나는 승리했을 경우의 대진번호가 같다. 이를 그대로 코드로 정리하면 아래와 같이 작성할 수 있다. def solution(n,a,b): answer = 0 while a != b: a = (a + 1) // 2 b = (b + 1) // 2 answer += 1 return answer 2023. 7. 2.
[Programmers] 42747.py H-Index ※ 문제 오류 "나머지 논문이 h회 이하로 인용되어야 한다."라는 조건이 실제 풀이에서는 고려되지 않았다. "h회 이상 인용된 논문이 h개 이상"이라는 전제만 생각해야 풀 수 있다. def solution(citations): answer = 0 citations.sort(reverse=True) for index in range(len(citations)): if citations[index] >= index + 1: answer = index + 1 return answer 내림 차순으로 배열을 정렬하여 인용 횟수는 citations[index]로, 횟수 이하로 인용된 논문의 갯수는 정렬된 배열의 index(+1)로 구해 풀이했다. 다른 사람의 풀이 def solution(citations): cit.. 2023. 6. 30.
[Programmers] 181834.py l로 만들기 처음에는 문제 그대로 풀고자 하였으나 제한 사항 1 ≤ myString ≤ 100,000 을 확인하고 반복문으로 myString을 전부 도는 것 보다 a~k까지만 도는 것이 더 효율적이라 판단하여 아래와 같이 해결. def solution(myString): for c in "abcdefghijk": myString = myString.replace(c, "l") return myString 이후 아래와 같이 myString의 char를 모두 탐색하는 방식으로 작성하여 테스트해보니 위의 방식이 더 빠름을 확인할 수 있었다. def solution(myString): return ''.join([ c if c > 'l' else 'l' for c in myString]) 주어진 myString에 따라 후자.. 2023. 6. 23.