inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

Join 구문에서 메인 테이블

미해결

[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]

SELECT provider FROM items JOIN ranking on ranking.item_code = items.item_code 여기서 items 위치를 메인 테이블 ranking 위치를 서브 테이블이라고 칭할게요! 메인테이블과 서브테이블을 어떤걸로 해야할지 항상 헷갈려요 기본적으로 보고 싶은 컬럼인 provider가 원래 속한 테이블을 메인에 두려고는 하는데 예제 풀어주시는 걸 보면 아닌 경우도 있어서요! 어차피 테이블을 조인하는거니까 하나의 테이블이 되면 뭐가 메인이 되어도 상관이 없지않나 싶은데.. 메인 테이블 지정하는 기준이 있나요??

  • python
  • sql
  • mysql
  • dbms/rdbms
  • 데이터-엔지니어링
dmsal0544 댓글 1 좋아요 0 조회수 196

셀레니움 headless 옵션 추가시 크롤링 안되는 현상

미해결

[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

안녕하세요. 셀레니움으로 개발된 프로그램을 GUI로 감싸서 만들어 보려고 하고 있습니다. 아래 코드에서 크롬 창이 뜨도록 하면 잘 실행되면 elem에 데이터가 들어옴을 확인할 수 있습니다. 1번을 확인 후 headless 옵션을 주고 실행하면 창은 뜨지 않고 실행되나, 데이터를 가져오지 못합니다. 구글링도 해보고, GPT도 물어봤지만 답을 찾을 수 없어서 문의 드리게 되었습니다. 확인 부탁드립니다. from selenium import webdriver # from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 크롬 드라이버 자동 업데이트을 위한 모듈 from selenium.webdriver.common.by import By # from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver import ActionChains # 스크롤시 사용 from selenium.webdriver.support import expected_conditions as EC import time from bs4 import BeautifulSoup as bts import pandas as pd import os from datetime import datetime ################################### # Window 열고, 네이버 지도에서 검색 ################################### options = webdriver.ChromeOptions() options.add_argument('headless') # service = Service(ChromeDriverManager().install()) # driver = webdriver.Chrome(options=options) driver = webdriver.Chrome() # driver = webdriver.Chrome(ChromeDriverManager().install()) action = ActionChains(driver) keyword = '서울 강남구 정보통신' url = f'https://map.naver.com/p/search/{keyword}' driver.get(url) # WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="searchIframe"]'))) time.sleep(20) search_iframe() elem = driver.find_elements(By.CSS_SELECTOR, '.place_bluelink.C6RjW > span.YwYLL') # 이름 name_list = [e.text for e in elem] elem

  • python
  • 웹-크롤링
초칼라 댓글 2 좋아요 0 조회수 1135

비교연산자와 반복문+조건문 문제 풀이 강의 질문이요.

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

13:05부터 약간 문제풀이가 이해가 안 되어가지구요. 1 2 3 4 5 6 7 8 9 10 int=i sum=0 첫번째 if문 sum+=i*i; i%2 == 1 -> 2로 나누어서 나머지가 1값이 나오면 곱셈하라는 이야기이죠? 그러면 홀수인 1 3 5 7 9는 (1*1, 3*3, 5*5, 7*7, 9*9) 하라는 이야기이네요? 두번재 else 에서는 sum-= i; -> 음수값 붙이라는 이야기인가요? 그러면 짝수는 (-2, -4, -6, -8, -10) 이라는 이야기이네요? 거기서 1 2 3 4 5 6 7 8 9 10 처음 sum 값은 0이니 홀수는 1*1해서 1값이 나온거고 다음 짝수는 첫번째 sum 값인 1*1 에서 -2를 더해서 -1값이 나온거고 그래서 1 2 3 4 5 6 7 8 9 10 1 -1 8 4 29 23 72 64 145 135 (1*1) = 1 {(1*1) = 1} -2 = -1 (3*3)-1 = 8 {(3*3)-1 = 8} -4 = 4 이렇게 순서대로 이해하면 되나요? 이게 맞는건가요? 비전공자라 이해가 잘 안되서 여쭙니다. 감사합니다.

  • python
  • java
  • c
  • 정보처리기사
tjdgusl1987 댓글 1 좋아요 0 조회수 106

시간초과를 자력으로 해결하지 못했습니다 😓

해결됨

세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)

