지금은 아주 단순하지만 나중에 모든 것을 다 넣는다고 할 경우


1. 차트의 종류 설정

2. 해당 차트에 맞는 파라미터 버튼 생성

3. 버튼 클릭

4. 조건에 맞는 차트 그래프 보여주기.


크게 4가지로 나누고 이걸 다시 나누면.. 흠


1) 차트 종류를 입력받는 클래스

2) 1 정보를 받아서 버튼 생성 + 버튼 기능 

3) 2) 정보를 받아서 그래프 보여주기.


이렇게 클래스 짜면 되지않을까 싶음.

기본적인 기능은 대략적으로 구현되었다..


1. 색, 모양 등을 선택하면 해당되는 파라미터를 디스플레이에 띄워준다.

2. 선택한 파라미터에 맡게 matplolib를 보여주자.


애초에 이 스몰 프로젝트를 진행하게 된 이유는 수많은 파라미터 때문에 matplotlib을 고생하는 사람들을 위해

만든 것이고 그렇기에 간단하고 직관적이게 보여주고자 하는것이 목적이었다.


기능 구현이 우선이기에 일단 파라미터는 3개만을 기록하여 구동되도록 하였다.

다만 문제가 무진장 많다..


일단 이를 이전에 계산기나 핑퐁게임처럼 클래스 화를 하려니 어떠한 기준으로 이것을 나눠야하는지가 제일 큰 고민이고

두번째로는 이걸 만들다보니 실시간으로 그래프 모양이 바뀌었으면 좋겠다 라는 생각이 든다.

세번째로는 수많은 파라미터를 어떻게 조절해야하며

네번째로는 바 차트 뿐만 아니라 다양한 다른 차트들은 어떻게 적용하고

마지막으로 저 숨막히는 GUI를 어떻게 손대야할지...


어렵다 ㅠ_ㅠ

따로 클래스 정리를 안하고

일단 있는 그대로 다 작성하였다.


여러가지 의문이 많이 발생하였고 이제 풀어나가야한다.

제일 성급한 문제는 지정한 각종 파라미터를 어떻게 저장하고 유지하여 넘겨주는가 이다...



사이즈도 문제이고.. 허허 쉽지않다

지난번 예제를 바탕으로 

맨처음 했었던 계산기를 모듈화 해보기로.


말이 모듈화지 결국 클래스로 쪼개는 것인데

이를 나눌때 어떻게 잘 나눠야 하는지 제일 큰 주제였다.


계산기가 구동된다고 하면

기능을 구동시키는 메인,

배경을 담당하는 테이블,

버튼을 담당하는 버튼,


이렇게 크게 3가지로 나누어 지고 여기서 버튼의 클릭 기능을 어떻게 붙여야 할지가 핵심 관건이었다.

(사실상 돌아가게 구현하려면 버튼 클래스에 넣는게 제일 좋다)


다만 버튼이 만들어지는 객체마다 클릭 기능이 살짝 다르므로

(예를 들어 숫자는 단순 숫자 입력이지만 +,- 등은 다르기 때문)

이를 단순히 버튼안에 넣고 돌리는 것 역시 좋은 방법은 아니다.


자바처럼 get, set이 없으니 클래스 변수 사용하는 것도 어색하고.. 확실히 다른 느낌이다.

구체 클래스를 작성하겠다.



이미지로 보는게 좋아서 이미지 파일과 같이..

(잘 안보여서 pdf도 같이 첨부)

파이썬 앱.pdf





코딩 클럽 레벨 3을 보고 코드 작성 후 리뷰하는 글 입니다.


http://www.codingclub.co.uk/

여기 사이트서 소스를 받으실 수 있습니다.


벽돌 부시기 게임은 크게 4가지로 구분할 수 있습니다.



1. 메인

2. 테이블

3. 공

4. 막대기



위에 그림처럼 게임이 구동 되는 것이 목표


검정석 배경에 대쉬가 그려져 있는 것이 테이블이며

그 위에 노랑, 파랑색 막대기와 빨강색 공이 테이블위에서 움직인다


책을 더 잘 이해하기 위해선 클래스 개념과 함수(좌표)를 잘 이해해야한다..


# 배경이 되는 테이블



테이블은 생성자, 도형만들기, 구체 만들기, 아이템 옮기기 등의 주요 메서드가 있다.


1) 생성자

생성자는 메인으로부터 window, 즉 tkinter를 받는다. 

Canvas라는 메서드는 window의 백그라운드를 설정해준다.

pack()으로 고정을 해줘야 한다.


vertical, horizontal의 경우 가로선, 세로선을 결정하기 위해 필요한 파라미터 이다.

create_line의 경우 캔버스의 라인을 그려준다.

특이한 점은 얘는 좌표를 4개를 받는다.(x1, x2, y1, y2)

