문자열

Sawol·2021년 3월 31일
0
post-thumbnail

❗️ 계속해서 업데이트 될 예정...

잘못된 부분이 있다면 알려주세요 🙏

문자열

문자열 슬라이싱

문자열을 조작할 때 항상 슬라이싱을 우선적으로 사용해야 속도 개선에 유리하다.
슬라이싱은 내부적으로 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:])
>>> 

문자열 풀이


문제 1259

✏️ 내가 작성한 코드

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)로 빠르다. 다만 큐로 푸는 것보다 슬라이싱으로 푸는 것이 훨씬 빠르다.


문제 10988

✏️ 내가 작성한 코드

s = input()
if s == s[::-1]:
    print(1)
else:
    print(0)

문제 2577

✏️ 내가 작성한 코드

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)))

문제 8958

✏️ 내가 작성한 코드

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)    

문제 1152

✏️ 내가 작성한 코드

print(len(input().split()))    

문제 1157

✏️ 내가 작성한 코드

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])  

0개의 댓글