안녕하세요, 강의를 듣고 계신 여러분! 여러분의 학습을 돕기 위해 질문 안내를 드리고자 합니다. 1. chatGPT를 이용해보기 단순한 의문은 chatGPT를 이용해도 해답을 찾을 수 있는 경우가 종종 있습니다! 2. 강의의 어떤 부분에 대한 질문이고, 어떤 부분이 궁금한지 명확히 알려주세요! 강의의 어느 파트에서 의문을 느끼고, 어떤 부분이 궁금한지 를 명확히 제시해 주시면 답변에 도움이 됩니다! 자신은 어떻게 이해했는지 또한 적어주면 좋습니다! ex) 섹션5의 '그래프 순회 (DFS & BFS) [개념]' 강의 에서 DFS와 BFS 모두 그래프의 모든 노드를 탐색하는 알고리즘이라고 하셨고 시간 복잡도 또한 똑같다고 이해 했습니다. 그러면 DFS와 BFS 중에서 어떤 알고리즘이 더 효율적인지 구별하는 것은 의미가 없는 것일까요? 어느 파트 섹션5의 '그래프 순회 (DFS & BFS) [개념]' 강의 자신은 어떻게 이해했는지 DFS와 BFS 모두 그래프의 모든 노드를 탐색하는 알고리즘이라고 하셨고 시간 복잡도 또한 똑같다고 이해 어떤 부분이 궁금한지 DFS와 BFS 중에서 어떤 알고리즘이 더 효율적인지 구별하는 것은 의미가 없는 것일까요? 안녕하세요. 선생님. 저번 설명과 조언 너무 감사합니다. 그,, 백준 2580 스도쿠에 관한 질문인데요, 시간 초과를 해결하지 못하였는데, 각각을 보면 그렇게까지 시간이 많이 들지는 않을 거 같다는 생각도 들구.. 재귀를 사용하지는 않았지만, 어디서 시간이 많이 걸리는 지 분석이 안되어서요.. 선생님 도움이 필요해서 질문 남깁니다.. arr = [list(map(int, input().split())) for _ in range(9)] # 스도구 문제 배열 idxs = [] # 인덱스 쌍을 담는 배열 for i in range(9): for j in range(9): if not arr[i][j]: idxs.append((i,j)) def fillHori(y, x): # 가로 nums = 45 # 1~9까지의 합 for i in range(9): if x == i: continue # 자기 자신 탐색 제외 if arr[y][i] == 0: return 0 # 0이 또 있으면 채울 수 없음 nums -= arr[y][i] return nums def fillVerti(y, x): #세로 nums = 45 # 1~9까지의 합 for i in range(9): if y == i: continue # 자기 자신 탐색 제외 if arr[i][x] == 0: return 0 # 0이 또 있으면 채울 수 없음 nums -= arr[i][x] return nums def fillSquare(y, x): #사각형 nums = 45 # 1~9까지의 합 for i in range(y // 3 * 3, y // 3 * 3 + 3): for j in range(x // 3 * 3, x // 3 * 3 + 3): if y == i and x == j: continue # 자기 자신 탐색 제외 if arr[i][j] == 0: return 0 # 0이 또 있으면 채울 수 없음 nums -= arr[i][j] return nums def fillCrossDown(y, x): # 대각선(안씀) nums = 45 # 1~9까지의 합 for i in range(9): for j in range(9): if y == i and x == j: continue # 자기 자신 탐색 제외 if arr[i][j] == 0: return 0 # 0이 또 있으면 채울 수 없음 if y - x == j - i: nums -= arr[i][j] return nums def fillCrossUp(y, x): # 대각선(안씀) nums = 45 # 1~9까지의 합 for i in range(9): for j in range(9): if y == i and x == j: continue # 자기 자신 탐색 제외 if arr[i][j] == 0: return 0 # 0이 또 있으면 채울 수 없음 if y + x == j + i: nums -= arr[i][j] return nums while idxs: for i, j in idxs: n = fillHori(i, j) if n: arr[i][j] = n; idxs.remove((i,j)); continue n = fillVerti(i, j) if n: arr[i][j] = n; idxs.remove((i,j)); continue n = fillSquare(i, j) if n: arr[i][j] = n; idxs.remove((i,j)); continue n = fillCrossUp(i, j) if n: arr[i][j] = n; idxs.remove((i,j)); continue n = fillCrossDown(i, j) if n: arr[i][j] = n; idxs.remove((i,j)) for a in arr: for i in a: print(i, end = ' ') print()

  • python
  • 코딩-테스트
  • 알고리즘
