❗️ 계속해서 업데이트 될 예정...
잘못된 부분이 있다면 알려주세요 🙏
문자열을 조작할 때 항상 슬라이싱을 우선적으로 사용해야 속도 개선에 유리하다.
슬라이싱은 내부적으로 C로 구현되어 있기 때문이다.
s = "Hello World!"
s[::-1] # 문자열을 뒤집는다. "!dlroW olleH"
s[::-2] # 2칸씩 읽는다. "HloWrd"
reversed
를 사용하면 다시 join
으로 합쳐줘야해서 시간이 오래 걸림a = 'hi'*100000000
start = time.time()
slicing = a[::-1]
end = time.time() - start
print(end)
>>> 0.2248706817626953
start = time.time()
reverse = ''.join(reversed(a))
end = time.time() - start
print(end)
>>> 3.8168246746063232
None
오류가 발생a[-1:]
방식을 사용하면 오류가 발생하지 않음a = ''
print(a[-1])
>>> Error!
a = ''
print(a[-1:])
>>>
✏️ 내가 작성한 코드
import sys
while 1:
s: str = sys.stdin.readline().strip()
if s[0] == '0':
break
if s == s[::-1]:
print('yes')
else:
print('no')
슬라이싱을 사용하면 코드가 훨씬 줄어드는 효과와 더불어 내부적으로 C로 구현되어 있어 속도가 빠르다.
from collections import deque
import sys
while 1:
deq: list = deque(sys.stdin.readline().strip())
if deq[0] == '0':
break
if len(deq) == 1:
print('yes')
continue
while len(deq) > 1:
if deq.popleft() != deq.pop():
print('no')
break
elif len(deq) <= 1:
print('yes')
deque
를 이용한 방식으로pop(0)
의 경우O(n)
인데 반해popleft()
는O(1)
로 빠르다. 다만 큐로 푸는 것보다 슬라이싱으로 푸는 것이 훨씬 빠르다.
✏️ 내가 작성한 코드
s = input()
if s == s[::-1]:
print(1)
else:
print(0)
✏️ 내가 작성한 코드
import collections
target = str(int(input())*int(input())*int(input()))
cnt = collections.Counter(target)
for i in range(10):
if cnt[str(i)]:
print(cnt[str(i)])
else:
print(0)
Counter
을 이용한 풀이. 하지만 이 문제에서는 아래의 방법이 더 간결하다.
target = list(str(int(input())*int(input())*int(input())))
for i in range(10):
print(target.count(str(i)))
✏️ 내가 작성한 코드
T = int(input())
for _ in range(T):
point = 0
s = input().split('X')
for v in s:
for i, j in enumerate(v):
point += i+1
print(point)
✏️ 내가 작성한 코드
print(len(input().split()))
✏️ 내가 작성한 코드
import collections
s = input().upper()
v = collections.Counter(s).most_common(2)
if len(v) > 1 and v[0][1] == v[1][1]:
print('?')
else:
print(v[0][0])