728x90

 

백준 1193번 문제: 분수찾기


문제 설명

  1. 양의 정수를 순서대로 분수에 배치하여 다음과 같은 규칙을 따릅니다:
    • 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → 1/3 → ...
  2. 주어진 정수 X에 대해, 번째에 해당하는 분수를 구해야 합니다.

문제 해결 전략

  1. 규칙 분석:
    • 분수는 대각선 그룹으로 나뉩니다.
    • 그룹 1: 1/1 (1개)
    • 그룹 2: 1/2,2/1 (2개)
    • 그룹 3: 3/1,2/2,1/3 (3개)
    • 그룹 : n개의 분수로 이루어짐.
  2. 그룹 번호 찾기:
    • X번째 분수는 어느 대각선 그룹에 속하는지 알아야 합니다.
    • 그룹 n까지의 합은 삼각수: sum=1+2+3+⋯+n=n(n+1) / 2
    • 가 포함되는 그룹 n n(n+1) / 2 ≥ X일 때 찾을 수 있습니다.
  3. 해당 그룹에서의 위치 계산:
    • 그룹 의 시작 번호는 (n−1)n / 2 + 1
    • 는 그룹의 시작 번호로부터 몇 번째에 위치하는지 계산합니다.
  4. 분수 방향:
    • 그룹 번호가 홀수: 분자 감소, 분모 증가.
    • 그룹 번호가 짝수: 분자 증가, 분모 감소.

코드 구현

X = int(input())  # 입력값 X

# 그룹 번호 찾기
group = 1
while X > group * (group + 1) // 2:
    group += 1

# 해당 그룹에서의 위치
start_of_group = (group - 1) * group // 2 + 1
position_in_group = X - start_of_group

# 분수 계산
if group % 2 == 0:  # 짝수 그룹
    numerator = 1 + position_in_group
    denominator = group - position_in_group
else:  # 홀수 그룹
    numerator = group - position_in_group
    denominator = 1 + position_in_group

print(f"{numerator}/{denominator}")

코드 설명

  1. 그룹 번호 찾기:
    • 그룹 번호는 n(n+1) / 2 ≥ X 조건을 만족할 때까지 증가시킵니다.
  2. 그룹 시작 번호:
    • 그룹 n의 시작 번호는 (n−1)n / 2 +1 로 계산합니다.
  3. 그룹 내 위치:
    • 가 그룹에서 몇 번째인지 계산:
      position_in_group = X - start_of_group
  4. 분수 계산:
    • 짝수 그룹이면 분자가 증가하고 분모가 감소.
    • 홀수 그룹이면 분자가 감소하고 분모가 증가.

입출력 예시

입력:

14

출력:

2/4

 

풀이 과정:

  1. X = 14 → 그룹 5에 속함 (5(5+1) / 2 = 15)
  2. 그룹 5의 시작 번호: (5−1)5 / 2 + 1 = 11
  3. 그룹 내 위치: 14 − 11 = 3
  4. 그룹 5는 홀수 그룹 → 분자 = 5−3=2, 분모=1+3=4
728x90
반응형
728x90

 

1

 

https://www.acmicpc.net/problem/1157

 


 

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

 

 


 

[ 테스트 코드 ]

x = input()

xList = list(x.upper())

print(xList)

# 주어진 리스트
letters = ['M', 'I', 'S', 'S', 'I', 'S', 'S', 'I', 'P', 'I']

# 빈 딕셔너리로 개수 세기
counts = {}

for letter in letters:
    counts[letter] = counts.get(letter, 0) + 1

# 중복된 값 추출
duplicates = {key: value for key, value in counts.items() if value > 1}

print(duplicates)  # 출력: {'I': 4, 'S': 4}


data = input().upper()

max_char = max(set(data), key=data.count)
max_count = data.count(max_char)

if sum(1 for char in set(data) if data.count(char) == max_count) > 1:
    print('?')
else:
    print(max_char)

 

