/* code block */
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Stack(list):
    push = list.append
 
    def is_empty(self):
        if not self:
            return True
        else:
            return False
 
    def peek(self):
        return self[-1]
 
if __name__ == "__main__":
    s = Stack()
    s.push(1)
    s.push(2)
    s.push(3)
 
    while s:
        data = s.pop()
        print(data, end='')
 
리스트를 상속받아 스택을 구현한 것이다.
스택 클래스를 한 번 구현해놓으면 import해서 사용하기 편리하다.
 
if __name__ == "__main__" 이 부분은
이 소스코드가 있는 파이썬 파일이 다른 파일로부터 호출된것이 아닌 메인으로 실행됐을때 동작하게 하기 위해 쓰는 것으로, 스택이 잘 동작하는지 테스트하기 위해 사용했다.
반응형

'Python > 기초' 카테고리의 다른 글

우선순위 큐  (0) 2019.08.21
소수 구하기 - 에라토스테네스의 체  (0) 2019.08.21
최대공약수, 최소공배수 구하기  (0) 2019.08.21
반응형

소수를 구하는 방법은 여러가지가 있지만, 프로그램으로 구현할 때에는

 

시간복잡도를 고려하게 된다.

 

프로그램의 성능을 좌지우지하는 시간복잡도가 다른방법들에 비해 낮은 편이기 때문에

 

에라토스테네스의 체를 이용해 소수를 구하도록 한다.

 

방법은 아래와 같다.

 

1. 2부터 구하고자 하는 수 n까지의 자연수를 나열한다.

 

2. 소수인 2를 남기고 n까지의 모든 2의 배수를 제거한다. 2의 배수는 2라는 약수가 있기 때문에 소수가 아니기 때문이다.

 

3. 다음 수인 3은 이전 단계에서 제거되지 않았기 때문에 소수이다. 또한 3의 배수는 모두 소수가 아니기 때문에 n까지의 3의 배수들을 모두 제거한다.

 

4. 2번 단계에서 4는 제거되고 없기 때문에 5가 다음 소수이다. 또한 5의 배수는 모두 소수가 아니기 때문에 n까지의 5의 배수들을 모두 제거한다.

 

5. 같은 과정을 n까지 반복하고 나면 소수만 남게 된다.

 

기본 원리는 이렇다. 그런데 2부터 모든 2의 배수를 지우고, 또 3부터 모든 3의 배수를 지우는 것은 불필요한 중복된 작업을 포함한다.

 

정수 i의 배수를 지울 차례가 되었을때, i부터가 아닌 ixi부터 지우면 된다. 

 

왜일까?

 

예로 5의 경우를 들어보자.

 

5x5부터 시작해 모든 5의 배수는 이전 단계에서 다 지워졌을 수도 있고, 아직 지워지지 않은 수가 있을 수도 있다.

 

하지만 5x5 이전 5의 배수들은 5x4 (4의 배수), 5x3 (3의 배수), 5x2 (2의 배수)로 이미 이전 단계에서 다 지워졌다.

 

그렇다면 우리는 각 단계마다 ixi부터 시작함으로써 불필요한 작업을 줄일 수 있다.

 

하지만 프로그램을 이렇게 짤 경우, i가 무지막지하게 큰 숫자일 때 ixi는 프로그램 내에서 처리할 수 있는 범위를 초과해 이상한 결과가 나올 수 있기 때문에 ix2 또는 i+i정도로 해준다.

 

또한, 소수가 아닌 수들을 지울 때 실제로 수를 지우면 시간이 오래걸리니 bool 배열을 만들어 True, False로 지운척 표시만 해준다.

 

아래는 파이썬으로 구현한 코드이다.

 

