파이썬 알고리즘 : 뉴스 클러스터링

2024년 1월 30일 알고리즘 문제풀이 문제 뉴스 클러스터링 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 def solution(str1, str2): def check(x): if x[0].islower() and x[1].islower(): return True else: return False str1 = list(str1) str2 = list(str2) arr1 = [] arr2 = [] for i in range(len(str1) - 1): if str1[i].isupper(): str1[i] = str1[i].lower() if str1[i + 1].isupper(): str1[i + 1] = str1[i + 1].lower() if check(str1[i] + str1[i + 1]): arr1.append(str1[i] + str1[i + 1]) for i in range(len(str2) - 1): if str2[i].isupper(): str2[i] = str2[i].lower() if str2[i + 1].isupper(): str2[i + 1] = str2[i + 1].lower() if check(str2[i] + str2[i + 1]): arr2.append(str2[i] + str2[i + 1]) arr_all = arr1 + arr2 arr_set = set(arr_all) n_max = 0 n_min = 0 for i in arr_set: n_max += max(arr1.count(i), arr2.count(i)) if i in arr1 and i in arr2: n_min += min(arr1.count(i), arr2.count(i)) if str1 == str2: answer = 65536 elif not n_max and not n_min: answer = -1 else: answer = int((n_min / n_max) * 65536) return answer 우선 문자열을 배열로 만들었다. 이후 각 원소가 대문자라면 소문자로 만들어주었다. 대문자, 소문자 구별이 없기 때문에 비교를 수월하게 하기 위함이다. 리스트의 두 원소를 붙여서 check 함수를 통해 둘다 소문자로 이루어진 알파벳인지 확인한다. 앞서서 대문자를 모두 소문자로 바꿔서 대문자일 가능성은 없다. 굳이 두개를 나눠야 하는 이유는, “%a” 에게 islower() 메서드를 사용하면 a가 소문자라 True를 반환하기 떄문이다. 앞에 %는 무관하다. 물론 “%” 처럼 알파벳이 없다면 False를 반환하다. 따라서 둘 다 알파벳으로 이루어졌는지 확인하기 위해 check() 함수에서는 둘을 나눴다. 이후 합집합의 갯수와 교집합의 갯수를 확인하기 위해 알파벳 2개가 원소인 리스트를 합쳐 set로 만들었다. 중복된 원소를 제거하여 교집합과 합집합 계산에 경우의 수를 낮추기 위해서다. 둘 다 공집합이면 -1을 반환해야하는데, 합집합 교집합이 0일 떄로 확인했다. 다만 예시 3번처럼, “%a!” 와 “%A!” 는 실제로 2개씩 잘랐을 때 모두 알파벳 2개로 이루어지지 않아(%a, a!) 집합이 없게 표시되지만 자카드 유사도는 1이다. 알파벳의 대문자 소문자 여부를 따지지 않기 때문에 완전히 동일한 두 문자열이기 떄문이다. 이럴 때를 확인하기위해 소문자로 바꾸고 리스트화 한 이후 둘이 같다면 자카드 유사도가 1이라 66536을 곱하여 나눈 정수부분을 그대로 출력하도록 했다. ...

2024년 1월 30일 · 2 분 · 배준수

NLTK 데이터 파일 저장하기

Today I Learned 날짜 2024년 1월 29일 월요일 내용 기능 개발이 끝나고 QA를 시작했다. nltk 지난주에 nltk 패키지에서 필요한 데이터들을 templates 폴더에 추가하여 추가적인 다운로드 없이 사용하도록 코드를 작성했었다. 테스트 서버에서 오류가 발생했는데, 범인은 금요일이 연차여서 존경하는 선배님께서 원상복구 해주셨다. 문제 해결을 위해, 고민의 원점에 서서 차근차근 생각하며 다양한 방법을 생각했다. 현재 해결하고자 하는 것은 무엇인가? nltk 패키지에서 사용할 데이터 다운로드 횟수를 최소한으로 만들자. 그 목적은 무엇인가? 불필요하게 반복되는 데이터 다운로드는 리소스 낭비기 때문이다. 해결하기 위한 방법들은 무엇들이 있는가? templates 디렉토리 내에 데이터를 저장한다(현재). S3, Git Large File Storage 등의 스토리지 서비스를 이용한다. dockerFile에 이미지 빌드 시 필요한 데이터를 다운로드 하도록 한다. 방법 (a)의 동작을 정상화 시킨다고 하더라도, 간과한 문제가 있었다. nltk에서 다운로드 하는 데이터는 3가지다. ...

