diff --git a/number-of-1-bits/acious.kt b/number-of-1-bits/acious.kt new file mode 100644 index 0000000000..b572201603 --- /dev/null +++ b/number-of-1-bits/acious.kt @@ -0,0 +1,19 @@ +class Solution { + fun hammingWeight(n: Int): Int { + // 2^31 = 1,073,741,823 + // 몫 : dividend + // 한텀당 n을 2로 나눠서 몫과 나머지를 구해냄. 나머지가 1이면 result에 +=1, 나머지가 0이면 result에 변화없음. + // 몫이 0으로 떨어지면 연산이 끝나고 result 반환 + // 시간 복잡도 : n이 최대 2^31이고 n이 커짐에 따라 최대 31번 반복문이 도므로 O(1) + // 공간복잡도 : O(1) + var dividend = n + var result = 0 + while (dividend != 0) { + if (dividend % 2 == 1) { + result+=1 + } + dividend = dividend/2 + } + return result + } +} diff --git a/valid-palindrome/acious.kt b/valid-palindrome/acious.kt new file mode 100644 index 0000000000..c628a1705e --- /dev/null +++ b/valid-palindrome/acious.kt @@ -0,0 +1,43 @@ +class Solution { + fun isPalindrome(s: String): Boolean { + // 문장의 길이는 최대 20만 + // 문자열이 공백이면 return true + // for-loop 한턴에 양쪽 끝에서부터 시작. 양쪽 index가 서로 교차되면 return true + // 각각 char이 alphanumeric이 아니면 한칸 더이동. + // 영문 대문자면 영문 소문자로 치환. + // - 양쪽 끝의 char를 비교해서 같으면 양쪽 index를 이동시킴. + // - 양쪽 끝의 char를 비교해서 같지않으면 return false + // 시간복잡도 : O(n/2) + // 공간복잡도 : O(1) + if (s.isEmpty()) { + return true + } + + var left = 0 + var right = s.length - 1 + + while (left <= right) { // 서로 교차하기 전까지만 비교하면 됨 (<= 대신 < 사용 가능) + + // 1. Char가 영문자나 숫자가 아닌지 확인 + if (!s[left].isLetterOrDigit()) { + left += 1 + continue + } + + if (!s[right].isLetterOrDigit()) { + right -= 1 + continue + } + + // 2. 대소문자 통일 후 비교 + if (s[left].lowercaseChar() != s[right].lowercaseChar()) { + return false + } else { + left += 1 + right -= 1 + } + } + + return true + } +}