여기서 중요했던 요점은 문자를 대문자로 변형하고 중복 값을 체크 하는 것이다.

 

[ 결과 코드 ]

data = input().upper()

max_char = max(set(data), key=data.count)
max_count = data.count(max_char)

if sum(1 for char in set(data) if data.count(char) == max_count) > 1:
    print('?')
else:
    print(max_char)

 

그리고 코드를 조금 더 간결하게 짤 방법을 찾았고

 

요점은

가장 많이 등장하는 문자를 찾고 해당 문자의 수를 체크한다.

그리고  많이 나오는 문자의 수가 여러 개인지 확인하는 것까지 코드로 완성하였다.

728x90
반응형
728x90

1

 

오늘은 뉴욕타임즈의 기사 데이터를 수집해 보겠습니다.

 

https://developer.nytimes.com/

 

https://developer.nytimes.com/

 

developer.nytimes.com

 

먼저 뉴욕타임즈의 API를 가지고 와야합니다.

회원가입을 해준다음

 

 

회원 가입이 완료되면 API Key를 받아야 합니다.

그러기 위해서 자신의 정보를 눌러 Apps를 눌러 NEW APP을 생성해주세요.

 

 

그 다음에는

App Name 과 Description을 자신이 알기 편하게 작성 후

Most Popular API를 Enable 클릭해줍니다.

 

저희는 가장 인기있는 기사들을 크롤링 해올 예정이니깐요

클릭하시고 Save를 해주시면 됩니다.

그러면 API Key를 받으실 수 있습니다.

 

 

그럼 이 API key를 복사해준 다음

 

2

 

파이썬으로 로직을 짜보겠습니다.

 

 

 

뉴욕 타임즈에서 API 활용하는 방법에 대해 나와있는데요

항상 해당 사이트에서 제공하는 Document는 읽어보시는게 좋습니다.

차근 차근 읽어보시면 누구나 다 하실 수 있습니다.

 

Get most emailed articles for the last day: 지난 하루 동안 가장 많이 이메일로 전송된 기사

/emailed/1.json

 

Get most shared articles on Facebook for the last day: 지난 하루 동안 Facebook에서 가장 많이 공유된 기사

/shared/1/facebook.json

 

Get most viewed articles for the last seven days: 지난 7일간 가장 많이 본 기사

/viewed/7.json

 

그리고 .json 앞에 있는 숫자는 기간을 뜻합니다.

원하시는 기간을 적으시면 됩니다.

 

파이썬 코드는 아래와 같이 간단합니다.

import requests

# API 키와 엔드포인트 설정
api_key = 'API_KEYS를 복사해서 여기에 넣으시면 됩니다.'
 
 

# API 요청
response = requests.get(url)
if response.status_code == 200:
    data = response.json()
 
    for article in data['results']:
        print(f"Title: {article['title']}")
        print(f"URL: {article['url']}\n")
 
else:
    print(f"Failed to fetch data. Status code: {response.status_code}")

 

Result 결과값 : 

 

오늘의 결과값들이 나왔는데요

 

여기서 좀 더 추가해서 해보겠습니다.

 

Most News에서 Title을 한글로 번역하는 로직을 추가해보겠습니다.

 

 

pip install deep-translator

 

먼저 터미널에서 라이브러리를 추가해주세요.

 

그리고 

 

from deep_translator import GoogleTranslator

 

# 번역 수행
        translated_title = GoogleTranslator(source='en', target='ko').translate(original_title)

 

로직을 추가하겠습니다.

 

 

그럼 이렇게 한글로 해석되는 제목까지 나오게 됩니다!

 

마지막 최종 코드입니다.

import sys
import io
import requests
from deep_translator import GoogleTranslator

# 출력 스트림의 기본 인코딩 설정
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8')

# API 키와 엔드포인트 설정
api_key = 'Your API KEY'
url = f'https://api.nytimes.com/svc/mostpopular/v2/viewed/1.json?api-key={api_key}'