zhu 댓글 2 좋아요 0 조회수 231

머신러닝 - surprise 모듈 설치 오류

미해결

파이썬 무료 강의 (활용편7) - 머신러닝

프로젝트 단계에서 surprise 모듈을 설치할 수가 없어요. !pip install scikit-surprise 이후에 출력된 내용 중 하단에 다음과 같이 오류 메시지가 뜹니다. note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for scikit-surprise ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (scikit-surprise) 어떤 문제인지, 어떻게 해결해야 하는지 궁금합니다.

  • python
  • 머신러닝
  • anaconda
  • scikit-learn
서승아 댓글 1 좋아요 0 조회수 384

포인터 강의와 더불어서 24년2회 기출문제 swap 낚시문제 질문있어요

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

29분 포인트 강의를 보다보니 24년2회 swap 낚시문제가 떠올라서 질문드립니다. void swap(){ int temp; temp =a; a = b; b = temp; } int main(){ int a = 11; int b = 19; swap(); 기출2회 일부 추출인데요.. 해당 스왑부분을 보면 포인터변수를 준 것 외엔 차이가 없어 보입니다. 위 기출의 경우엔 왜 스왑이 될 수 없는지 부연설명이 있으면 이해가 빠를 것 같아요! (스왑 함수에서 temp값에 a넣어주고 a에 b를 대입하고.. 포인터변수 외엔 차이를 못느끼겠습니다.)

  • python
  • java
  • c
  • 정보처리기사
주서 댓글 1 좋아요 0 조회수 278

쿠버네티스 최신상태 저장 방법

미해결

쿠버네티스 어나더 클래스-Sprint 1, 2 (#실무기초 #설치 #배포 #Jenkins #Helm #ArgoCD)

안녕하세요, 쿠버네티스 강의 듣고, 관심있는 솔루션을 쿠버네티스로 배포하면서 궁금한게 생겼습니다. 쿠버네티스에 A라는 솔루션을 배포하고 나서, 해당 pod에 직접들어가서 설정을 바꾸고 필요에 따라 특정 패키지를 설치하는 등의 작업을 했습니다. 그리고 나서 쿠버네티스를 띄운 PC가 정지가되서 다시 PC를 부팅하고 쿠버네티스에 들어가 보니 처음배포한 상태로 running이 됩니다. 최근상태로 pod를 저장했다가 다시 그 상태로 올릴 수는 없는건가요?

  • kubernetes
  • infrastructure
  • container
realzion00 댓글 1 좋아요 1 조회수 118

Dockerfile과 커밋방식에 대해 질문 있습니다.

해결됨

개발자를 위한 쉬운 도커

"COPY 빌드컨텍스트경로 레이어경로" 여기서 레이어 경로는 어떻게 구성되어 있는지 알 수 있나요? 강의 내용중에 "커밋 방식을 사용하면 기존 레이어에 새로운 레이어를 한 장 더 추가할 수 있다." 라고 했는데 추가된 새로운 레이어는 읽기 전용 레이어 인가요?

  • docker
  • 가상화
  • ci/cd
  • docker-compose
  • github-actions
  • docker-volume
  • docker-image
  • container
capstonefittrip 댓글 2 좋아요 1 조회수 245

copy-on-write 전략에 대해 추가 질문 있습니다.

해결됨

개발자를 위한 쉬운 도커

안녕하세요 전에 copy-on-write 전략에 대해 질문을 했는데 추가 질문이 있어 질문글을 작성합니다. https://www.inflearn.com/community/questions/1307477/copy-on-write-%EC%A0%84%EB%9E%B5%EC%97%90-%EB%8C%80%ED%95%B4-%EC%A7%88%EB%AC%B8-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4 위 질문 글에서 2번 부분에 대해 추가 질문이 있습니다. 읽기/쓰기 레이어에서 index.html 파일을 여러번 수정하는 경우에 대해서 궁금한 부분이 있습니다. 완전 처음에는 얘기 해주신대로 읽기/쓰기는 텅 비어 있는 상태라 읽기 레이어의 index.html 파일을 그대로 복사해 와서 바뀐 부분만 있으면 수정한 후 사용합니다. 여기서 읽기/쓰기 index.html 파일이 한번 더 수정이 되면 읽기 레이어의 index.html 파일을 복사해 와서 기존에 있는 읽기/쓰기 레이어에서의 index.html 파일에서 바뀐 부분만 복사해온 index.html 파일에서 변경한 후 사용하는건가요? 정리하면 읽기/쓰기 index.html 파일을 여러번 수정해도 복사해서 가져오는 부분은 항상 읽기 index.html 파일이고 기존 읽기/쓰기 index.html 파일에서 바뀐 부분을 읽기 레이어에서 가져온 index.html 파일에 넣어서 만드는 건지 궁금합니다.

  • docker
  • 가상화
  • ci/cd
  • docker-compose
  • github-actions
  • docker-volume
  • docker-image
  • container
capstonefittrip 댓글 2 좋아요 1 조회수 181

인스턴스 타겟그룹 등록 언헬시

미해결

AWS로 쉽고 빠르지만 아주 견고한 서버 환경을 구축하는 방법

인스턴스 만들때 라우팅 테이블 어떻게 설정 되어 있나요 nat랑 연결되어있나요?

  • aws
  • docker
  • msa
  • container
  • ecs
  • fargate
댓글 2 좋아요 0 조회수 206

IP Field와 AccessLog 관련

해결됨

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)

질문을 온전히 이해할 수 있도록, 모든 맥락을 전달해주세요. 질문은 질문자가 번거로워야 보다 좋은 답변을 얻으실 수 있습니다. 시행착오를 알려주시면 곧바로 원하는 문제에 집중할 수 있습니다. 오류 메시지는 일부만 알려주시기보다 전체 오류 메시지를 캡처해서 주시면, 오류 파악에 도움이 됩니다. 당신의 파이썬/장고 페이스메이커가 되겠습니다. ;-) 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. Q1 7-01 02 강의에서 ipv4address custom field를 생성하셨는데요 8-20 강의 같이 이후에는 그냥 Django GenericIPAddressField를 사용셨습니다. 7-01 02강의는 그냥 custom 필드를 보여주기 위한 예시이고 그냥 장고에서 제공해주는 IP 필드를 사용하면 되는건가요? 아니면 차이점이 존재하는 건가요? Q2 제가 제작한 사이트의 사용량 집계를 위해 로그를 얻으려고 합니다. class AccessLog(models.Model): request = models.URLField() time = models.DateTimeField(auto_now=True) user = models.ForeignKey(User, on_delete=models.CASCADE, null=True) ip = models.GenericIPAddressField() 상기와 같은 모델을 작성하여 request가 client로 날라올 때마다 db에 쌓아나가는게 맞을까요? 아니라면 logger를 이용하는게 맞을까요?

  • react
  • python
  • django
  • web-api
  • htmx