2024년 1월 29일 · 3 분 · 배준수

파이썬 알고리즘 : N개의 최소 공배수

2024년 1월 25일 알고리즘 문제풀이 문제 N개의 최소 공배수 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 def solution(arr): num = max(arr) i = 1 while True: answer = num*i for x in arr: if answer%x: i += 1 break else: return answer 어떤 수들의 최소공배수는 모든 수의 배수라는 의미이다. 따라서 수 들중 가장 큰 수의 배수를 모두 탐색하여 어떤 수로도 나누어 떨어질 때가 최소공배수이다. 가장 큰 수로 하는 이유는, 그나마 횟수를 조금이라도 낮추기 위해서이다. ...

2024년 1월 29일 · 1 분 · 배준수

파이썬 알고리즘 : 문자열 나누기

2024년 1월 26일 알고리즘 문제풀이 문제 문자열 나누기 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def solution(s): answer = 0 while s: x = s[0] num_x = 0 not_x = 0 for i in range(len(s)): if s[i] == x: num_x += 1 else: not_x += 1 if num_x == not_x: answer += 1 s = s[i+1:] break else: return answer+1 return answer

2024년 1월 26일 · 1 분 · 배준수

누구나 이해할 수 있는 코드 짜기

Today I Learned 날짜 2024년 1월 25일 목요일 내용 낫 놓고 기억자도 모름 알리익스프레스에서 크롤링을 제한해두었다. 어제 겪은 문제의 원인이다. 상품 정보를 가져오지 못하는 이유를 온갖 곳에서 찾았을 때 분명 보았던 글이고, 생각도 해봤지만 특정하지 못했다. 개발 실력을 키우는 수준에서 가능한 것과 그렇지 않은 것을 구별해내는 능력은 아직 먼 일일지도 모르겠지만, 좀 갖고싶다. 코드개선 오늘은 전체적으로 내가 작성한 코드의 퀄리티를 높이는 작업을 했다. 타입 힌팅 : 함수들의 반환 타입을 지정해주었다. 재사용성할 필요성은 느끼지 못해서 스키마에 추가하진 않았다. 키워드인자 : 함수를 정의할 때 parameter도 정의한다. 함수를 호출할 때 정의한 순서대로 값을 넣을 수도 있고(위치인자), 정의한 parameter 이름으로 넣을 수도 있다(키워드인자). 키워드 인자는 어떤 값이 어떤 인자로 쓰여있는지 확실히 알 수 있기 때문에, 여러 사람이 보는 코드에서 불필요한 혼동을 줄여준다. nltk 데이터 : 받은 리뷰들을 각 단어의 원형으로 토큰화하고, 긍부정을 판별하기 위해서 데이터가 필요하다. 데이터가 자주 업데이트 되지 않다보니 한번만 다운로드 하도록 변경했다. 기존에는 분석함수 호출할 떄마다 다운로드했는데, 큰 것은 용량이 122MB다 보니 너무 비효율적이다. S3 버킷에 넣을까 고민했는데, 매번 가져와서 조회하는 것도 효율적이지 않다고 생각했다. 그럼 docker-compose에 빌드할 때 다운로드하도록 추가할 것도 고민해봤다. 하지만 애초에 데이터를 저장해두는 이유는, 이 데이터가 업데이트가 잘 되지 않기 떄문이다. 최근 업데이트가 2016년이였으니까.. 그냥 위젯이나 이메일 템플릿 저장하듯이 디렉토리에 추가해주었다. 괜히 어렵게 생각했네. 회고 평탄할 줄 알았지만 힘든 한주였다. ...

2024년 1월 25일 · 1 분 · 배준수

