이것저것 검색해보고 필요하다 싶은 것은 모두 참고하면서 지내다보니 시간이 너무 빨리 간다. 그래도 할 건 한다.
list : index를 이용하여 literal 접근
dict : key를 이용하여 literal 접근
list : enumerate(List) -> (a,b)
dict : 내부함수 item() -> (a,b)
in keyword
list : literal 기준
dict : key 기준
del keyword : key, index 기준으로 값 제거
참고
keyerror : dictionary[key]; key가 존재하지 않을 때
-> 내부함수 get()을 이용하면 key가 존재하지 않을 때, None 반환
괄호 없이 사용가능 하다. 편리하게 활용하도록 되어있다.
가변 매개변수 : 뒤에 일반 매개변수를 위치 불가능 + 하나만 사용가능
*value 와 같이 활용
기본 매개변수와 함께 활용하려면 가변 매개변수 + 기본 매개변수
Ex> print('123','123',sep='')
sep='' 처럼 지정해야 한다.
중복되는 연산을 포함하는 recursion은 memorization을 통해 연산 중복 문제를 해결해야 한다.
피보나치 수열
dictionary = {
1:1,
2:1
}
def fibo(n):
if n in dictionary:
return dictionary[n]
output = fibo(n-1) + fibo(n-2)
dictionary[n] = output
return output
리스트를 사용하지 않고 딕셔너리를 사용한 것이 중요하다고 생각한다.
함수 매개변수 전달에 부족하거나, 많을 경우 발생
iterable한 것중에서 next()로 전달받을 수 있는 generator
특징은 메모리 부담을 줄이기 위해서 새로운 object를 만들지 않고 기존의 것을 재활용한다는 것에 있다.
지금 당장 알고 있는 주의점으로는
a = reversed(list)
for _ in a:
print("oh")
# 반영안되지 않음
for _ in a:
print("oh")
위 코드의 결과로 아래 for문은 작동하지 않는다. 따라서 다음과 같이 진행한다.
for _ in reversed(list):
print("oh")
for _ in reversed(list):
print("oh")
전역변수
함수 내부에서 함수 외부의 값을 참조, 수정할 때 필요하다. 활용은 다음과 같다.
cnt = 0
def check():
global cnt
cnt += 1
다만 수정하는 것이 아니라 값만 쓰는 것이라면 global 선언을 하지 않아도 된다.
1970년 1월 1일을 기준으로 몇 초 지났는 지 정수로 나타낸 것
import time
t = time.time()
코드에서 미구현 부분을 표시할 때, pass keyword를 사용한다.
의도적으로 Error 발생을 위해서 raise NotImplementError
filter(fuc, iterable)
map(fuc, iterable)
filter fuc -> generator; # if fuc(element) is True
divmod : 몫과 나머지를 Tuple 반환
아라비안 숫자 변환
import sys
arabian_dict = {'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000}
arabian_li = [(1000, 'M'), (500, 'D'), (100, 'C'), (50, 'X'), (10, 'X'),
(5, 'V'), (1, 'I')]
n_li = [i.strip() for i in sys.stdin]
# calculating sum
result = 0
for a_n in n_li:
tmp = 0
for ele in a_n:
if tmp < arabian_dict[ele] and tmp != 0:
result += arabian_dict[ele] - tmp*2
continue
tmp = arabian_dict[ele]
result += tmp
print(result)
# result = 2000
# transforming arabian num
result_li = []
for idx, ele in enumerate(str(result)):
idx *= 2
# print("idx, ele", idx, ele)
ele = int(ele)
if ele == 9:
tmp = arabian_li[idx][1]+arabian_li[idx-2][1]
elif ele == 4:
tmp = arabian_li[idx][1]+arabian_li[idx-1][1]
else:
tmp = arabian_li[idx][1]*ele
result_li.append(tmp)
print(''.join(result_li))
그리고 우수 풀이
a,b=input(),input()
q,w=0,0
k={'IV':4, 'IX':9, 'XL':40, 'XC':90, 'CD':400, 'CM':900}
for i in k:
if i in a:
a=a.replace(i,'')
q += k[i]
if i in b:
b=b.replace(i,'')
w += k[i]
s={}
t='IXCM'
for i in range(4):
for j in range(1,4):
k[t[i]*j] = 10**i*j
t='VLD'
for i in range(3):
k[t[i]] = 10**i*5
for i in sorted(k.keys())[::-1]:
print("i: ", i)
s[k[i]] = i
if i in a:
a=a.replace(i,'')
q += k[i]
if i in b:
b=b.replace(i,'')
w += k[i]
# print(q,w)
q += w
print(q)
r=''
for i in sorted(s.keys())[::-1]:
if q >= i:
q-=i
r += s[i]
# print(q,i,s[i])
print(r)
brute forcing의 풀이
경우의 수가 얼마 없을 때 유용한 것 같다.
4 와 7
n = int(input())
k = 0
while True:
if 2**(k+1)-2 >= n:
break
k += 1
s = list('4'*k)
dif_n = bin(n-(2**k-1)+2**k)[3:]
for idx, ele in enumerate(dif_n):
if ele == '1':
s[idx] = '7'
print(''.join(s))
잔 실수가 너무 많다.