pplkjh2 댓글 1 좋아요 0 조회수 142

early_stopping_rounds,eval_metric 오류 관련 질문있습니다.

미해결

[개정판] 파이썬 머신러닝 완벽 가이드

분류 강의 위스콘신 유방암 예측 실습강의 코드입니다. from xgboost import XGBClassifier xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.05, max_depth=3) evals = [(X_tr, y_tr), (X_val, y_val)] xgb_wrapper.fit(X_tr, y_tr, early_stopping_rounds=50, eval_metric="logloss", eval_set=evals, verbose=True) ws50_preds = xgb_wrapper.predict(X_test) ws50_pred_proba = xgb_wrapper.predict_proba(X_test)[:, 1] --------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[36], line 5 3 xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.05, max_depth=3) 4 evals = [(X_tr, y_tr), (X_val, y_val)] ----> 5 xgb_wrapper.fit(X_tr, y_tr, early_stopping_rounds=50, eval_metric="logloss", 6 eval_set=evals, verbose=True) 8 ws50_preds = xgb_wrapper.predict(X_test) 9 ws50_pred_proba = xgb_wrapper.predict_proba(X_test)[:, 1] File ~\anaconda3\Lib\site-packages\xgboost\core.py:726, in require_keyword_args.<locals>.throw_if.<locals>.inner_f(*args, **kwargs) 724 for k, arg in zip(sig.parameters, args): 725 kwargs[k] = arg --> 726 return func(**kwargs) TypeError: XGBClassifier.fit() got an unexpected keyword argument 'early_stopping_rounds' 위 코드를 입력하였을때 이러한 오류가 뜨는데 무엇이 원인인지 잘모르겠습니다. Xgboost 버전은 2.1.0이고 파이썬버전같은경우는 3.1.1입니다. 아래는 인터넷에 검색하여 찾아낸 방법으로 입력한 코드입니다 from xgboost import XGBClassifier xgb_wrapper=XGBClassifier(n_estimators=400,learning_rate=0.05,max_depth=3,early_stopping_rounds=50,eval_metric="logloss") evals=[(X_tr,y_tr),(X_val,y_val)] xgb_wrapper.fit(X_tr,y_tr, eval_set=evals,verbose=True) ws50_preds=xgb_wrapper.predict(X_test) ws50_pred_proba=xgb_wrapper.predict_proba(X_test)[:,1] 아래는 위 코드에 대한 결과값입니다. 오차 행렬 [[35 2] [ 2 75]] 정확도: 0.9649, 정밀도: 0.9740, 재현율: 0.9740, F1: 0.9740, AUC:0.9961 아래는 책에 있는 코드를 입력하였을때의 결과값입니다. 오차 행렬 [[35 3] [ 2 75]] 정확도: 0.9561, 정밀도: 0.9615, 재현율: 0.9740, F1: 0.9677, AUC:0.9933 제 생각에는 버전차이에 따른 문제같은데 수정된 코드를 사용하였을때 결과값은 도출되지만 기존 강의에서 사용하신 코드의 결과값과는 다릅니다. 수정된 코드를 그대로 사용하는게 맞을지 아니면 다른 방법이 있는지 궁금합니다.

  • python
  • 머신러닝
  • 통계