# API 요청
response = requests.get(url)
if response.status_code == 200:
    data = response.json()
    for article in data['results']:
        original_title = article['title']  # 원본 제목
        # 번역 수행
        translated_title = GoogleTranslator(source='en', target='ko').translate(original_title)
        print(f"Original Title: {original_title}")
        print(f"Translated Title: {translated_title}")
        print(f"URL: {article['url']}\n")
else:
    print(f"Failed to fetch data. Status code: {response.status_code}")

 

감사합니다.

728x90
반응형
728x90

 

1

 

가장 쉽고 빠르게 구글 트랜드에서 실시간 검색 키워드 가져오는 방법

 

먼저 Test 겸 키워드를 넣어서 가져오겠습니다.

 

import sys
from pytrends.request import TrendReq
import time

 

 

  • sys: 파이썬 인터프리터와 관련된 시스템 기능을 다룹니다. 이 코드에서는 출력 인코딩을 설정하기 위해 사용합니다.
  • pytrends.request.TrendReq: PyTrends 라이브러리의 핵심 클래스입니다. 이를 통해 구글 트렌드 데이터를 요청할 수 있습니다.
  • time: 일정 시간 간격으로 요청을 보내기 위해 사용합니다. 구글 트렌드에서 너무 많은 요청을 보내면 차단될 수 있으므로 간격 조정이 중요합니다.

 

 

# UTF-8 인코딩 출력
sys.stdout.reconfigure(encoding='utf-8')

 

 

  • 파이썬의 출력 스트림(sys.stdout)의 기본 인코딩을 UTF-8로 변경합니다.
  • 한국어 출력이 깨지지 않도록 해줍니다.
  • 이 설정이 없으면 터미널이나 로그에서 한글이 ����처럼 깨져 보일 수 있습니다.

 

 

# PyTrends 설정
pytrends = TrendReq(hl='ko', tz=360)

 

TrendReq 초기화: 구글 트렌드 데이터를 요청하기 위해 PyTrends 객체를 생성합니다.

  • hl='ko': 데이터를 한국어로 가져옵니다.
  • tz=360: 한국 시간(UTC+9)을 기준으로 데이터를 처리합니다.

 

# 키워드 리스트
keywords = ['파이썬', '머신 러닝']

 

그럼 Test로 원하는 키워드를 배열로 가져오겠습니다.

검색 해보고 싶은 키워드를 배열에 담으면 됩니다.

 

for keyword in keywords:
    try:
        pytrends.build_payload([keyword], timeframe='today 1-m')
        data = pytrends.interest_over_time()
        print(data)  # 한글 출력
        time.sleep(60)
    except Exception as e:
        print(f"Error : {keyword} - {e}")
        time.sleep(120)

 

그리고 반복문을 통해서 배열의 담긴 키워드 들을 다 조사를 할 예정입니다.

 

 

  • build_payload: 구글 트렌드 데이터 요청을 설정하는 메서드입니다.
    • [keyword]: 현재 반복문에서 처리 중인 키워드를 지정합니다.
    • timeframe='today 1-m': 최근 1개월 데이터를 요청합니다.
  • timeframe을 조정하면 원하는 기간의 데이터를 분석할 수 있습니다. 예를 들어:
    • 최근 1개월: 'today 1-m'
    • 최근 1일: 'now 1-d'

 

 

  • interest_over_time(): 요청한 키워드의 시간에 따른 관심도 데이터를 가져옵니다.
  • 반환된 데이터는 팬더스(DataFrame) 형식으로 제공됩니다.
  • 이 데이터를 엑셀 파일로 저장하거나 시각화 라이브러리로 그래프를 그릴 수 있습니다.

 

 

  • 요청 간격을 60초로 설정합니다.너무 많은 요청을 빠르게 보내면 구글에서 IP를 차단할 수 있습니다.
  • 적절한 간격을 두는 것이 중요합니다.

 


 

