알고리즘
더보기
1. 슬라이싱
def solution(my_string, num1, num2):
a = my_string[num1]
b = my_string[num2]
c = num1
d = num2
new_string = my_string[:c] + b + my_string[c+1:d] + a + my_string[d+1:]
return new_string
2. for문
def solution(my_string, num1, num2):
answer = ''
for idx in range(len(my_string)):
if idx==num1: idx = num2
elif idx==num2: idx = num1
answer += my_string[idx]
return answer
3. 스왑
두 값을 서로 바꿔줄 수 있다.
def solution(my_string, num1, num2):
answer = list(my_string)
answer[num1], answer[num2] = answer[num2], answer[num1]
return ''.join(answer)
더보기
문제의 정수 길이가 300만개까지라서 시간복잡도가 N^2이면 실패하는 문제였다.
2중 for문없이 해결해야 한다.
1. collections의 Counter
from collections import Counter
def solution(X, Y):
intersection = list((Counter(X) & Counter(Y)).elements())
intersection.sort(reverse=True)
a = "".join(sorted(intersection, reverse=True))
if set(a) == {"0"}:
return "0"
elif a == "":
return "-1"
else:
return a
2. set()과 .intersection()
def solution(X, Y):
repeat_num = []
if len(set(X).intersection(set(Y))) == 0:
return "-1"
elif set(X).intersection(set(Y)) == {"0"}:
return "0"
else:
for i in Y:
if X.find(i) != -1:
repeat_num.append(i)
return str("".join(sorted(repeat_num, reverse=True)))
3. 각각에 for문을 사용해서 arr_x, arr_y라는 각 숫자의 개수를 담은 배열 생성
def solution(X, Y):
answer = ''
arr_x = [0]*10
arr_y = [0]*10
for i in X:
arr_x[int(i)]+=1
for i in Y:
arr_y[int(i)]+=1
for i in range(0,10):
answer = str(i)*(min(arr_x[i],arr_y[i])) + answer
if answer == '': answer = '-1'
elif answer.replace('0','') == '': answer = '0'
return answer
더보기
1. min, max를 사용해서 보드밖으로 못나가게 하는 방법
def solution(keyinput, board):
x, y = 0, 0
for direction in keyinput:
if direction == "right":
x = min(x + 1, board[0]//2)
elif direction == "left":
x = max(x - 1, -board[0]//2 + 1)
elif direction == "up":
y = min(y + 1, board[1]//2)
elif direction == "down":
y = max(y - 1, -board[1]//2 + 1)
return [x, y]
2. 딕셔너리 사용
def solution(keyinput, board):
board_width = board[0]//2
board_hight = board[1]//2
keyinput_dic = {"up":[0,1], "down":[0,-1], "left":[-1,0], "right":[1,0]}
answer = [0,0]
for i in keyinput:
if board_width >= answer[0]+keyinput_dic[i][0] >= -board_width :
answer[0] += keyinput_dic[i][0]
if board_hight >= answer[1]+keyinput_dic[i][1] >= -board_hight :
answer[1] += keyinput_dic[i][1]
return answer
3. 보드의 길이를 map,lambda를 사용한 리스트로 표현
def solution(keyinput, board):
answer = [0, 0]
board_m = list(map(lambda x: (x-1)/2, board))
x_= keyinput.count("right")-keyinput.count("left")
y_ = keyinput.count("up")-keyinput.count("down")
if abs(x_) < board_m[0]:
answer[0] = x_
elif x_ < 0:
answer[0] = -board_m[0]
else:
answer[0] = board_m[0]
if abs(y_) < board_m[1]:
answer[1] = y_
elif y_ < 0:
answer[1] = -board_m[1]
else:
answer[1] = board_m[1]
return answer
더보기
0. 5의 배수만 탐색하는 방법(오류 있음 => ex. l이 56일때 계산값에 55가 포함되어 오류 발생)
이후 set의 {"0","5" }또는 {"5"}의 부분집합만 정답에 추가
def solution(l, r):
result = []
num1 = l//5*5
num2 = r//5*5 + 5
for i in range(num1, num2, 5):
if set(str(i)) == set({"0", "5"}) or set(str(i)) == set({'5'}):
result.append(i)
return result if result else [-1]
1. replace로 0과 5를 다 지웠을 때, 빈 문자열이면 정답에 추가해주는 방법
def solution(l, r):
answer = []
for i in range(l,r+1):
if str(i).replace('5','').replace('0','')=='': answer.append(i)
if answer == []: answer.append(-1)
return answer
'WIL&TIL > TIL' 카테고리의 다른 글
20230427 TIL - 장고 프로젝트 세팅, 알고리즘 (0) | 2023.04.27 |
---|---|
20230426 TIL - 시크릿키, 알고리즘, divmod() (0) | 2023.04.27 |
20230424 TIL - 알고리즘 (4) | 2023.04.24 |
20230421 TIL - Customizing token claims, 알고리즘 (0) | 2023.04.21 |
20230420 TIL 알고리즘 - k의 개수, 2차원으로 만들기 (0) | 2023.04.20 |
댓글