파이썬 알고리즘 : 정수 제곱근 판별

2024년 1월 25일 알고리즘 문제풀이 문제 정수 제곱근 판별 난이도 Lv.1 코드 1 2 3 4 5 6 7 def solution(n): tmp = int(n**(0.5)) if tmp**2 == n: answer = (tmp+1)**2 else: answer = -1 return answer 제곱근은 0.5제곱과 같음.

2024년 1월 25일 · 1 분 · 배준수

2.1 네트워크 애플리케이션의 원리

네트워크 애플리케이션 : 다른 위치의 종단 시스템에서 동작하고 네트워크를 통해 서로 통신하는 프로그램 웹 애플리케이션에는 서버와 클라어인트라는 두 가지 프로그램이 있다. 클라이언트 : 사용자의 호스트에서 실행되는 브라우저 프로그램 웹 서버 호스트에서 실행되는 웹 서버 프로그램 새로운 애플리케이션을 개발할 때, 라우터나 링크 계층 스위치처럼 네트워크 코어 장비에서 실행되는 소프트웨어까지 작성할 필요는 없다. 네트워크 코어 장비는 애플리케이션 계층에서 기능하지 않는 대신 네트워크 계층 및 그 하위 계층에서 기능한다. 종단 시스템에서만 애플리케이션 소프,트웨어가 존재한다. 2.1.1 네트워크 애플리케이션 구조 애플리케이션 구조는 네트워크 구조(ex. 1.5장에 나온 프로토콜 스택)와 다르다. 개발자 관점에서 네트워크 구조 : 고정되어 있고 해당 애플리케이션에 특정 서비스 집합을 제공 애플리케이션 구조(application architecture) : 개발자가 설계하며 애플리케이션이 다양한 종단 시스템에서 어떻게 조직되어야 하는지를 알려줌. 최근 가장 많이 사용하는 애플리케이션 구조가 현대 네트워크 애플리케이션에서 사용되는 “클라이언트-서버” 구조와 P2P 구조 클라이언트-서버 구조(client-server architecture) 서버(server) : 항상 동작하고 있는 호스트 클라이언트(client) : 서버에 서비스 요청을 보냄 이 구조에서, 클라이언트는 서로 직접적으로 통신하지 않는다. 서버는 고정 IP 주소를 갖는다. 클라이언트의 요청이 많을 경우 단일 서버 호스트가 모든 요청을 처리하긴 힘들다. 많은 수의 호스트를 갖춘 **데이터 센터(data center)**가 강력한 가상의 서버를 생성하는 역할을 함. P2P 구조 항상 켜져있는 인프라스트럭처 서버에 최소로 의존하거나 의존하지 않음 대신 **피어(peer)**라는 간헐적으로 연결된 호스트 쌍이 서로 직접 통신 피어(peer) : 서비스 제공자(service provider)가 소유하지 않고 사용자들이 제어하는 데스크톱과 랩톱 한 엔드시스템이 서버 역할을 해준다. 토렌트가 대표적인 P2P 구조 P2P구조는 **자가 확장성(self-scalability)**이 있다. 각 피어들이 파일을 요구함으로써 작업 부하를 만들어낸다. 하지만 파일을 다른 피어들에게 분배함으로써 그 시스템에 서비스 능력을 추가함. 토렌트에서 다운로드 받고 업로딩하는 사람이 많을 수록 그 파일은 다운로드 속도가 빨라지는데, 이유가 바로 이것이다. 서버 인프라스트럭처와 서버 대역폭이 필요하지 않아 비용 효율적이다. 보안, 성능, 신뢰성이 단점이다. 2.1.2 프로세스 간 통신 운영체제 용어에서 실제 통신하는 것은 프로그램이 아니라 **프로세스(process)**다. 프로세스(process) 종단 시스템에서 실행되는 프로그램 통신 프로세스가 같은 종단 시스템에서 실행될 때 그들은 서로 프로세스 간에 통신한다. 프로세스 간의 통신을 위한 규칙은 종단 시스템의 운영체제에 의해 좌우된다. 여기서 다룰 통신은 같은 호스트에서 프로세스가 통신하는 방법이 아닌, 다른 호스트에서 실행되어 통신할 때이다. 2개의 종단 시스템에서 프로세스는 컴퓨터 네트워크를 통한 메시지(message) 교환으로 통신한다. 송신 프로세스 : 메시지를 만들어서 네트워크를 보낸다. 수신 프로세스 : 메시지를 받고 역으로 메시지를 보내 응답한다. 클라이언트와 서버 프로세스 네트워크 애플리케이션 : 서로 메시지를 보내는 두 프로세스로 구성 ...

