From 4b8ee7950f18ee57c8c579a9cd7e95dc75cb4860 Mon Sep 17 00:00:00 2001 From: Sumin Date: Mon, 21 Aug 2023 11:10:17 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Create=20=EC=A0=84=ED=99=94=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=AA=A9=EB=A1=9D=20sumin.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sumin.py" | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 "Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/\354\240\204\355\231\224\353\262\210\355\230\270 \353\252\251\353\241\235/sumin.py" diff --git "a/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/\354\240\204\355\231\224\353\262\210\355\230\270 \353\252\251\353\241\235/sumin.py" "b/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/\354\240\204\355\231\224\353\262\210\355\230\270 \353\252\251\353\241\235/sumin.py" new file mode 100644 index 00000000..60c07d89 --- /dev/null +++ "b/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/\354\240\204\355\231\224\353\262\210\355\230\270 \353\252\251\353\241\235/sumin.py" @@ -0,0 +1,58 @@ +""" +풀이시간: 10분 + + +- phone_book의 길이: 1 이상 1,000,000 이하 +- 각 전화번호의 길이: 1 이상 20 이하 +- 같은 전화번호가 중복해서 들어있지 않다. + + +1) 정렬 후 현재 확인하고 있는 번호가 다음 번호의 접두어인지 확인하는 방법 +2) 해시를 이용해 특정 전화번호의 접두어가 다른 번호인지 확인하는 방법 + +<시간 복잡도> +1) O(nlogn) +2) O(nm): n은 전화번호의 총 개수, m은 최대 + +<기타> +이 외에 트라이로도 풀이 가능 +""" + +from typing import List + +# 정렬로 풀기 +def solution(phone_book: List) -> bool: + # 전화번호를 사전순으로 정렬 + phone_book.sort() + + for i in range(len(phone_book) - 1): + # 다음 번호 비교 -> 접두어인지 확인 + if phone_book[i+1].startswith(phone_book[i]): # 접두어인 경우 + return False + return True + + +# 해시로 풀기 +def solution(phone_book: List) -> bool: + phone_hash = {} # 전화번호 접두사를 저장할 해시 + + # 각 전화번호의 접두사를 해시에 저장 + for number in phone_book: + phone_hash[number] = True + + for number in phone_book: + for i in range(1, len(number)): + prefix = number[:i] + if prefix in phone_hash: # 접두어인 경우 + return False + return True + + +# 테스트 케이스 +test_case1 = ["119", "97674223", "1195524421"] # 출력: False +test_case2 = ["123","456","789"] # 출력: True +test_case3 = ["12","123","1235","567","88"] # 출력: False +test_case4 = ["456", "467"] # 출력: True +test_case5 = ["1195524421", "97674223", "119"] # 출력: False + +print(solution(phone_book=test_case5)) \ No newline at end of file From 4c67757d0d3038f99347a65b3bcadcacf9ce5120 Mon Sep 17 00:00:00 2001 From: Sumin Date: Mon, 21 Aug 2023 12:59:11 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Create=20k=EC=A7=84=EC=88=98=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=86=8C=EC=88=98=20=EA=B0=9C=EC=88=98=20=EA=B5=AC?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20sumin.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sumin.py" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 "Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" diff --git "a/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" "b/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" new file mode 100644 index 00000000..230f8309 --- /dev/null +++ "b/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" @@ -0,0 +1,47 @@ +""" +풀이시간: 20분 + + +- 1 ≤ n ≤ 1,000,000 +- 3 ≤ k ≤ 10 + + +1) n을 k진수로 변환 +2) 소수 판별 + +<시간복잡도> +O(log_k*n * √n) +""" +# n을 k진수로 변환하는 함수 +def convert_to_base(n: int, base: int) -> str: + result = '' # k진수로 변환 후 값 + while n: + n, remainder = divmod(n, base) + result += str(remainder) + return result[::-1] + +# 소수 판별(에라토스테네스의 체) +def is_prime(number: int) -> bool: + if number <= 1: + return False + i = 2 + while i * i <= number: + if number % i == 0: + return False + i += 1 + return True + + +def solution(n: int, k: int) -> int: + converted_num = convert_to_base(n, k) # n을 k진수로 변환 + cnt = 0 # 조건에 맞는 소수의 개수 + for segment in converted_num.split('0'): + if not segment: # 빈 문자열 + continue + if is_prime(int(segment)): # 소수 + cnt += 1 + return cnt + +# 테스트 케이스 +n1, k1 = 437674, 3 +print(solution(n1, k1)) \ No newline at end of file From 03e28004594c78a8be1ec3f1cb81280124952917 Mon Sep 17 00:00:00 2001 From: Sumin Date: Mon, 21 Aug 2023 18:56:12 +0900 Subject: [PATCH 3/4] comment : add & modify comment --- .../sumin.py" | 2 ++ .../sumin.py" | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git "a/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" "b/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" index 230f8309..7fcd914f 100644 --- "a/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" +++ "b/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" @@ -35,6 +35,8 @@ def is_prime(number: int) -> bool: def solution(n: int, k: int) -> int: converted_num = convert_to_base(n, k) # n을 k진수로 변환 cnt = 0 # 조건에 맞는 소수의 개수 + # 변환된 수에 대한 조건으로 0이 양쪽 or 오른쪽 or 왼쪽 or 아예 안 붙는 경우에 해당하는 지 확인해야 하기 때문에 0을 기준으로 나눠줌 + # -> 0을 기준으로 나눠지는 수는 해당 조건들 중 어느 하나라도 만족함 for segment in converted_num.split('0'): if not segment: # 빈 문자열 continue diff --git "a/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/\354\240\204\355\231\224\353\262\210\355\230\270 \353\252\251\353\241\235/sumin.py" "b/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/\354\240\204\355\231\224\353\262\210\355\230\270 \353\252\251\353\241\235/sumin.py" index 60c07d89..18046b99 100644 --- "a/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/\354\240\204\355\231\224\353\262\210\355\230\270 \353\252\251\353\241\235/sumin.py" +++ "b/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/\354\240\204\355\231\224\353\262\210\355\230\270 \353\252\251\353\241\235/sumin.py" @@ -12,7 +12,7 @@ <시간 복잡도> 1) O(nlogn) -2) O(nm): n은 전화번호의 총 개수, m은 최대 +2) O(nm): n은 전화번호의 총 개수, m은 전화번호의 길이로 최대 20 <기타> 이 외에 트라이로도 풀이 가능 From 4f1d63dffedee0a49cead2e57c41cc5b185599ba Mon Sep 17 00:00:00 2001 From: Sumin Date: Mon, 21 Aug 2023 23:05:37 +0900 Subject: [PATCH 4/4] comment : modify comment --- .../sumin.py" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" "b/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" index 7fcd914f..af05e680 100644 --- "a/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" +++ "b/Programmers - \353\254\270\354\240\234\355\222\200\354\235\264/k\354\247\204\354\210\230\354\227\220\354\204\234 \354\206\214\354\210\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260/sumin.py" @@ -20,7 +20,7 @@ def convert_to_base(n: int, base: int) -> str: result += str(remainder) return result[::-1] -# 소수 판별(에라토스테네스의 체) +# 소수 판별 def is_prime(number: int) -> bool: if number <= 1: return False