파이썬, 백준 문제풀이

주제무·2022년 3월 6일
0

알고리즘

목록 보기
11/21

이것저것 검색해보고 필요하다 싶은 것은 모두 참고하면서 지내다보니 시간이 너무 빨리 간다. 그래도 할 건 한다.

파이썬 정리

List & Dictionary

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 반환

Tuple

괄호 없이 사용가능 하다. 편리하게 활용하도록 되어있다.

함수

매개변수

가변 매개변수 : 뒤에 일반 매개변수를 위치 불가능 + 하나만 사용가능
*value 와 같이 활용

기본 매개변수와 함께 활용하려면 가변 매개변수 + 기본 매개변수
Ex> print('123','123',sep='')
sep='' 처럼 지정해야 한다.

recursion

중복되는 연산을 포함하는 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

리스트를 사용하지 않고 딕셔너리를 사용한 것이 중요하다고 생각한다.

typeError

함수 매개변수 전달에 부족하거나, 많을 경우 발생

참고사항

Iterator

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

global

전역변수
함수 내부에서 함수 외부의 값을 참조, 수정할 때 필요하다. 활용은 다음과 같다.

cnt = 0

def check():
	global cnt
    cnt += 1

다만 수정하는 것이 아니라 값만 쓰는 것이라면 global 선언을 하지 않아도 된다.

Unix time

1970년 1월 1일을 기준으로 몇 초 지났는 지 정수로 나타낸 것

import time

t = time.time()

pass keyword & raise NotImplementError

코드에서 미구현 부분을 표시할 때, pass keyword를 사용한다.
의도적으로 Error 발생을 위해서 raise NotImplementError

여러 함수

filter(fuc, iterable)
map(fuc, iterable)

filter fuc -> generator; # if fuc(element) is True

divmod : 몫과 나머지를 Tuple 반환

백준

백준 2608

아라비안 숫자 변환

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의 풀이
경우의 수가 얼마 없을 때 유용한 것 같다.

백준 2877

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

결과

잔 실수가 너무 많다.

  • 모르는 함수, bin()의 출력을 확인하지 않았다.
  • 충분한 예제를 통해 검증하지 않았다.
  • 범위의 양 끝 검증하지 않았다.
  • list('4'*k) -> [4]*k

0개의 댓글