2

 

Test.py

 

[ 최종 코드 ]

# UTF-8 인코딩 출력
sys.stdout.reconfigure(encoding='utf-8')

# PyTrends 설정
pytrends = TrendReq(hl='ko', tz=360)

# 키워드 리스트
keywords = ['파이썬', '머신 러닝']

for keyword in keywords:
    try:
        pytrends.build_payload([keyword], timeframe='today 5-y')
        data = pytrends.interest_over_time()
        print(data)  # 한글 출력
        time.sleep(60)
    except Exception as e:
        print(f"에러 발생: {keyword} - {e}")
        time.sleep(120)

 


 

3

 

import sys
import io

# 출력 스트림의 기본 인코딩 설정
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8')

# 테스트 출력
print("한글 테스트")

from pytrends.request import TrendReq
import pandas as pd
import matplotlib.pyplot as plt

# pytrends 객체 생성
pytrends = TrendReq(hl='ko', tz=360)

# 실시간 급상승 검색어 가져오기
trending_searches = pytrends.trending_searches(pn='south_korea')
keywords = trending_searches[0].tolist()[:5]  # 상위 5개의 급상승 검색어
print("실시간 급상승 검색어:", keywords)

 

 

테스트는 끝났으니 이제 실시간 급상승 하는 키워드를 수집할 수 있는 로직을 새로 짜겠습니다.

임의의 키워드 대신 구글 트랜드에서 실시간으로 하는 검색어들을 수집해 추출하는 방식으로 코드를 짰습니다.

 

 

현재 시각으로 나오는 구글 트랜드 분석은

['지금 거신 전화는', '빅뱅', 'K리그1', '스타레일', '세븐틴']

이렇게 나옵니다.

 

나중에는 이러한 방법으로 사람들의 관심사를 가지고 포스팅 할 수도 있다고 생각합니다.

그러면 블로그의 유입하는 사람들도 많아질 수 있다고 생각합니다

 

감사합니다.

 

 

728x90
반응형
728x90
[Python]



Python을 Visual Studio Code에서 개발 환경 세팅 하는 방법 알려드리겠습니다.

 

요즘 파이썬으로 코딩 하는 게 재미있어서 집에서 환경 세팅하고 연습 좀 할려고 합니다

코딩 테스트 하기에도 가장 접근성이 좋은 언어라 앞으로도 배워놓으면 참 좋을 것 같습니다.

 

잘 정리했으니

천천히 따라오시면 됩니다~

 


 

1

 

먼저 파이썬 홈페이지 접속해서 Python을 설치해야 합니다.

 

https://www.python.org/

 

Welcome to Python.org

The official home of the Python Programming Language

www.python.org

 

 

홈페이지에 접근 하시면 자신의 OS 환경에 맞는 것을 선택해주시면 됩니다.

 

 

-

저는 Windows 환경이라 Window 환경으로 다운 받습니다.

 

 

installer 눌러서 다운 받으면 됩니다.

 

그리고 나서 install 해주시면 설치 창이 뜹니다.

 

 

 

/*** Add python.exe to PATH ***/ 이 부분을 추가해주셔야 환경 변수를 추가해주는 겁니다.

 

 

 

Option은 다 선택해주시면 됩니다.

 

 

그리고 파이썬 경로는 편한 곳으로 세팅하는 게 좋습니다.

 

 

그러면 무난하게 파이썬 설치는 다 끝났습니다.


 

2

 

그리고 나서 VS Code 설치를 하도록 하겠습니다.

 

https://code.visualstudio.com/\

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications. Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

vs code에 접근해서 다운로드 해줍니다.

 

 

동의하기~!

 

 

/*** PATH 추가 ***/ 여기도 이 부분을 추가해주셔야 환경 변수를 추가해주는 겁니다.

 

 


 

3

 

VS Code 마켓에서 이제 파이썬을 연동해주시면 됩니다.

 