* 좌표를 4개 받는 경우는 앞으로 계속 나옴.


2) 도형만들기

draw_rectanlgle의 경우 실제 불리는 건 bat 클래스에서 불려진다.

안에 파라미터인 retangle의 경우 bat 클래스에서 보면 결국 자기 자신이 들어간다.

즉 bat 클래스 호출(bat 크기 지정) -> draw_rectangle 호출(bat의 크기 호출) : 이런식으로 진행이 된다.

create_rectanlge의 경우 좌표 4개를 받아서 그 상태로 도형을 만든다

사각형에서 대각선 점 2개의 x,y 좌표를 바탕으로 위 아래, 양 옆으로 선을 그어서 도형을 만든다고 생각하면 된다.

* 이 개념이 계속 나오므로 잘 이해를 해야함..


3) 구형만들기

draw_oval의 경우 위에와 동일하다. 얘는 ball 클래스에서 불려지며 결국 ball 클래스에서 지정된

사이즈를 전부 적용하여 구체를 만들게된다.



기타) 다른 메서드의 경우 좌표를 바탕으로 움직이게 하는 메서드이다.


특이한 점은 ball, bat 클래스 모두 table를 받아서 table의 메서드를 통해서 도형과 구체를 만든다는 점이다.

이 말은 다르게 표현하자면 ball, bat의 생성자에는 무조건 table를 받아야 한다는 의미가 된다.


맨 처음 파이썬을 접한 것도, 이쪽의 길을 가게 된 것도 결국은 데이터 분석, 데이터를 위함이었다.

그렇기에 당시에 내가 파이썬을 접하고, 사용했던 목적은 무언가를 계산하기 위함, 그 이상도 이하도 아니었다.

그랬기에 파이썬은 당시의 나, 그리고 지금까지도 입력-실행-결과 라는 단순한 프로세스로 이해하였다.


그렇기에 이번기회에는 이러한 단순 프로세스를 탈피하여 하나의 프로그램을 만들고자 한다.

물론 이는 책을 바탕으로 따라하는 것이지만 이를 기본으로 하여 내가 생각하는 무언가를 만들예정이다!!


코딩클럽은 중학생? 을 대상으로 한 책이라 매우 쉽게 읽을수 있는데 내용은 그렇게 쉽지않다.

물론 쉽게 설명되어있다..


레벨 2에서는 계산기를 만든다... 계산기...

따로 코드를 적기 보다는 기본적인 내용을 정리하는 식으로 올릴 예정이다.



GUI는 기본 내장 라이브러리 인 Tkinter를 사용한다.

from Tkinter import *;


간략히 구동되는 것을 설명하자면

Tkinter 라이브러리를 통해 윈도우(창? 혹은 창 내의 앱?)을 킨다. 그리고 x(종료) 하기 전까지 계속 켜져 있는다.

그리고 이 윈도우 창 내에 여러가지를 위치 시켜서 무언가를 만든다.


그렇기에 일단 윈도우를 불러내야 하므로 Tkinter로부터 가져온다


window = Tk();

window.title("My First Title") # 윈도우 창의 타이틀이다.. 큰 의미 없다..


window.mainloop(); # 작성된 윈도우를 돌린다.. 종료 전까지


이제 저 중간에 내가 넣고자 하는 애들을 삽입 시켜서 작동시키면 된다!!


중간에 작성할 애들은 크게 Label, Entry, Button 등이 있다(물론 더 있을거다.. 아마 )


Label : 레이블은 윈도우에 텍스트를 표시할때 주로 사용한다, 백그라운드의 의미? 로 이해하였다.

Entry : 엔트리는 텍스를 입력할 수 있는 상자를 제공한다. input을 받는 애이다.

Button은 말그대로 버튼이다. 버튼 모양을 만들며 액션을 추가 할 수도 있다.


1. Label 생성하기

Label(window, text = "원하는 말").grid(row = 0, column =0 , sticky = N)

# 레이블 생성시 당연히 이 레이블이 윈도우에 올라가므로 위에서 생성한 윈도우 객체를 파라미터로 넣어준다


# 그리고 레이블이 생성될때 위치로 잡아줘야하므로 이를 grid로 하여 row, column으로 위치를 잡는다.


2. Entry 생성하기

Entry(window, width = 20, bg = "light blue")

# 이 친구 역시 윈도우에 생성 되므로 위에서 생성한 객체를 파라미터로 넣어준다

# 엔트리위치를 잡기에 앞서서 이 박스 크기, 색을 지정해줘야 하므로 width, bg로 설정해준다

# 그리고 동일하게 grid를 통해서 전체 위치를 설정한다.


3. Button 생성하기

Button(window, text ="버튼 위에 말", width = 5, command =click).grid(row=2, column = 0, stick = W)

# 윈도우를 파라미터로 받았다.

# 사이즈도 지정해주었다.

