0403 TIL

looggi·2023년 4월 3일
0

TILs

목록 보기
53/114
post-thumbnail

파이썬 크롤링

  • beautifulsoup4
    html, xml등의 웹문서를 파싱해서 데이터를 추출

  • requests
    get/post/put/delete 등의 메소드를 통해 요청가능

  • urlib

  • scrapy

  • selenium
    웹사이트 자동제어
    크롤링 가능 범위가 가장 넓음
    웹사이트에 따라 필요한 드라이버를 설치해야함

스터디 문제풀기

3. Longest Substring Without Repeating Characters

처음 생각했던 아이디어는

  1. 시작점을 정해서
  2. 시작점부터 i만큼의 길이를 잘라서
  3. 중복되는 단어가 없으면 i를 리턴

이었는데 중복되는 단어가 있는지 확인하기 위해서 for문을 또 돌려야한다는 생각이 들어서 이건 좀.. 이런 생각이 들어서 stack 아이디어를 활용해서 풀었다 정확히 stack을 사용했다고 하긴 어렵지만..!

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        answer=[]
        ans=0
        for ss in s:
            if ss not in answer:
                answer.append(ss)
                if len(answer)>ans:    
                    ans=len(answer)
            else:
                if answer and answer[0]==ss:
                    if len(answer)>ans:
                        ans=len(answer)
                    answer.pop(0)
                else:
                    idx=answer.index(ss)
                    answer=answer[idx+1:]
                answer.append(ss)
        return ans              

일단 answer라는 빈 스택을 만들어주고 ans라는 변수를 만들어준다. ans에는 중복되지 않는 substring의 길이가 들어간다.
s의 요소 ss에 대해서 ss가 answer에 없다면 ss를 붙여주고 붙인 길이가 ans보다 크다면 ans의 값을 교체해줘서 answer의 값이 바뀌더라도 최대 길이가 저장되어있을 수 있도록 한다.
만약 answer에 append된 값이 있고 첫번째 값이 ss와 같다면 첫번째만 빼주면 되기때문에 팝을 해줬는데.. 와 에러났던거 고치다보니까 중복되는 코드가 있는 줄 몰랐다.. 고친다..

def lengthOfLongestSubstring(self, s: str) -> int:
        stack=[]
        ans=0
        for ss in s:
            if ss not in stack:
                stack.append(ss)
                if len(stack)>ans:    
                    ans=len(stack)
            else:
                idx=stack.index(ss)
                stack=stack[idx+1:]
                stack.append(ss)
        return ans

이렇게 보니까 엄청 쉬운 문제였네.. 왜.. 스트링이 싫다좋다 이런 소리를 했었는지 알수가 없다..
무튼 ss와 중복되는 값이 있으면 그 값까지를 스택에서 빼버리고 스택에 해당 값을 넣어준다 끝!

profile
looooggi

0개의 댓글