왼쪽에 있는 확장을 눌러주시면 됩니다.

 

그리고 Python Extension Pack을 설치해주시면 끝납니다.

 

 

그리고 VS Code에서 test.py로 

 

"Hello World!" 테스트 해줍니다.

 

 

설치 끝~

 

감사합니다!

728x90
반응형
728x90

Python을 활용한 웹 크롤링의 모든 것

웹 크롤링은 인터넷 상의 데이터를 자동으로 수집하고 분석하는 작업으로, 데이터 분석, 연구, 비즈니스 인사이트 등에 활용될 수 있습니다.

 

특히 Python은 다양한 라이브러리와 커뮤니티의 지원 덕분에 웹 크롤링을 수행하기에 최적의 언어로 꼽힙니다.

Python을 사용해 웹 크롤링을 시작하는 방법과 핵심 기술을 다루어보겠습니다.

 

 


1. 웹 크롤링의 기본 개념

 

웹 크롤링이란?

웹 크롤링은 프로그램이 웹사이트를 방문해 특정 정보를 추출하는 과정을 의미합니다.

흔히 사용되는 사례로는 상품 가격 비교, 뉴스 데이터 수집, 소셜 미디어 분석 등이 있습니다.

웹 크롤링의 작동 원리

웹 크롤러는 다음과 같은 과정을 따릅니다:

  1. HTTP 요청 보내기: URL을 통해 서버에 요청을 보냅니다.
  2. HTML 응답 받기: 서버로부터 HTML 문서를 수신합니다.
  3. 데이터 파싱: HTML 문서에서 원하는 데이터를 추출합니다.
  4. 저장: 추출한 데이터를 CSV, 데이터베이스 등에 저장합니다.

2. Python의 주요 웹 크롤링 도구

 

1) requests

requests는 HTTP 요청을 보내기 위한 라이브러리입니다. 웹페이지에 접속하여 HTML 문서를 가져오는 데 사용됩니다.

import requests

url = 'https://example.com'
response = requests.get(url)

if response.status_code == 200:
    print(response.text)  # HTML 내용 출력

 

2) BeautifulSoup

BeautifulSoup는 HTML 파싱을 돕는 라이브러리로, 특정 데이터 추출에 유용합니다.

 

from bs4 import BeautifulSoup

html = "<html><body><h1>안녕하세요</h1></body></html>"
soup = BeautifulSoup(html, 'html.parser')

print(soup.h1.text)  # "안녕하세요" 출력
 

3) Selenium

동적인 웹사이트를 크롤링할 때 사용되는 브라우저 자동화 도구입니다. 자바스크립트를 통해 생성된 데이터를 처리할 수 있습니다.

 

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://example.com')

print(driver.page_source)  # 렌더링된 HTML
driver.quit()

 


3. 간단한 웹 크롤링 예제

예제: 네이버 뉴스 헤드라인 가져오기

import requests
from bs4 import BeautifulSoup

url = 'https://news.naver.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

headlines = soup.select('.hdline_article_tit a')  # 네이버 뉴스의 헤드라인 CSS 클래스

for idx, headline in enumerate(headlines, 1):
    print(f"{idx}. {headline.text.strip()}")

 

 

파이썬 코드를 이렇게 작성하면 네이버 헤드라인을 뽑아올 수 있다.

728x90
반응형
728x90

1. 변수와 데이터 타입

Python에서 변수는 데이터를 저장하는 이름입니다. 변수는 값을 할당하고, 그 값을 나중에 다시 사용할 수 있습니다. Python은 변수를 선언할 때 타입을 명시할 필요가 없으며, 변수가 값을 저장하는 순간 타입이 자동으로 정해집니다.

 

변수 선언과 데이터 타입

x = 10          	# 정수형
y = 3.14        	# 실수형
name = "Jee"  		# 문자열형
is_active = True  	# 불리언형 (True 또는 False)

 

변수 출력하기

x = 10
print(x) # 10

 

 