2024년 1월 24일 · 5 분 · 배준수

열심히 집중하여 최선을 다해 아무것도 못하기

Today I Learned 날짜 2024년 1월 24일 수요일 내용 하루종일 아무것도 해낸 게 없다. 다행히 오늘은 딱히 프론트쪽에 심어둔 폭탄이 없어서 급하게 바꾸거나 할 부분은 없었다. 지금 스프린트에서, 리뷰들을 수집해오면 기존에 존재하는 테이블에 리뷰 수집 기록을 남기고, 이 테이블의 자식 테이블 격인 분석 기록 테이블에 레코드를 추가한다. 그리고 리뷰를 분석하여 결과 테이블에 결과를 기록한다. 상품에 대한 정보 중 일부(제목, 판매량 등)이 DB에 저장되지 않는 문제가 발생했으나 해결하지 못하고 있다. 상황이 참 꼬여있는게, 로컬에서는 받아오는데 전혀 문제가 없고 로컬에서 테스트 서버의 데이터베이스에 연결해서 테스트서버를 구동해봐도 DB에 정보를 잘 저장한다. 하지만 테스트서버에서 API를 테스트 했을때만 일부 정보를 찾지 못한다. 따라서 해결을 위한 테스트는 모두 테스트 서버에서 이뤄져야 하는데 나는 아직 코드싸개라 권한이 없다보니 참 힘들다. ...

2024년 1월 24일 · 1 분 · 배준수

피그마 안 본 카르마

Today I Learned 날짜 2024년 1월 23일 화요일 내용 코드를 그지같이 짠 댓가를 톡톡히 치뤘다. 문제는 나만 치룬게 아니라는게.. 기획안과 피그마 피그마와 기획안 현황을 제대로 숙지하지 않았다. 그래서 여러 문제가 생겼는데, 여러 분석 결과를 보여주는 화면에 관련된 API를 만들지 않았다. 리뷰의 판정에 중립을 설정하지 않았다. 필요한 데이터를 제대로 넘기지 않았다. 이외에도 수두룩하다. API 자체는 급하게 만들었으나 여러가지 수정해야할 것들도 존재했고 똑바로 만들지 않아서 고쳐야 할 것도 많았다. 애초에 내가 잘 테스트해서 끝내놨어야 했는데 그러지 못해서 발생한 일이었다. ...

2024년 1월 23일 · 2 분 · 배준수

ECS 망령

Today I Learned 날짜 2024년 1월 22일 월요일 내용 진척이 많이 됐지만, 디테일이 많이 부족한 상황. ECS Task 이쯤되면 ECS가 일본 축구선수 (이) 시바사키 가쿠의 약자는 아닐까 의심된다. 오늘 weekly review report 메일이 발송되지 않았다. 지금은 스프린트 중이라 나중에 고쳐야하지만 얼추 봤을땐 cron식이 잘못된 것으로 보인다. 구글 스프레드시트에 데이터를 추가하는 Task에서도 오류를 발견했다. 작동자체는 잘 되지만 데이터 상의 날짜가 이틀 전으로 들어간다. 내가 넣고자 하는 날짜는 오늘이었으나, UTC 시간 상 한국 시간 8시는 전날 오후 11시다. 따라서 Task가 동작하는 시간의 “오늘”은 실제론 어제다. 그리고 내가 작성한 cronjob은 날짜를 어제로 설정한다. 이 cronjob은 어제의 “어제”, 즉 그저께를 가리키게 된다. ...

2024년 1월 22일 · 2 분 · 배준수