김정구 댓글 1 좋아요 0 조회수 1476

배열길이 부분에 질문있어요

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

8:29초 부분입니다. b=a[:3] 이면 배열주소 0123을 출력하는게 아니라 3까지(012) 라고 봐야하는건가요? c=a[4:6]도 마찬가지로 45까지만 출력하는건가요?

  • python
  • java
  • c
  • 정보처리기사
주서 댓글 1 좋아요 0 조회수 220

djlint 편집시 무한 동작

미해결

파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편

사진과 같이 편집할 때 마다 djlint가 계속 검사합니다ㅠㅠ black은 처음엔 그러다가 자동 저장 설정 변경한 뒤부터 안 그러는데 djlint의 경우는 자동저장을 바꾸고 감시기 설정 체크 모두 해제해도 1바이트의 글자만 입력해도 자동 감시를 시작하는군요ㅠㅠ 혹시 아시는 바가 있을까요... 지피티가 해결을 못 해주어서 1시간이 넘게 고생하는 중입니다ㅠㅠ...

  • python
  • django
KANG HOJUN 댓글 1 좋아요 0 조회수 149

수업 때 쓰셨던 txt file 공유 해주시면 좋겠습니다

해결됨

실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지

나라 이름, 도시 같은 것들은 영상 아래 강의 노트에서 복붙할 수 있으면 좋겠네요 원활한 답변을 위해, 자세한 질문 사항 부탁드려요 :D

  • python
  • 알고리즘