2. 연산자

 

산술 연산자

산술 연산자는 숫자 값을 다룰 때 사용됩니다.

a = 10
b = 5
print(a + b)  	# 덧셈: 15
print(a - b)  	# 뺄셈: 5
print(a * b)  	# 곱셈: 50
print(a / b)  	# 나눗셈: 2.0
print(a // b) 	# 몫: 2
print(a % b)  	# 나머지: 0
print(a ** b)  	# 거듭제곱: 100000

 

 

비교 연산자

비교 연산자는 두 값을 비교하고, 그 결과로 True 또는 False를 반환합니다.

 

a = 10
b = 5
print(a == b)  # 같다: False
print(a != b)  # 같지 않다: True
print(a > b)   # a가 b보다 크다: True
print(a < b)   # a가 b보다 작다: False
print(a >= b)  # a가 b보다 크거나 같다: True
print(a <= b)  # a가 b보다 작거나 같다: False

 

논리 연산자

논리 연산자는 두 개 이상의 조건을 결합할 때 사용됩니다.

 

x = True
y = False
print(x and y)  # 논리곱 (AND): False
print(x or y)   # 논리합 (OR): True
print(not x)    # 논리 부정 (NOT): False

 

 

3. 조건문

조건문은 특정 조건에 따라 프로그램 흐름을 제어할 수 있게 해줍니다.

Python에서 조건문은 if, elif, else를 사용하여 작성합니다.

age = 16
if age >= 18:
    print("성인입니다.")
elif age >= 13:
    print("청소년입니다.")
else:
    print("어린이입니다.")

 

 

4. 반복문

반복문은 어떤 코드를 반복적으로 실행하는 데 사용됩니다.

Python에서는 for문과 while문을 사용하여 반복문을 작성할 수 있습니다.

 

# for문

for i in range(5):  # 0부터 4까지 반복
    print(i)
    
# while문

count = 0
while count < 5:
    print(count)
    count += 1  # count 값 증가
728x90
반응형
728x90



[개발일기] 2024.02.02

개발 시작 한 지 거의 한 달 정도 되어간다.

설계는 끝났고 2일에 한 페이지씩 구현해 나가야 하는 상황이다. 

개발환경 세팅이 끝나고 한 동안 개발하면서 일어난 에러나 query에서는 별다른 문제 없이 진행했으나...

패키지 소스를 리셋하고 업데이트 하는 과정에서 파일이 build 하는 과정에서 꼬인건지 WAS가 안 올라온다.

애초에 build 조차 되지 않는다.

알고보니 pox.xml 과 lib/jar 버전이 충돌해서 일어난 것이였다.

그 부분에서 버전에 맞게 수정해주고 다시 WAS 구동을 해보려 했지만 이번에는 Time out에 걸렸다.

이 부분은 랜선을 통해서 간 후 프록시 서버 요청을 받는데 여기 부분을 막아놔서 Time out에 걸린다고 했다.

여기서 문제를 해결해보기 위해 프로젝트를 한 번 갈아보기도 하고 JDK도 다시 설정해보고 라이브러리 설정도 새로 싹다 갈아봤지만 안 되었다.

결론적으로는 서버 관리 하는 쪽에서 차단을 풀어줘야 되는 걸로...

이토록 실 개발기간 중 개발에 집중할 수 있는 시간을 온전하게 만드는 건 어려운 부분인 것 같다.

항상 느끼는 거지만 IDE 와 친해야 한다... 하나의 IDE를 능숙하게 다뤄야 개발자로써 어려움 없이 일할 수 있는 환경을 만드는 거다.

728x90
반응형

'console.log("What ? " + Cord); > POJECT_DAILY' 카테고리의 다른 글

[개발일기] 2024.01.14  (0) 2024.01.14
[개발일기] 2024.01.11  (0) 2024.01.11
개발자의 일기...230628  (0) 2023.06.28

+ Recent posts

728x90
반응형
728x90
반응형