[Linux]부트캠프 - 파일 및 폴더 생성
파일 및 폴더 생성
JSON이란?(참고) : https://www.json.org/json-en.html
robots.txt
검색 로봇에게 사이트 및 웹페이지를 수집할 수 있도록 허용하거나 제한하는 것
네이버
www.naver.com/robots.txt
그러면 파일 하나가 보일 것인데 확인해보면 이러한 내용이 적혀져있다.
User-agent: *
Disallow: /
Allow : /$
User-agent: *
: 지금 홈페이지에 접속하는 대상, *
은 모두를 대상으로 잡음
Disallow: /
: 루트부터 허용하지 않음
Allow: /$
: 시작화면만 허용공공데이터포털
https://www.data.go.kr/robots.txt
User-agent: *
#DaumWebMasterTool:4978f9b94e10dbe5672e5aab80f8868382a8d6b2319a391dc7904bd20ced54f9:mgC7BXBG6UtCrUlKPK7+eA==
BeautifulSoup4 : https://www.crummy.com/software/BeautifulSoup/bs4/doc/
xml.etree : https://docs.python.org/3/library/xml.etree.elementtree.html?highlight=xml%20etree
PyPi : https://pypi.org/
conda create -n mycrawling pyhon==3.9
pip install beautifulsoup4
프로젝트에 naver 폴더 생성 후 movies.py 생성
movies.py에 내용 작성
모듈 호출
from bs4 import BeautifulSoup
import urllib.request
# 해당 url에 요청
# resp는 텍스트로 이루어져있다.
resp = urllib.request.urlopen('https://movie.naver.com/movie/running/current.naver#')
print(resp)
실행 해보면 응답한 객체가 반환된다.
<http.client.HTTPResponse object at 0x0000018EABB4CBE0>
# 응답된 문서를 파이썬의 내장 paser를 이용해 pase tree를 생성
soup = BeautifulSoup(resp, 'html.parser')
print(soup)
개발자도구를 사용해 영화 제목을 보면 <a>
태그 안에 내용이 작성되어 있다.
이것들은 클래스가 “lst_dsc”인 <dl>
태그로 묶여있다.
클래스와 태그네임을 활용해 불러오자.
movies = soup.find_all('dl', class_='lst_dsc')
0번지를 확인해보자
print(movies[0])
<dl>
태그 하나의 내용을 확인할 수 있을 것이다.그러면 목록에 있는 모든 영화의 제목과 별점을 가져오자.
제목과 별점을 갖고 있는 태그와 그들이 갖고 있는 속성(클래스, 네임)등 을 잘 관찰해야한다.
for movie in movies:
# 제목
title = movie.find('a').get_text()
# 별점
star = movie.find('span', class_='num').text
print(f'{title} [{star}]')
.find()
는 해당 태그의 첫번째 태그만 가져온다.
.get_text()
나 .text
를 사용해주면 된다.결과
나일 강의 죽음 [8.00]
킹메이커 [7.47]
355 [8.56]
해적: 도깨비 깃발 [6.24]
극장판 안녕 자두야: 제주도의 비밀 [8.98]
미싱타는 여자들 [9.25]
스파이더맨: 노 웨이 홈 [8.87]
만년이 지나도 변하지 않는 게 있어 [8.00]
씽2게더 [9.43]
가슴이 떨리는 건 너 때문 [10.00]
듄 [7.96]
해탄적일천 [8.23]
어나더 라운드 [8.25]
효자 [9.51]
드라이브 마이 카 [8.56]
경관의 피 [7.38]
하우스 오브 구찌 [7.93]
애니멀 체인지 [0.00]
해리 포터와 불사조 기사단 [7.03]
프리! 더 파이널 스트로크 전편 [9.26]
.
.
.
requests 설치
pip install requests
naver 폴더 안에 webtoons.py 생성
# -*- coding:utf-8 -*-
모듈 호출
from bs4 import BeautifulSoup
import requests
import json
내용
# 수요웹툰 주소를 url 저장
url = 'https://comic.naver.com/webtoon/weekdayList?week=wed'
# url을 get방식으로 요청해 응답 받은 객체를 resp에 저장
resp = requests.get(url)
# 응답된 문서를 파이썬의 내장 paser를 이용해 pase tree를 생성
soup = BeautifulSoup(resp.text, 'html.parser')
페이지에서 개발자도구를 사용해보면 class
가 img_list
인 <ul>
로 묶여있는 것을 확인할 수 있다.
# class='img_list'인 <ul>을 찾아서 webtoons에 저장
webtoons = soup.find('ul', {'class': 'img_list'})
그 다음 제목과 별점이 담긴 <dl>
태그를 가져와야한다.
# .select는 파이썬에서 사용하는 css선택자
dl_list = webtoons.select('dl')
제목은 <dl>
태그 하위의 <dt>
태그 하위의 <a>
태그의 ‘title’속성에 적혀있다.
별점은 <dl>
태그 안에 <strong>
태그가 갖고 있는 텍스트 콘텐츠에 있다.
반복문을 사용해 값 가져오기
lst = list()
for dl in dl_list:
# 각 <dl>안의 <a>태그를 찾아 <a>태그의 title 속성값을 가져와 title에 저장
title = dl.find('a')['title']
# 각 <dl>안의 <strong>태그를 찾아 텍스트값을 가져와 star에 저장
star = dl.find('strong').text
# tmp란 딕셔너리자료 생성
tmp = dict()
# {'title': title}
tmp['title'] = title
# {'star': star}
tmp['star'] = star
# tmp는 {'title': '쇼미더럭키짱!', 'star': '9.28'} 이런 형태를 갖고 있을 것이다.
# lst에 append 해준다.
lst.append(tmp)
print(lst)
print(lst)의 출력 결과는 이렇다.
[{'title': '쇼미더럭키짱!', 'star': '9.28'}, {'title': '전지적 독자 시점', 'star': '9.97'}, {'title': '화산귀환', 'star': '9.96'}, {'title': '헬퍼 2 : 킬베로스', 'star': '8.93'}, ...]
크롤링한 데이터들을 json 파일로 저장해보자.
res = dict()
res['webtoons'] = lst
print(res)
로 확인해보면 다음과 같이 출력된다.
{'webtoons': [{'title': '쇼미더럭키짱!', 'star': '9.28'}, {'title': '전지적 독자 시점', 'star': '9.97'}, {'title': '화산귀환', 'star': '9.96'}, ... ,...]}
json 형식으로 변환해보자.
.dumps()
메소드는 python의 객체를 JSON 문자열로 반환해주는 메소드다.
res_json = json.dumps(res, ensure_ascii=False)
enusure_ascii=False
속성은 한글 문자 같은 것들이 아스키코드로 인코딩 되는 것을 방지하는 역할을 한다.
만약 False로 값을 두지 않을 때 출력하면 이렇게 나오게 된다.
{"webtoons": [{"title": "\uc1fc\ubbf8\ub354\ub7ed\ud0a4\uc9f1!", "star": "9.28"}, {"title": "\uc804\uc9c0\uc801 \ub3c5\uc790 \uc2dc\uc810", "star": "9.97"}, ... ]}
속성을 False로 설정하고 print(res_json) 해보자.
{"webtoons": [{"title": "쇼미더럭키짱!", "star": "9.28"}, {"title": "전지적 독자 시점", "star": "9.97"}, {"title": "화산귀환", "star": "9.96"}, ..]}
이제 json 파일을 만들 수 있다.
with open('webtoons.json', 'w', encoding='utf-8') as f:
f.write(res_json)
webtoons란 json 파일을 생성하고 인코딩은 utf-8로 설정한다.
res_json
을 적어준다.확인
openApi란?
공공데이터포털 사이트를 이용해 크롤링 연습을 해보자.
우선 교육을 검색해 파일데이터로 간다.
그리고 5페이지로 가본다.
주소를 분석해보자.
https://www.data.go.kr/tcs/dss/selectDataSetList.do?dType=FILE&keyword=%EA%B5%90%EC%9C%A1
&detailKeyword=
&publicDataPk=
&recmSe=N&detailText=
&relatedKeyword=
&commaNotInData=
&commaAndData=
&commaOrData=
&must_not=
&tabId=
&dataSetCoreTf=
&coreDataNm=
&sort=
&relRadio=
&orgFullName=
&orgFilter=
&org=
&orgSearch=
¤tPage=5
&perPage=10
&brm=&instt=
&svcType=
&kwrdArray=
&extsn=
&coreDataNmArray=
&pblonsipScopeCode=
뒤에 값들이 없는 것은 사실상 지워줘도 된다 그러면
https://www.data.go.kr/tcs/dss/selectDataSetList.do?dType=FILE&keyword=%EA%B5%90%EC%9C%A1
¤tPage=5
이렇게만 남길 수 있다.
이제 우리는 목록에 존재하는 제목들을 가져올 것이다.
openapi 폴더 생성
openapi 폴더에 crawling_loop.py 생성
모듈 호출
from bs4 import BeautifulSoup
import requests
내용
url='https://www.data.go.kr/tcs/dss/selectDataSetList.do?dType=FILE&keyword=%EA%B5%90%EC%9C%A1¤tPage=5'
resp = requests.get(url)
# 응답받은 객체의 내용들을 html형식으로 구문분석을해서 soup에 저장
soup = BeautifulSoup(resp.text, 'html.parser')
개발자도구로 어떤형식인지 확인
클래스가 title인 span을 가져와야한다.
titles = soup.find_all('span', class_='title')
그리고 반복문을 사용해 title들의 텍스트 콘텐츠를 출력
for title in titles:
print(title.text.strip())
# 공백이 너무 많아 strip()으로 공백 제거
한국인터넷진흥원_교육영상자막신
한국인터넷진흥원_교육영상자막
아시아문화원_교육프로그램
인천광역시_교육통계
주택도시보증공사 교육정보
한국산업기술평가관리원 교육정보
국가철도공단_교육정보
한국산업은행_교육정보
한국보건의료연구원 교육정보
대구광역시교육청_교육통계연보
지금 이 과정은 5페이지의 제목들만 가져온 것인데, 1부터 10페이지 까지의 제목들을 가져와보자.
우선 페이지의 요소를 확인해보자
<nav>
태그 하위의 <a>
들에 텍스트컨텐츠로 담겨져있다.리스트를 만들고 a태그들을 가져와보자.
lst = list()
# class='pagination'의 하위의 a들을 모두 선택
pages = soup.select('.pagination a')
반복문을 사용해 처음페이지, 이전페이지, 다음페이지, 마지막페이지
를 제외시킨 값을 lst 리스트에 추가해주자.
for page in pages:
if len(page.text) <= 2:
lst.append(page.text)
page는 각 <a>
태그를 뜻한다. 그 <a>
태그들의 텍스트컨텐츠의 길이가 2와 같거나 작다면 lst에 텍스트컨텐츠를 추가해준다.
len()
을 사용하지 않고 .isdigit()
을 사용하면 페이지 수가 100과 같이 세 자리 수가 넘어가도 사용할 수 있을 것 같다.그러면 lst에는 다음과 같이 값이 저장이 되있을 것이다.
['1', '2', '3', '4', '6', '7', '8', '9', '10']
그러면 이제 url 주소의 currentPage 속성을 바꿔 1~10 페이지의 제목들을 출력해보자.
for i in lst:
# f-string을 사용해 페이지를 바꿔줌
url = f'https://www.data.go.kr/tcs/dss/selectDataSetList.do?dType=FILE&keyword=%EA%B5%90%EC%9C%A1¤tPage={i}'
resp = requests.get(url)
soup = BeautifulSoup(resp.text, 'html.parser')
titles = soup.find_all('span', class_='title')
for title in titles:
print(title.text.strip())
lst안의 요소들을 반복한다. 1,2,3,4,5..,10 이렇게 담겨져 있기 때문에 i값을 currentPage={i}에 담아준다.
공공 데이터 포털의 ‘공공데이터활용지원센터_보건복지부 코로나19 시·도발생 현황’ 데이터를 활용할 것이다.
미리 데이터를 사용할 것이라고 신청해놓고 승인 받으면 데이터를 사용할 수 있다.
EndPoint는 root라고 생각해주면 된다.
서비스URL 이 URL 주소다.
일반 인증키[Encoding] 가 service_key 다.
요청 변수와 출력결과는 여기서 확인
openapi 폴더에 covid.py 생성 후 내용 작성
모듈 호출
from xml.etree import ElementTree
import requests
xml.etree
는 파이썬의 내장함수
내용
service_key = '신청해 받은 일반 인증키(Encoding)를 붙여주세요~~'
url = f'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19SidoInfStateJson?ServiceKey={service_key}'
url에 서비스URL을 붙여넣고 요청변수의 서비스키를 추가해준다. 요청변수를 추가해줄때는 ?
을 붙여줘야한다.
SerivceKey={}
print해서 실행 하면 링크가 하나 뜬다. 눌러보면 xml문서를 확인할 수 있다.
여기서 오늘 총 확진자를 구해줄 것이다.
<item>
<createDt>2022-02-09 10:38:16.257</createDt>
<deathCnt>6943</deathCnt>
<defCnt>1131239</defCnt>
<gubun>합계</gubun>
<gubunCn>合计</gubunCn>
<gubunEn>Total</gubunEn>
<incDec>49567</incDec>
<isolClearCnt>719627</isolClearCnt>
<localOccCnt>49402</localOccCnt>
<overFlowCnt>165</overFlowCnt>
<qurRate>2191</qurRate>
<seq>15001</seq>
<stdDay>2022년 02월 09일 00시</stdDay>
<updateDt>null</updateDt>
</item>
xml형태의 문서를 문자열로 응답받아보자.
resp = requests.get(url)
xml형태의 문자열을 가지고 parse tree를 만들어 준다.
tree = ElementTree.fromstring(resp.text)
반복문을사용해 <gubun>
태그들의 텍스트를 가져올 수 있다.
for item in tree[1][0]:
print(item.find('gubun').text)
검역
제주
경남
경북
전남
전북
충남
충북
강원
경기
세종
울산
대전
광주
인천
대구
부산
서울
합계
tree[1][0]
은 body > items
를 가리킨다.(tree가 <response>
를 뜻한다.)이제 오늘의 확진자 합계수(국내,해외 포함)을 출력해보자.
모듈 호출
import re
내용
for item in tree[1][0]:
if item.find('gubun').text == '합계':
stdDay = re.sub(r'(\D)+', '', item.find('stdDay').text)
stdDay = stdDay[2:4] + "/" + stdDay[4:6] + "/" + stdDay[6:8]
incDec = item.find('incDec').text
localOccCnt = item.find('localOccCnt').text
overflowCnt = item.find('overFlowCnt').text
print(f'[{stdDay}]')
print(f"일일합계:{incDec}")
print(f"국내발생:{localOccCnt}")
print(f"해외발생:{overflowCnt}")
출력 결과
[22/02/09]
일일합계:49567
국내발생:49402
해외발생:165
인스타그램의 검색창에서 원하는 태그를 검색해 이미지들의 주소(src)를 크롤링 해보자.
https://www.instagram.com/explore/tags/검색할태그
주소를 이용한다.
검색할 태그에 python이라고 적어놨고, 이미지가 담겨있는 <div>
태그를 확인하니 class='KL4Bh'
였다.
프로젝트에 insta라는 폴더를 생성하고 insta01.py라는 파일을 생성했다.
insta01.py
생성
모듈
from bs4 import BeautifulSoup
import requests
내용
tag = input('search tags: ')
url = f'https://www.instagram.com/explore/tags/{tag}'
resp = requests.get(url)
soup = BeautifulSoup(resp.text, 'html.parser')
print(soup.find('div', class_='KL4Bh'))
검색할 내용을 tag에 입력받아준다.
f-string을 이용해 입력받은 값을 경로에 추가해서 url에 받아준다.
url에 대한 요청을 문자열로 응답받아서 resp에 저장해준다.
응답받은 객체의 내용(.text
)을 'html.parser'
를 이용해 html문서형태로 분석해준다.
class='KL4Bh'
인 <div>
태그들을 가져와서 출력한다.실행해보면, None값이 나올 것이다. 왜 아무것도 가져오지 못할까?
인스타그램의 페이지는 클라이언트에서 서버에 요청할 때, 서버에서는 정해진 형태만 렌더링하고 응답하는 중간에서 클라이언트에서 요청한 값을 CSR 하는 시스템 같다.
그래서 실질적으로 가져오는 것이 원하는 데이터들이 아닌, 빈 껍데기이기 때문에 아무 값도 얻을 수 없는 것이라고 추측된다.
이럴 경우 Selenium을 활용하면 렌더링이 완료된 상태에서 코드를 가져오면 문제를 해결할 수 있다.
프로젝트에 drivers라는 폴더 생성 후 압축 풀은 파일 복붙
터미널로 이동 후 셀레니움 설치
pip install selenium
insta02.py
생성
모듈 호출
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
내용
tag = input('search tags: ')
url = f'https://www.instagram.com/explore/tags/{tag}'
# 다운 받은 webdriver를 가져와
service = webdriver.chrome.service.Service('../drivers/chromedriver.exe')
# 경로를 설정해주고, 브라우저를 자동으로 실행하는 명령을 driver에 저장해준다.
driver = webdriver.Chrome(service=service)
# 3초 기다렸다가 url 가져오기
driver.implicitly_wait(3)
driver.get(url)
# 현재 렌더링된 화면의 코드를 가져와서 html구문으로 분석
soup = BeautifulSoup(driver.page_source, 'html.parser')
# class가 KL4Bh인 div태그들을 찾아서 img_list에 저장
img_list = soup.find_all('div', class_='KL4Bh')
for img in img_list:
print(img)
지금 결과를 적고 싶었지만, 인스타그램에서 접속에 제한을 걸어놓아서 데이터는 가져오지 못했다.
.page_source
를 사용할 수 있기 때문이다.이번엔 셀레니움을 이용해 id, password를 자동으로 적고 로그인까지 해주는 실습을 해보자.
insta03.py
생성
모듈 호출
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
인스타그램 로그인 창에서 속성 확인
id=loginForm
인 <form>
태그 하위 <div>
태그의 하위 3번째 <div>
태그#loginForm > div > div:nth-child(3)
input()
을 사용해 아이디와 비밀번호 값을 입력받자.
input_id = input('id 입력 : ')
input_pw = input('pw 입력 : ')
인스타그램 로그인 페이지에서 가서 주소를 복사한뒤 자동으로 로그인화면이 띄워지게 만들자.
service = webdriver.chrome.service.Service('../drivers/chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.get('https://www.instagram.com/accounts/login/')
sleep(5) # 5초간 대기
화면을 띄우고 아이디와 비밀번호가 입력되야 하는데 로딩이 늦어질 수도 있으므로 sleep()을 사용해준다.
driver.implicitly_wait()
을 사용했지만, 실습 3에서는 내장 모듈인 time
의 sleep()
함수를 이용id = driver.find_element(By.NAME, "username")
id.send_keys(input_id)
find()
, find_all()
, select()
를 사용하여 요소들을 선택한다.(‘태그명’)find_element()
를 사용해서 요소들을 가져온다. By
함수를 사용하면 name
, class
, id
등의 속성들을 선택할 수 있다..send_keys()
는 선택한 요소에 값을 보내는 메서드다.password = driver.find_element(By.NAME, "password")
password.send_keys(input_pw)
sleep(2)
driver.find_element(By.CSS_SELECTOR, "#loginForm > div > div:nth-child(3)").click()
By.CSS_SELECTOR
는 CSS의 선택자를 사용해서 요소를 선택한다는 것이다.id
가 ‘loginForm’인 태그에서 하위 <div>
태그를 선택하고 그 하위에서 세 번째 <div>
태그를 선택해 클릭해주는 것이다.(로그인 버튼)로그인을 성공하면 알림 설정을 유도하는 알림창이 뜬다.
여기서 나중에하기를 자동으로 누르게 만들어보자.
later = driver.find_element(By.XPATH, '/html/body/div[6]/div/div/div/div[3]/button[2]')
later.click()
XPATH
를 사용해 요소를 찾아주고 있다.div
가 선택되는 경로를 사용할 수 있다.파일 및 폴더 생성
파일 시스템 탐색
도움말(man -> manual)
명령어 기초
유닉스(Unix)
특정 코드 지연 실행 - DispatchQueue.main.asyncAfter(deadline: )
Naming Conventions
안드로이드 폰과 맥북에어 M1 USB 테더링 성공
Simulator 풀 스크린 사용 방법
10807번 - 개수 세기
프로그래머스 Lv.1 풀이 코드 모음
프로그래머스 Lv.1 풀이 코드 모음
11047번 - 동전 0
11659번 - 구간 합 구하기 4
14888번 - 연산자 끼워넣기
9184번 - 신나는 함수 실행
24416번 - 알고리즘 수업 - 피보나치 수 1
2580번 - 스도쿠
9663번 - N-Queen
15652번 - N과 M (4)
15651번 - N과 M (3)
15650번 - N과 M (2)
25305번 - 커트라인
25304번 - 영수증
3003번 - 킹, 퀸, 룩, 비숍, 나이트, 폰
15649번 - N과 M (1)
2004번 - 조합 0의 개수
1676번 - 팩토리얼 0의 개수
9375번 - 패션왕 신해빈
1010번 - 다리 놓기
11051번 - 이항 계수 2
11050번 - 이항 계수 1
3036번 - 링
2981번 - 검문
1934번 - 최소공배수
2609번 - 최대공약수와 최소공배수
1037번 - 약수
5086번 - 배수와 약수
1358번 - 하키
1004번 - 어린 왕자
1002번 - 터렛
3053번 - 택시 기하학
2477번 - 참외밭
4153번 - 직각삼각형
3009번 - 네 번째 점
1085번 - 직사각형에서 탈출
11478번 - 서로 다른 부분 문자열의 개수
1269번 - 대칭 차집합
1764번 - 듣보잡
10816번 - 숫자 카드 2
1620번 - 나는야 포켓몬 마스터 이다솜
14425번 - 문자열 집합
10815번 - 숫자 카드
18870번 - 좌표 압축
10814번 - 나이순 정렬
1181번 - 단어 정렬
11651번 - 좌표 정렬하기 2
11650번 - 좌표 정렬하기
1427번 - 소트인사이드
2108번 - 통계학
10989번 - 수 정렬하기 3
2751번 - 수 정렬하기 2
2750번 - 수 정렬하기
22.06.25 ~ 27 부산 먹부림 기록
1436번 - 영화감독 숌
1018번 - 체스판 다시 칠하기
7568번 - 덩치
2231번 - 분해합
2798번 - 블랙잭
11729번 - 하노이 탑 이동 순서
2447번 - 별 찍기 - 10
17478번 - 재귀함수가 뭔가요?
10870번 - 피보나치 수 5
10872번 - 팩토리얼
9020번 - 골드바흐의 추측
4948번 - 베르트랑 공준
1929번 - 소수 구하기
11653번 - 소인수분해
2581번 - 소수
1978번 - 소수 찾기
10757번 - 큰 수 A+B
2839번 - 설탕 배달
2775번 - 부녀회장이 될테야
10250번 - ACM 호텔
2869번 - 달팽이는 올라가고 싶다
1193번 - 분수찾기
2292번 - 벌집
1712번 - 손익분기점
1316번 - 그룹 단어 체커
2941번 - 크로아티아 알파벳
5622번 - 다이얼
2908번 - 상수
1152번 - 단어의 개수
1157번 - 단어 공부
2675번 - 문자열 반복
10809번 - 알파벳 찾기
11720번 - 숫자의 합
11654번 - 아스키 코드
1065번 - 한수
4673번 - 셀프 넘버
15596번 - 정수 N개의 합
4344번 - 평균은 넘겠지
8958번 - OX퀴즈
25083번 - 새싹
Spark Bigdata Pipeline
Spark 3일차
Spark 2일차
1546번 - 평균
Spark 1일차
Hadoop🐘
3052번 - 나머지
2577번 - 숫자의 개수
2562번 - 최댓값
10818번 - 최소, 최대
Linux
MongoDB 조회 문제
MongoDB
1110번 - 더하기 사이클
10951번 - A+B - 4
Oracle 3️⃣
ORACLE 연습용 문제 만들기 숙제
10952번 - A+B - 5
Oracle 2️⃣
2480번 - 주사위 세개
Oracle Day1️⃣
Tensorflow
Big Data
2525번 - 오븐 시계
10871번 - X보다 작은 수
2439번 - 별 찍기 - 2
2438번 - 별 찍기 - 1
11022번 - A+B - 8
11021번 - A+B - 7
2742번 - 기찍 N
2741번 - N 찍기
15552번 - 빠른 A+B
8393번 - 합
10950번 - A+B - 3
9️⃣ 2739번 - 구구단
2884번 - 알람 시계
14681번 - 사분면 고르기
⛏크롤링(Crawling)
2753번 - 윤년
Django 복습 4️⃣
Django 복습 3️⃣
💯 9498번 - 시험 성적
1330번 - 두 수 비교하기
✖ 2588번 - 곱셈
➗ 10430번 - 나머지
Django 복습 2️⃣
Django 복습 1
MySQL 복습!
⁉10926번 - ??!
🆎1008번 - A/B
👩🦲 18108번 - 1998년생인 내가 태국에서는 2541년생?!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🎈✨경 축✨🎈
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
선형 자료구조(1일차에 이어서)
🆎10998번 - A×B
🆎1001번 - A-B
🆎1000번 - A+B
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🐶10172번 - 개
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🐱10171번 - 고양이
[해당 포스트는 유튜버 나동빈님의 영상을 참고했습니다.]
❤10718번 - We love kriii
🖐2557번 - Hello World
Today I Learned(TIL)📌 (2021.12.31)
Today I Learned(TIL)📌 (2021.12.30)
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[noitce!!] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!