1
2
3
4
5
6
7
8
MAX = 1000000
check = [False]*(MAX+1)
check[0= check[1= True
 
for i in range(2, MAX+1):
    if not check[i]:
        for j in range(i+i, MAX+1, i):
            check[j] = True

37이 소수인지 궁금하다면 check[37]을 확인하면 된다.

 

여기서는 False일 때 소수이다.

 

반응형

'Python > 기초' 카테고리의 다른 글

우선순위 큐  (0) 2019.08.21
스택 구현하기  (0) 2019.08.21
최대공약수, 최소공배수 구하기  (0) 2019.08.21
반응형

A, B의 최대공약수는 B, A%B의 최대공약수와 같다.

 

이 성질을 이용해 A%B의 결과가 0이 될 때까지 나머지를 구해주면

 

최대 공약수를 얻을 수 있다.

 

아래는 최대 공약수를 구하는 함수이다.

1
2
3
4
5
6
7
8
def gcd(a, b):
    if b == 0:
        return a
    else:
        return gcd(b, a%b)
 
= gcd(n, m)
= (n*m) // a

 

최소공배수는 최대공약수를 알고 있다면 쉽게 구할 수 있다.

 

'A x B = 최대공약수 x 최소공배수'이기 때문에

 

'최소공배수 = A x B / 최대공약수'로, A와 B를 곱한 값에서 최대공약수를 나눠주면 된다. 

반응형

'Python > 기초' 카테고리의 다른 글

우선순위 큐  (0) 2019.08.21
스택 구현하기  (0) 2019.08.21
소수 구하기 - 에라토스테네스의 체  (0) 2019.08.21
반응형
1
2
3
4
5
6
from selenium import webdriver
from datetime import datetime
from PIL import Image
import time
import configparser
import urllib

이전 글에서 설치했던 모듈을 포함해 이번 프로젝트에 필요한 모듈들을 임포트한다.

1
2
3
4
myCity = '광주 광산구 첨단1동'
AlertTime = 8 #매일 날씨를 알려줄 시간 (오전 여덟시)

myCity에 날씨정보가 필요한 동네 이름을 쓰자. myCity를 이용해 네이버 날씨에 검색할 것이다.

AlertTime은 매일 한 번 메시지를 보낼 시간이다. 아침 여덟시에 알림을 받도록 하겠다.

 

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
while True:
    
    if (datetime.now().hour == AlertTime) and (datetime.now().minute == 0):
 
        #알리기
        Config = configparser.ConfigParser()
 
        #카카오 아이디, 비밀번호 불러옴
        Config.read('./info.conf')
        Config = Config['MAIN']
 
        id = Config['kakaoid']
        pw = Config['kakaopw']
 
 
        ChatRoom = '채팅방 주소'
        options = webdriver.ChromeOptions()
 
 
        #user-agent 변경
        options.add_argument("user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
 
        #크롬 드라이버 로드
        driver = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver', options=options)
        driver.implicitly_wait(3)
 
 
        #날씨 페이지 로드
        driver.get(WeatherURL)
 
 
        #스크린샷 저장
        screenshot_name = "/home/pi/robot/weather.png"
        driver.save_screenshot(screenshot_name)
 
        #스크린샷 불러오기
        img = Image.open('/home/pi/robot/weather.png')
        cutted_img = img.crop((39,210,622,677))
        cutted_img.save('/home/pi/robot/weather.png')
 
 
        #카카오 메인 페이지 로드
        driver.get(KaKaoURL)
        time.sleep(3)
 
        #로그인 
        driver.find_element_by_id('loginEmail').send_keys(id)
        driver.find_element_by_id('loginPw').send_keys(pw)
        driver.find_element_by_id('countryCodeRequired').find_element_by_xpath("//button[@type='submit']").click()
        time.sleep(3)
 
 
 
        #채팅방 로드
        driver.get(ChatRoom)
        time.sleep(3)
 
        #글 작성
        driver.find_element_by_id('chatWrite').send_keys('라즈베리로봇 테스트 메시지입니다')  #메시지 작성
        driver.find_element_by_xpath("//input[@class='custom uploadInput']").send_keys('/home/pi/robot/weather.png'#날씨 사진 전송
        time.sleep(1)
        driver.find_element_by_xpath("//div[@class='wrap_inp']//button[@type='button']").click()  #전송버튼
   
        driver.quit()
        time.sleep(60)
 

매일 반복시키기 위해 While True:로 무한 루프를 돌려주었다.

라즈베리가 카카오톡에 로그인하기 위해 사용할 자신의 카카오 아이디와 비밀번호를 불러오기 위해

info.conf 파일을 만들어 파이썬 파일과 같은 경로에 위치시키자.

필자는 /home/pi/robot/rasprobot.py 경로에 스크립트를 저장해뒀기때문에 

info.conf 파일 경로는 /home/pi/robot/info.conf 이다.

 

터미널에서 vi 명령어로 info.conf 파일을 생성한다.

아래는 안에 넣을 내용이다.

1
2
3
[MAIN]
kakoid = 내 카카오 아이디
kakopw = 내 카카오 비밀번호

 

그다음 필요한 것은 라즈베리가 메시지를 보낼 채팅방의 주소이다.

카카오톡은 각 채팅방마다 고유한 주소를 가진다.

 

카카오톡에 등록된 자신의 플러스친구에게 메시지를 보낸다.

(메시지를 보내기 위해서는 플러스친구 관리자 화면에서 설정에 들어가 홈 공개를 해야한다.)

그러면 관리자 화면에서도 이렇게 1:1채팅이 생긴 것을 확인할 수 있다.

이 채팅방에 들어가보자

채팅방 화면 상단에 있는 채팅방의 주소를 복사해 ChatRoom 변수에 넣어주자.

(ChatRoom = 'https://xxxxxxxxxxx')

 

user-agent 변경 파트는 경우에 따라 필요 없는 경우도 많지만

이 파트의 유무에 따라 접속이 막히는 홈페이지가 있을 수 있으니 넣어뒀다.

 

네이버에 날씨를 검색한 후 화면을 캡쳐해 저장하고, 날씨 파트만 crop 함수로 잘라내어

다시 저장한 파일을 카카오톡으로 보내준다.

 

이후 60초를 기다림으로써 8시 01분이 되어 if (datetime.now().hour == AlertTime) and (datetime.now().minute == 0): 조건의 결과가 False가 되므로 다음날 8시 정각이 될 때까지 기다린다.

 

이제 이 스크립트를 자동실행하게 해 날씨 알리미 라즈베리로봇을 완성시켜보자.

 

터미널에서 /etc/profile.d 폴더로 이동한다.

cd /etc/profile.d

이 폴더 안에 스크립트를 만들면 부팅시 자동실행된다.

sudo vi run.sh

run.sh 파일을 만들어주자. 스크립트 이름은 다르게 해도 상관 없다.

1
2
#!/bin/bash
python3 /home/pi/robot/rasprobot.py

위 두줄을 입력한다. 파이썬 파일의 이름과 경로가 다르다면 그 경로에 맞게 써주도록 하자.

bash에서 파이썬 파일을 실행할 수 있어야 하므로 파이썬 파일이 있는 폴더로 이동해 권한설정을 바꿔준다.

cd /home/pi/robot
chmod 777 rasprobot.py

 

마지막으로 파이썬 파일 맨 윗줄(모듈을 임포트하는 줄보다도 더 위)에

1
#!/usr/bin/env python

이렇게 적어주자. 

터미널에서 reboot 명령어로 재부팅 시켜주면 자동실행 스크립트와 함께 로봇이 일하기 시작한다.

reboot

 

이제 라즈베리파이를 집안 구석 (와이파이가 닿는 곳이라면 어디든) 신경쓰이지 않는곳에 두고 전원을 연결시켜두자.

 

내일 아침, 라즈베리가 당신의 두피를 산성비로부터 지키기 위해 날씨를 알려줄 것이다.

 

[결과]

나만을 위한 라즈베리로봇 탄생

사진은 테스트를 위해 메시지를 보낸 후 찍은거라 오전 8시가 아니지만, 위 코드대로 동작한다면 오전 8시에 알려준다.

 

 

 

 

반응형
반응형

파이썬에서 플러스친구를 컨트롤하기 위해서, 웹브라우저를 컨트롤할 수 있게 해주는 selenium을 이용하겠다.

 

sudo pip3 install selenium
sudo pip3 install datetime
sudo pip3 install Image

위 모듈들을 설치해준다.

datetime은 메시지를 매일 아침마다 한 번씩 보내게 하기 위해 필요하고, Image는 날씨 정보를 찍은 사진을 보내기 전에 깔끔하게 편집하기 위해 필요하다.

dpkg -l | grep chromium

라즈비안에 설치돼있는 크롬 브라우저의 버전을 확인한 후

http://ports.ubuntu.com/pool/universe/c/chromium-browser/

 

Index of /pool/universe/c/chromium-browser

 

ports.ubuntu.com

여기서 맞는 버전의 driver를 다운받는다.

chromium-chromedriver xx.x.xxxx.xx-0ubuntux.xx.xx.x armhf.deb 이런식의 이름으로 되어있다.

 

다운받은 deb 파일은

 sudo dpkg -i xxx.deb

명령어로 설치한다.

 

이로써 개발에 필요한 모듈들이 준비되었다.

 

본격적으로 프로그램을 만들어보자.

반응형
반응형

요즘 들어 아침마다 날씨 확인하는게 번거로워서 확인도 안하고 우산 없이 나갔다가 된통 당하는 경우가 많다.

 

그래서 우리의 친구 라즈베리파이가 아침마다 카카오톡으로 오늘의 날씨를 알려주도록 만들어 보겠다.

 

준비 환경 - 라즈베리파이3B+, 마이크로SD카드, 무선 공유기, 파이썬3 개발환경

라즈베리파이 3B+, 집에 하는일 없이 뒹굴던 라즈베리의 모델명이다. 많은 성능을 필요로 하는 일을 시키지 않을 것이기 때문에 wifi 모듈만 달려있다면 3B+가 아니어도 충분하다.

이외에 라즈베리에 사용할 키보드, 마우스, 모니터는 데스크탑에서 잠시 뽑아 사용하도록 한다.

 

우선 라즈베리파이에 라즈비안을 설치한다.

https://www.raspberrypi.org/downloads/raspbian/

 

Download Raspbian for Raspberry Pi

Raspbian is the Foundation's official supported operating system. You can install it with NOOBS or download the image below.

www.raspberrypi.org

recommended software를 다운 받는다.

다운받은 라즈비안은 balenaEtcher 프로그램을 이용해 마이크로sd카드에 설치해준다.

https://www.balena.io/etcher/

 

balena - Home

Infrastructure to develop, deploy, and manage connected devices at scale

www.balena.io

라즈비안 설치가 완료됐으면 라즈비안의 터미널(Ctrl + Alt + T)을 켠다.

 

앞으로 이용할 파이썬3의 모듈들을 설치하기 위해 pip3를 우선 설치한다.

1
Python3    sudo apt-get install python3-pip

라즈베리는 이정도로 준비가 끝났다.

 

다음 준비할 것은 카카오톡이다. 라즈베리파이가 카카오톡으로 날씨를 알려주게 하기 위해서는 

 

라즈베리가 카카오로 로그인을 해서 나에게 톡을 보내게 해야 할 것이다. 

 

그런데 카카오 계정을 라즈베리를위해 또 만들 수는 없는 노릇이니 카카오톡의 플러스친구 기능을 이용해보겠다.

 

 

카카오톡 아이디로 로그인해서 플러스친구를 만들자.

플러스친구를 만들면 볼 수 있는 관리자센터 화면이다.

 

직접 만든 플러스친구를 카카오톡에서 검색해 친구추가하면 준비가 끝난다.

 

우리는 여기서 플러스친구의 1:1채팅 기능으로 나만을 위한 로봇을 만들어볼 것이다.

 

 

준비 끝!

반응형

+ Recent posts