1) 숫자끼리 비교하는 연산과 문자끼리 비교하는 연산 중 왜 문자끼리 비교하는 연산이 상대적으로 불리한지 이유에 대해서 정리해보고 샘플 코드를 구현.
샘플코드 작성시 비교 연산자 뿐만 아니라 문자열이 실제 어떤 과정을 거쳐서 비교가 가능한지 확인 가능한 형태로 코드를 작성할 것
숫자끼리 비교하는 연산은 단순히 값의 크기를 비교하는 연산으로서 매우 빠르고 간단합니다. 숫자는 메모리에 바로 표현되기 때문에 직접적으로 비교하는데에 큰 비용이 들지 않습니다. 반면 문자열은 숫자와 달리 여러 개의 문자로 이루어져 있으며, 각 문자마다 비교를 해야하기 때문에 연산이 상대적으로 복잡합니다.
문자끼리 비교하는 연산은 문자의 유니코드(Unicode) 값으로 비교가 이루어집니다. 각 문자는 컴퓨터 내부에서 유니코드로 표현되며, 이러한 유니코드 값은 문자의 순서를 나타냅니다. 따라서 문자끼리의 비교는 해당 문자의 **유니코드 값**
을 비교하는 과정이 필요합니다. 이러한 문자의 유니코드 값을 비교하는 과정은 숫자 비교보다 더 복잡하며, 문자열의 길이가 길어질수록 비교에 소요되는 시간이 늘어납니다.
특히, 문자열의 길이가 길어질수록 비교하는데에 비례하여 시간 복잡도가 증가하게 됩니다.
따라서, 문자열끼리의 비교는 숫자끼리의 비교보다 성능면에서 더 느릴 수 있습니다. 하지만 일반적인 상황에서는 이러한 성능 차이가 크게 영향을 미치지 않으며, 파이썬은 문자열 비교를 효율적으로 처리하는 최적화된 방법을 제공하므로 큰 문제는 발생하지 않습니다.
import time
def string_comparison(str1, str2):
# 문자열 str1과 str2를 비교하는 함수
start_time = time.time() # 시작 시간 기록
if str1 == str2:
result = "두 문자열은 동일합니다."
else:
result = "두 문자열은 다릅니다."
end_time = time.time() # 종료 시간 기록
elapsed_time = end_time - start_time # 실행 시간 계산
print(f"문자열 비교 결과: {result}")
print(f"문자열 비교 실행 시간: {elapsed_time}초")
def number_comparison(num1, num2):
# 숫자 num1과 num2를 비교하는 함수
start_time = time.time() # 시작 시간 기록
if num1 == num2:
result = "두 숫자는 동일합니다."
elif num1 < num2:
result = "첫 번째 숫자가 두 번째 숫자보다 작습니다."
else:
result = "첫 번째 숫자가 두 번째 숫자보다 큽니다."
end_time = time.time() # 종료 시간 기록
elapsed_time = end_time - start_time # 실행 시간 계산
print(f"숫자 비교 결과: {result}")
print(f"숫자 비교 실행 시간: {elapsed_time}초")
# 두 문자열 비교하기
string1 = "hello"
string2 = "world"
string_comparison(string1, string2)
if string1 > string2:
print("string1이 string2보다 큽니다.")
else:
print("string2이 string1보다 큽니다.")
string3 = "hello"
string4 = "hello"
string_comparison(string3, string4)
# 두 숫자 비교하기
number1 = 10
number2 = 5
number_comparison(number1, number2)
number3 = 7
number4 = 7
number_comparison(number3, number4)
혹여 시간복잡도를 출력하는 코드를 사용하여 테스트 해보았는데 다 0으로 나와서 큐큐큨ㅋ..너무 간단해서 그런가봅니다...
ord()
를 사용하여 확인할 수 있습니다. 이 함수는 문자의 유니코드 코드 포인트 값을 반환합니다.def compare_strings(str1, str2):
# 두 문자열의 길이를 비교하여 짧은 길이를 기준으로 루프를 돕니다.
min_length = min(len(str1), len(str2))
for i in range(min_length):
# 두 문자열의 각 문자를 유니코드 코드 포인트 값으로 변환합니다.
char1 = ord(str1[i])
char2 = ord(str2[i])
# 유니코드 코드 포인트 값을 비교합니다.
if char1 < char2:
return f"{str1}가 {str2}보다 앞에 있습니다."
elif char1 > char2:
return f"{str2}가 {str1}보다 앞에 있습니다."
# 루프를 모두 돌았을 때, 짧은 길이의 문자열이 더 작을 수도 있으므로 길이를 비교하여 결과를 반환합니다.
if len(str1) < len(str2):
return f"{str1}가 {str2}보다 앞에 있습니다."
elif len(str1) > len(str2):
return f"{str2}가 {str1}보다 앞에 있습니다."
else:
return "두 문자열은 동일합니다."
# 샘플 문자열 비교
str1 = "apple"
str2 = "banana"
result = compare_strings(str1, str2)
print(result) # 출력: "apple가 banana보다 앞에 있습니다."
2) 파이썬으로 일부 중복되는 element를 저장하고 최소 element가 10개이상 되는 배열을 만든다. 그리고 set() 구문 없이 오로지 for in 문으로 배열의 중복된 값을 없애는 코드를 작성하기
# 일부 중복되는 요소를 저장하는 배열
arr = [1, 2, 3, 2, 4, 5, 6, 5, 7, 8, 9, 10, 1]
# 중복된 값을 제거할 배열
unique_arr = []
# 배열의 요소를 하나씩 확인하면서 중복 여부를 확인
for num in arr:
if num not in unique_arr:
unique_arr.append(num)
# 중복이 제거된 배열 출력
print(unique_arr)