minsu2587 댓글 1 좋아요 1 조회수 189

강의 자료 다운로드 자료요청

미해결

평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자

안녕하세요. 저도 강의자료를 다운로드하면 압축파일에 requirement.txt 파일만 나오고 다른 파일들은 보이지 않습니다. 앞에서 문의한 분처럼 저도 이메일로 보내주시면 감사하겠습니다. kimv100@gmail.com 감사합니다.

  • python
  • pandas
  • 투자
  • 퀀트
김승백 댓글 2 좋아요 0 조회수 235

업캐스팅 강의 마지막 예제 관련 질문입니다.

해결됨

(2026 최신!) 일주일만에 합격하는 정보처리기사 실기

내가 나를 낳은 형태에서 예제와 같이 special draw를 호출하면 오류가 나지 않을까요??

  • python
  • java
  • c
  • 정보처리기사
유호영 댓글 2 좋아요 0 조회수 142

ECS Fargate 배포후 504 time-out

미해결

AWS로 쉽고 빠르지만 아주 견고한 서버 환경을 구축하는 방법

안녕하세요, 회사에서 GCP에서 AWS로 인프라를 이관 중에 있습니다. 강의를 들으면서 개발 서버를 이관했고 ECS에 서비스를 작동 중입니다. 하지만, Deploy는 Failed 하고 504 timeout-error가 발생하면서 ALB의 IP들도 모두 unhealthy 상태입니다. 이상한 점은 ECS에서 서비스 로그를 확인하면 스케줄러로 등록해뒀던 작업들이 실행되는 로그를 확인할 수 있습니다. 이로 미루어 볼때 서버는 실행이 되고 있는 상태이나 외부에서 접근이 안되는 것 같아 security-group 과 vpc 설정, 포트도 확인을 해봤었는데요. 그래도 해결을 못하고 있어서 이렇게 질문 남겨 둡니다. ㅠㅠ ALB Resource map 2. ECS service 상태 서비스 이벤트 로그 service has started 1 tasks: task ******* Amazon ECS replaced 1 tasks due to an unhealthy status. service registered 1 targets in target-group ***** service port 3000 is unhealthy in target-group *** due to (reason Health checks failed). service deployment *** deployment failed: tasks failed to start.

  • aws
  • docker
  • msa
  • container
  • ecs
  • fargate
hk 댓글 2 좋아요 0 조회수 504

다음 강의로 넘어 가지를 않습니다.

미해결

김대리님 이게 바로 업무 자동화입니다 (엑셀 + 파이썬)

혹시, 하루에 들을 수 있는 강의 수가 정해져 있는지요? 4번째 강의(회사별 행 끊어내기) 강의가 끝난 후 아래 이미지의 "다음 수업보기"를 클릭해도 강의가 진행되지 않습니다. (4번째 강의 듣는 것만 3~4번 해봤는데 그 이후에 역시 안됩니다.) 그리고 이상한 것은 아래 이미지 처럼 제가 듣지 않은 강의가 체크 되어 있습니다. (심지어 마지막 강의도 체크되어 있네요.) 강의를 계속 들으려면 어떻게 해야 하는지 방법 부탁 드립니다.

  • python
  • excel
김동근 댓글 3 좋아요 0 조회수 248

인기 태그

인프런 TOP Writers

주간 인기글