diff --git a/longest-repeating-character-replacement/Seoya0512.py b/longest-repeating-character-replacement/Seoya0512.py new file mode 100644 index 0000000000..ffd2be9541 --- /dev/null +++ b/longest-repeating-character-replacement/Seoya0512.py @@ -0,0 +1,29 @@ + +''' +2개의 포인터를 활용해 슬라이딩 윈도우 방식으로 문제를 해결 +(접근법은 알고 있었지만 구현이 어려워 알고달레 참고) + +참고 +end-start+1-max(counter.values())는 윈도우를 전부 같은 문자로 만들기 위해 바꿔야 하는 최소 문자 수 +즉, 그 값이 K개 이상 필요하면 유효하지 않은 것으로 판단함 + + +Time Complexity: O(n) +- 문자열의 모든 문자를 한 번씩 방문 +Space Complexity: O(1) +- +''' +class Solution: + def characterReplacement(self, s: str, k: int) -> int: + max_len = 0 + counter = {} + start = 0 + + for end in range(len(s)): + counter[s[end]] = counter.get(s[end], 0) + 1 + while end - start + 1 - max(counter.values()) > k: + counter[s[start]] -= 1 + start +=1 + max_len = max(end-start+1, max_len) + + return max_len diff --git a/palindromic-substrings/Seoya0512.py b/palindromic-substrings/Seoya0512.py new file mode 100644 index 0000000000..6a6600057b --- /dev/null +++ b/palindromic-substrings/Seoya0512.py @@ -0,0 +1,53 @@ +''' +방식 : Brute-Force +문자에 two-pointer를 지정해서 모든 경우의 수를 확인하고 +palindrome의 수를 반환 + +Time Complexity : O(N^3) +- outer loop(For문) : O(N) +- inner loop(While문) : O(N) +- palindrome 확인을 위해 s[start:end] 슬라이싱 및 역순 확인 : O(N) + +Space Complexity: O(N) +- substring을 임시 저장하는데 드는 공간 비용 +''' + +class Solution: + def countSubstrings(self, s: str) -> int: + cnt = 0 + n = len(s) + + for start in range(n): + end = n + while start < end: + sub = s[start:end] + if sub == sub[::-1]: + cnt += 1 + end -= 1 + + return cnt + +''' +위 풀이로 해결했지만, 시간복잡도가 많이 드는 것을 파악 후 +알고달레 풀이 3: Two Pointers 이해하고 작성한 코드 + +while 문을 2회로 나눈 이유는 aa, baab 형식의 짝수 palindrome을 파악하기 위함 +짝수 palindrome의 경우 양 옆의 값이 동일해야 그 값을 기준으로 좌우 값을 비교해서 판단할 수 있음 +''' +def countSubstrings(s: str) -> int: + cnt = 0 + + for i in range(0, len(s)): + start, end = i,i + while start >= 0 and end < len(s) and s[start] == s[end]: + cnt += 1 + start -=1 + end +=1 + + start, end = i, i+1 + while start >= 0 and end < len(s) and s[start] == s[end]: + cnt += 1 + start -=1 + end +=1 + + return cnt diff --git a/reverse-bits/Seoya0512.py b/reverse-bits/Seoya0512.py new file mode 100644 index 0000000000..4859e778df --- /dev/null +++ b/reverse-bits/Seoya0512.py @@ -0,0 +1,10 @@ +''' +파이썬 내장 함수 사용 +- format 함수로 정수 n을 32비트 이진수로 변환한 뒤, 역수로 뒤집어 다시 정수로 변환 + +Time Complexity: O(1) +Space Complexity: O(1) +''' +class Solution: + def reverseBits(self, n: int) -> int: + return int(format(n,'032b')[::-1], 2)