# 버튼의 핵심은 command이다. click는 저 위에 어딘가에서 설정된 함수이고 버튼을 클릭하면 click함수가 작동된다

# 함수 내에서 파라미터를 설정하여 값들을 변화시켜줄 수 있다.


https://github.com/homekeeper89/python-calc

자세한 코드는 위에 올려져 있다..



아래는 원본





7장 정렬 연습문제..

# 이 책이 대학 교재로 쓰일 줄은 몰랐다.. 그래서 답지가 없었구나.

# 간단하거나 쉽게 풀수 있는 문제는 skip..


7.3 입력이 역으로 정렬되어있을때 동일 수행시간 정렬 알고리즘을 모두 고르시오.

- 입력이 역으로 정렬 = 큰수로 정렬되어있다 = 무조건 정렬을 한번은 해야한다

- 따라서 위의 경우엔 O(N^2)이므로 이 수행시간을 갖는 알고리즘을 찾으면 된다.


7.9 두개의 정렬 리스트를 하나로 합병하는 데 필요한 최소, 최대 횟수를 바르게 표현한 것은?

(단 리스트의 길이는 각각 M과 N이며 M>= N 이다)


- 최소의 경우엔 극단적인 경우를 생각한다

즉 N의 모든 원소가 M의 가장 첫번째(M에서 가장 작은 원소) 보다 작은 경우... 따라서 이 경우엔 N이다.

- 최대의 경우엔 당연히 모든 경우를 다 확인하는것 이므로 M+N이다. 단 이때!

M >=N인 상황에서 제일 마지막은 할 필요가 없으므로 -1을 해줘야 한다. 따라서 M+N-1이다.


7.14 안정한 정렬 알고리즘을 모아놓은 것을 고르시오.


- Stable 알고리즘을 검색하면 많이 나온다.

- 단 여기서 Selection sort가 왜 안정하지 않은지 다시한번 상기하려 한다.

Selection sort는 최소값을 정하고 n번 돌면서 더 작은 최소값을 찾은뒤 교체를 한다.


만약 4, 4, 5, 6, 2, 1, 0 의 리스트가 있다면

첫번째에 4를 min으로 하고 n회 돌고 난 뒤에 0과 교체 된다.

즉 0, 4, 5, 6, 2, 1, 4가 되는데 이때 두개의 4의 인덱스 순서가 바뀌게 된다.



7.22 입력크기가 클때 힙정렬이 캐시메모리를 비효적으로 사용하는 이유를 설명하시오.


- 메모리구조, 운영체계 등에 대한 깊은 이해가 없어서 100% 설명은 못하겠으나 이해한것을 바탕으로 한다.

- 캐시 메모리는 일종의 주소의 즐겨찾기, 미래의 쓸거 같은 주소를 더 가져오는 셈

- 그렇기에 주소들이 모여있어야 효율이 좋다(배열처럼)

- 힙정렬의 핵심은 root와 제일 마지막 node를 교환 한 후에 heap을 생성 하는 것

- 문제는 바로 root와 마지막 node가 바로 옆에 붙어 있는게 아니라는 것이다.

- 즉 입력 크기가 매우 크다면 root와 마지막 node는 매우 멀기 때문에 캐시 메모리를 비효율적으로 사용하게 된다.


그 외에 나머지 문제들은 전부 프로그램 작성이라... 이번 장에선 이정도만 기억하면 될듯 싶다.


#digit_reverse함수는 양의 정수 n을 매개변수로 입력받습니다.

#n을 뒤집어 숫자 하나하나를 list로 표현해주세요

#예를들어 n이 12345이면 [5,4,3,2,1]을 리턴하면 됩니다.


포인트는 숫자가 입력되면 이를 거꾸로 해서 리턴.
즉 숫자 -> 리스트화 -> 거꾸로


위에 보인것처럼 순서대로 하여 거꾸로 하고 이를 list comprehension으로 축약한 버젼 이러헥 두개.. 다른 답중에 놀라운 것이 있어서 가져옴..

5월 21일 월요일


행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬을 입력받는 sumMatrix 함수를 완성하여 행렬 덧셈의 결과를 반환해 주세요.


예를 들어 2x2 행렬인 A = ((1, 2), (2, 3)), B = ((3, 4), (5, 6)) 가 주어지면, 같은 2x2 행렬인 ((4, 6), (7, 9))를 반환하면 됩니다.(어떠한 행렬에도 대응하는 함수를 완성해주세요.)










행렬문제는 행렬 이라는 압박감을 벗어나느게 우선인듯. 처음에 예시 문제가 2*2 여서 여기서 함정에 빠졌다. 단순한 로직이지만 중요한 점은 행, 열을 구분해야한다는 것. 다른 분들의 풀이도 비슷하지만 zip(A,B) 함수를 이용한게 신기하였음.

+ Recent posts