range(2,n+1,2)
로 짝수만 구할 수 있다.list.reverse()
하면 반환 값 없이 list를 뒤집는다.list[::-1]
와 같이 슬라이싱에서 증가량을 이용한 방법이 있다.string[::-1]
과 같이 뒤집을 수 있음.[i for i in list]
[i for i in list if i%2==0]
[i,j for i in list_1 for j in list_2]
이중 for문도 지원한다. 왼쪽의 for문이 먼저 실행됨[i if i%2==0 else 0 for i in list]
else까지 사용한다면 for문 앞에 if-else문을 적어줘야함divmod(x, n)
을 하면 x를 n으로 나눈 몫과 나머지를 한 번에 반환한다. 하지만 작은 수에서는 divmod가 x//n, x%n을 따로 하는 것보다 시간이 더 걸린다 하니 큰 수에서 사용하는 것이 좋겠다.sum(1 for i in list if i>height)
list.count(x)
1 if n%2==0 else 0
와 같이 작성해왔는데, 그러지 말고 int(n%2==0)
으로 쓰면 더 간단하다. 가독성은 모르겠지만...n << t
n에 2**t를 곱한 값을 의미한다.n >> t
n을 2**t로 나눈 값을 의미한다.컴퓨터엔 값이 2진수로 저장되기 때문에 <<, >> 연산자로 비트를 밀어주거나 당겨주면 값이 2배씩 늘어나거나 1/2씩 줄어든다.
list(range(1,n,2))
set(문자열)
은 문자열의 각 요소가 원소로 구성된 집합을 반환한다. (중복 제거)s1&s2
는 s1과 s2의 교집합을 의미한다. (intersection 함수)s1|s2
는 s1과 s2의 합집합을 의미한다. (union 함수)s1-s2
는 s1과 s2의 차집합을 의미한다. (difference 함수)is_integer()은 x.is_integer()
와 같이 사용하고 이는 타입 확인이 아닌 형태 확인이다.
즉 x가 3.0, 즉 float여도 True를 반환한다.
range(1, n//2+1)
의 범위에서 나눠지는지 확인하면 좀 더 빠르게 확인할 수 있다. (약수에 본인 n을 포함하는 것 잊지말기!)''.join([i for i in str if i not in 'aeiou'])
in 문자열
이 가능하다는 걸 알고있자.''.join(sorted(str))
list, tuple, string에서는 list.index(x)
string에서는 str.find(x)
와 같이 find로도 사용할 수 있다.
차이점
"We are the world"
['W', 'e', ' ', 'a', 'r', 'e', ' ', 't', 'h', 'e', ' ', 'w', 'o', 'r', 'l', 'd']
result = ""
for i in my_string:
if i not in result:
result+=i
return result
리스트에 함수를 일괄 적용하는 방법
l = [1,2,3,4,5]
list(map(int, l)) => ['1','2','3','4','5']
하지만 map은 iterator 객체를 반환하니 list로 감싸서 반환해야한다.
from math import factorial
factorial(n)
from math import comb
comb(m,n)
m개 중 n개 뽑는 경우의 수! => 조합. math 패키지에 있다.
from math import gcd
greatest_common_divisor = gcd(a,b)
from collections import Counter
x = [1,1,2,3,3,6,8,9,9]
### 1)
[i for i in x if x.count(i)==1]
### 2)
[i for i in set(x) if x.count(i)==1]
### 3)
counts = Counter(x)
[i for i,j in counts.items() if j==1]
str.split()
와같이 사용한다면 공백(몇개든 상관없이) 기준으로 분리된다. 만약 str이 3 23 567
이면 [3,23,567]
이 반환된다.array.sort(key=lambda x: (abs(n-x), x))
sorted(numlist, key = lambda x: (abs(n-x), -x))
참고 문제
이렇게 하면 numlist란 리스트를 abs(n-x)로 1차 정렬하고 x값을 기준으로 내림차순 정렬한다.
정렬 조건(?)이 두개 이상이라면 꼭 괄호로 묶어주는 거 잊지말기..!
[1,2,5]
의 list를 고대로 문자열로 만들고싶다면 str(list)
하면 끝..! 그러면 "[1,2,5]"
가 되므로 이대로 사용하면 된다...만약 리스트의 값들을 모두 하나의 문자열로 합치고싶다면, join을 사용하면 될듯하다. 만약 리스트의 원소들이 str이 아니라면 map도 같이 써줘야겠지.
''.join(map(str, list))
int(binary_value, 2)
(이때 binary_value는 str)bin(decimal)
(이때 decimal은 int) 0b1010
와 같은식. 그렇기 때문에 우리가 직접 이진수를 다루기 위해선 bin(decimal)[2:]
와같이 사용def solution(n):
d = 2
answer = set()
while d<=n**0.5:
if n%d!=0:
d+=1
else:
answer.add(d)
n = n//d
if n>1:
answer.add(n)
return sorted(answer)
여기서 효율성을 높이기 위해서 n**0.5보다 작거나 같은 값을 기준으로 뒀다.
그랬기때문에 마지막에 n>1일때 n도 소인수분해 값에 넣어줘야한다.
이건 거의 공식처럼 외우고있어야겠다.
슬라이싱의 경우 범위를 초과해도 에러가 나지 않는다.
즉 a = [1,5,3,6,2]
이 있을 때, a[3:6]
해도 에러없이 [6,2]
가 출력될 뿐이다.
그러니까 인덱스 3에서 끝까지의 값을 가져오기 위해 a[3:5]
로 슬라이싱해도 에러가 나지 않는것이다.
def solution(numbers, k):
return numbers[2 * (k - 1) % len(numbers)]
이 문제를 풀면서 깨달?은건데...
해당 문제에서 1명을 건너뛰고 공을 던지니 2를 곱해주고
인덱스 0부터 공을 던지기 때문에 k-1을 해주고
%len(list)
를 이용해서 리스트의 인덱스를 넘는 값을 처리해준다.
이렇게 간단하게 처리가 가능하다니!
인덱싱에 대해서 좀 더 공부할 필요가 있겠다.
min, max로 좌표를 벗어나지 않도록 조절해줄 수 있다. 해당 문제에서 아주 유용하게 사용된다.
def solution(keyinput, board):
result = [0,0]
max_x, max_y = board[0]//2, board[1]//2
for key in keyinput:
if key=='left':
result[0] = max(result[0]-1, -max_x)
elif key=='right':
result[0] = min(result[0]+1, max_x)
elif key=='up':
result[1] = min(result[1]+1, max_y)
else:
result[1] = max(result[1]-1, -max_y)
return result
이 문제도 좌표를 이용하는 문제인데, 여기 적용할 수 있지 않을까 싶다.
l = [[1,2],[2,3],[3,4]]
sum(l, [])
이렇게 하면, []+[1,2]+[2,3]+[3,4]
와 같은 연산이 일어나기때문에 1차원 리스트로 만들 수 있다.
변수 := 표현식
과 같이 사용해 가독성을 올리고 코드를 짧게 해주는 장점이 있다네..
dictionary에서 값을 가져올 때 인덱싱도 되지만 get을 사용하는 방법도 있다.
만약 가져오려하는 값의 key가 dictionary에 없다면 error가 나기 때문에 get을 이용하면 한 줄로 간단하게 처리할 수 있다.
dict.get(x, -1)
만약 dict.get(x)
로 지정하고 dict에 x가 없다면 이는 None(NoneType)을 반환한다.
def solution(id_pw, db):
if db_pw := dict(db).get(id_pw[0]):
return 'login' if db_pw==id_pw[1] else 'wrong pw'
return 'fail'
이 문제에서 배운게 많다!
1) 이차원 리스트를 dict()함수를 사용해 dictionary로 변환할 수 있다.
2) get을 사용해 예외를 처리할 수 있다.
3) :=를 이용해 할당과 반환을 동시에 할 수 있다.
그냥 특정 값으로 냅다 계속 나눠버리면 된다.
그러고 최종 몫이 1인지 확인
while b%2==0:
b = b//2
while b%5==0:
b = b//5
return 1 if b==1 else 2
이 코드는 b의 소인수가 2나 5로만 이루어져있는지 확인하는 코드이다.
해당 문제에서 사용된다.
a, b = list[:2]
이렇게 하면 list[:2]의 두 원소가 각각 a,b로 할당된다.
list[::2], list[1::2] -> 이와 같이 홀수번째 수, 짝수번째 수 만을 뽑아낼 수 있다.
(n*(2n+(n-1)d))//2
d는 공차, n은 마지막 항
특정 문자, 문자열, 공백을 제거해주는 함수이다.
lstrip은 왼쪽, rstrip은 오른쪽, strip은 양쪽
ex) string.lstrip('a')
-> 왼쪽에 나타나는 a들을 제거해준다.
주의) 만약 인자를 'ab' 처럼 문자열로 넘겨준다면, a와 b의 모든 조합을 제거해준다. 즉 a가 나타나도, b가 나타나도, ab 혹은 ba가 나타나도 제거해준다.
f'{a}+{b}는 {a+b}입니다'
와 같이 f'{}~{}'
형식으로 포맷팅 가능하다.try except
문으로 처리할 수 있다. 즉 try구문에서 에러가 발생하면 except문을 실행하는 것
try:
~~
except:
~~
[[0]*n]*n
하면 이중 리스트가 만들어지지만, 여기서 하나의 값을 변경해보면 이상한 점을 알 수 있다.
바로 모든 행이 하나의 리스트를 참조한다는 것. 즉 [0]*n은 n개의 0으로 이루어진 리스트(독립적인 메모리에 위치한 각 원소들)를 반환하지만, [[]~]*n
에서 문제가 발생하는 것.
그러니 아래와 같이 for문을 사용해 이중 리스트를 만들어주는 게 좋다.
[[0]*n for _ in range(n)]
a<b
와 같이 부등호 연산을 하면, a와 b에서 처음으로 다른 두 값에 대한 부등호 연산이 결과로 나온다. 접두사, 접미사를 확인할 수 있는 함수이다.
ex) str.startswith('~~')
values(), keys(), items()
와 같은 함수들을 사용할 수 있음list()
함수로 감싸주면 된다.''
과 []
등 값이 없는 객체는 false로 인식되기 때문에, 이를 조건문에 잘 쓰면 코드가 간단해진다!
list_3가 3개의 원소를 가진 리스트일때, a,b,c = list_3
와 같이 각 값에 할당 가능하다.
ord()
는 문자를 아스키코드로 변환해주고,
chr()
는 아스키코드를 문자로 변환해준다.
*참고: 'A'는 65부터 시작, 'a'는 97부터 시작한다.
def solution(arr, k):
distinct = []
for item in arr:
if item not in distinct:
distinct.append(item)
if len(distinct)==k:
break
return distinct+[-1]*(k-len(distinct))
이 문제를 푸는데, 리스트 내에서 고유한 숫자를 뽑아내는 부분에서 필요 없는 코드 실행을 막을 필요를 느꼈다!
이 코드에서는 if len(distinct)==k: break
부분인데, 문제에서 필요한 distinct 원소는 최대 k개이기 때문에, distinct의 길이가 k가 됐을 때 break로 for문을 빠져나왔다. 이렇게 하면 불필요한 코드 실행을 줄일 수 있다!
return result or [-1]
과 같이 반환하려는 result 리스트가 빈 리스트일 때 대신 반환할 값을 지정할 수 있다.
우리가 if문에서 if A or B
와 같이 쓰면 A나 B가 True일 때 조건문이 실행되지 않는가?
즉 A가 True면 (A or B)에서 A가 반환되어 조건문이 실행되는 것이다.
그렇기 때문에 return 구문에서도 True(빈 리스트가 아닌 것)인 리스트가 반환되는 것이다. 우리는 result가 빈 리스트인지 아닌지 확인해야하므로, result를 [-1] 앞에 적어주면 된다.