멍청한 나는 for문에 너무 집착한 나머지 1시간 동안 머리를 싸매다가 결국 Discuss를 보고 말았다.
while문이 무한루프를 도는 경우가 싫어서 왠만해선 for문을 써왔었는데 최근 Leetcode 문제들을 풀어보면 while이 그렇게 나쁜것도 아니고, 오히려 굉장히 실용적이라는 느낌도 들었다. 코딩문제를 풀때 while도 많이 애용해 봐야겠다고 생각했다.
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
MAX = 0
x = len(height) - 1
y = 0
while x != y:
if height[x] > height[y]:
area = height[y] * (x - y)
y += 1
else:
area = height[x] * (x - y)
x -= 1
MAX = max(MAX, area)
return MAX
이걸 for문으로 하려면 아주 난리를 쳐야했는데 만들면서도 굉장히 잘못됐다고 느꼈었다ㅋㅋㅋㅋ,,, while... 애용합시다!
for문에 tqdm을 사용하면 이 친구가 언제 다 돌아가는지 확인할 수 있어서 매우 유용하다.
import fitz, os
import pandas as pd
from tqdm import tqdm
path_dir = './'
file_list = os.listdir(path_dir)
# print(file_list) # 현재폴더(./) 안에 있는 파일명들이 리스트화되어 들어가 있다.
for data in tqdm(file_list) :
if '.pdf' in data :
doc = fitz.open('./{}'.format(data))
page = doc.loadPage(0)
pix = page.getPixmap()
output = "../pdf2png/{}.png".format(data.replace('.pdf',''))
pix.writePNG(output)
pdf2image라는 모듈이 있으나 poppler에서 계속 오류가 났던 나는 차선책을 찾게 되었는데, 속도 면에서는 얼마나 차이가 나는지는 모르겠지만 일단 내가 PyMuPDF를 사용해 본 결론으로는 굉장히 느리다ㅋㅋ... 코드도 느릴만하긴하지만.. 그래도 PyMuPDF는 원하는 PDF 페이지만을 선택해서 이미지화 할 수도 있기 때문에 나름 유용하다.
사실 pdf 파일을 이미지로 바꾸기만 하면 되는거 아니겠어? pdf2image모듈을 못 사용하니 꿩 대신 닭을 사용했다.
대부분의 사람들이 그렇겠지만, 개인적으로 굉장히 어려워하는게 Node인데 하필이면 2번부터 Node가 나왔다ㅋㅋㅋ 번호 순서대로 풀지 말아야겠다는 생각이 강력하게 들었지만 의외로 또 문제가 쉬워보여서 도전해봤다. 어렵진 않았지만 Node의 개념을 모른다면 절대 못푸는 그런 문제... return값도 node라는게 아주 키포인트임!
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
# 내 풀이
class Solution:
def addTwoNumbers(self, l1, l2):
# print(l1.next.next) # ListNode{val: 3, next: None}
# ListNode는 길이가 없다. 생각해보면 당연하지만 일단 len충인 나는 해봤다 봉변당함ㅋㅋ
# print(len(l1)) # 'ListNode' has no len()
result = 0
i = 0
# 우선 l1과 l2에 있는 데이터로 연산을 완료 (result)
while l1 or l2 :
if l1 != None :
result += l1.val*(10**i)
l1 = l1.next
if l2 != None :
result += l2.val*(10**i)
l2 = l2.next
i += 1
# for문을 돌리기 위해 int인 result를 str로 변경한 모습 (별로 좋다고 생각은 안함)
result = str(result)
# 여기서 진짜 웃긴게 cur을 사용하지 않으면 node가 제대로 이어지지 않는다.
answer = cur = ListNode(0)
# answer = cur = ListNode(0)이 아니고
# answer = ListNode(0)으로 해서 아래 for문을 cur 대신 answer쓰면 제대로 node 형성이 안됨
for i in range(len(result)-1,-1,-1) :
cur.next = ListNode(result[i])
cur = cur.next
# return도 제법 웃겨
return answer.next
# Discuss에서 추천 수 많았던 코드
class Solution:
def addTwoNumbers(self, l1, l2):
carry = 0
root = n = ListNode(0)
while l1 or l2 or carry:
v1 = v2 = 0
if l1:
v1 = l1.val
l1 = l1.next
if l2:
v2 = l2.val
l2 = l2.next
# print(carry)
# print("v1 :",v1,"v2 :",v2)
carry, val = divmod(v1+v2+carry, 10)
# print(carry,val)
n.next = ListNode(val)
n = n.next
return root.next
위의 코드를 보면 결국에 나랑 비슷한 생각인데 나는 올림에 대해 어떻게 해야할지 모르겠어서 연산을 다 마치고 연산이 끝난 데이터를 역순으로 뽑아 node를 만들었다면, 이 사람은 한번에 node까지 만든것을 볼 수 있다. 올림을 저렇게 할 생각을 못했었는데 진짜 똑똑한것 같다.
이 부분에 대해서는 조금 더 공부한 내용을 추가하도록 하겠다! Node를 아주 부셔버리겠어...