게시판을 대략적으로 만든 후에

검색 기능은 뒤로 미루고 댓글부터 하기로 결심!!


다행히도 최초에 DB 설계까지 다 해놨기에 DB는 건드릴 일이 없었다.


댓글 처리는 Ajax를 사용


지금 내가 만드는 서비스도 RESTful 하게 만드는 것이 목적이고,

댓글 기능 역시 REST를 이용하여 기능을 구성하였다.

(아직 서버 업데이트 전)


스프링에서 REST 방식을 사용하기 위해선

해당 컨트롤러 위에 어노테이션으로 @RestController을 사용해야한다.

Rest의 핵심은 기존의 컨틀로가 view, 즉 jsp 페이지까지의 이동 역할을 담당했다면

Rest는 오로지 데이타(json)만 주고 받는다. 그렇기에 ajax와 같이 사용하는 비동기적 응답에 안성맞춤이다


물론 이를 위해서 porm.xml에 jackson-databind 라이브러리를 추가해야한다

이게 없으면 charset :utf-8 not suppoted 에러가 발생한다.


Rest에서 리턴 타입은 ResponseEntity를 사용한다

Data와 상태 코드를 같이 줄 수 있기때문!


3일차 라기 보단 3회차가 더 맞는 말인듯..


이번주 파이썬때문에 정신이 팔렸는지 많이 못했다.

겨우 게시글 등록, 조회, 수정 정도만 완료 할 수 있었다.


이전에 연습 삼아서 게시판을 만들어 보긴 했지만

새로 할려니 정말 새롭다.


물론 아직 검색처리나, 댓글, 조회수 등 중요한 기능들이 많이 남았기에 이제 시작이라 할 수 있다..으..


게시판을 만들때 핵심은 페이지 갯수를 계산하는 유틸리티 메서드를 따로 제작해야 한다는 점, 단순 등록, 조회 등은 쉽다.


추가적으로 오늘 한시간 해맨 부분이 세션값이 안불러져올때였는데

이런 경우에는 jsp 페이지 가장 위에 page session =false가 적혀져 있는지 확인하면 된다.

레벨 1을 어서 다 끝내야겠다는 생각으로 붙은 문제인데..

효율성에서 무너졌다.


문제는 너무 간단해서 직접 칠수 있을 정도있다.

숫자를 주면 1부터 그 숫자까지의 범위 안에서 소수를 찾아라 

예를 들어 10을 주면 2,3,5,7이 소수이므로 4를 리턴 하면 된다.





코드는 위와 같고 이렇게 하면 O(n^2)을 갖으며 돌아는 간다.
문제는 n의 범위가 10만까지이기에 이를 더 줄여야한다.
안그러면 시간 초과가 발생함..

사실 특정 숫자를 1부터 숫자 전까지 다 돌릴 필요가 있나 라는 생각을 하긴 했다
다만 이를 어떻게 식으로, 코드로 나타낼지 고민을 안해봐서..

여기서 잠깐 든 생각이, 배수들 중 잘 나오는수? 를 생각해보면

2, 3, 5, 7, 이렇게 말고는 없다고 판단 = > 두번째 for문의 범위를 2,3,5,7로 한정 지었다

O(N)으로 줄었지만 정답이 아예 아니다.


왜냐면 1~10이 커버칠 수 있는 제곱의 범위, 즉 120까지는 가능하나 121부터, 11, 13 등을 약수로 갖는 세자리 숫자가 등장하기 때문.

그렇다고 얘네를 모두 넣어줄 수도 없기에 결국은 일반화된 식을 찾아야만 한다.

'1일 1문제, 프로그래머스' 카테고리의 다른 글

프로그래머스, 레벨3, 거스름돈  (0) 2018.07.07
프로그래머스, 124 나라의 숫자  (0) 2018.07.06
레벨2) 최고의 집합  (0) 2018.06.23
최고의 집합  (0) 2018.06.23
간단한) 피보나치 수열  (0) 2018.06.20

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



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

(잘 안보여서 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를 받아야 한다는 의미가 된다.


오늘자 업데이트

# nav바 최적화 , 로그인시 문구 수정

# 로그인시 logout 버튼 생성

# 게시글 수정, 조회 구현

# 등록버튼 어디갔지...


책 보면서 찾아가면서 조금씩 개발하려 하니

무엇보다 가장 큰 문제는 에러...

분명 똑같이 했다고 생각했지만 살짝 다른 몇가지 때문에 발생한 에러는 시간을 많이 잡아 먹는다..


오늘의 첫번째 에러는 


Could not set parameters for mapping: ParameterMapping

글 수정 후 수정 버튼을 누르면 발생하는 에러였다.


처음에는 null이 많아서 그런건가 싶었는데.. 아뿔사 mapper에 parameterType이 int로 되어있었다(vo를 받아야 하는데)


이렇게 에러 하나 잡아간다..


페이지 조회, 수정, 삭제는 기존에 모달 형식으로 했기에 새롭게 다가왔다.

지금 가장 큰 문제가 uri 주소를 만드는 건데

Restful하게 만들자고 최대한 get, post, put, delete를 사용하려 하는데 이게 잘 안된다.


특히 put, delete..이건 따로 설정해줘야한다.


https://hue9010.github.io/spring/Spring-MVC-PUT,-DELETE-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/


위 링크를 참고하면 되는데...


나는 항상 안된다.

그래서 일단 글자 하나 줄여서 바꾸어놨다..


오늘 좀 신기했던 것은, 버튼의 클래스를 사용하여 form의 메서드와, action을 다르게 줄수 있다는 점.





아 추가적으로 등록하는 것 때문에 계속 리눅스를 만지게 되서 기분이 좋다.

한편으론 / 이 슬래쉬의 역할이 되게 궁금 했는데

http://booolean.tistory.com/400

이 분 블로그가 잘 정리되어있어서 .. 경로가 궁금하면 들어가보는게 좋다



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

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

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


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

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


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

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


레벨 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

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



아래는 원본





서비스를 런칭 했으니 오늘부터 1일차.. 라고 생각중 ㅡ,.ㅡ;;

(언제부터 했는지 까먹어서...)


파일 업로드와 회원가입 만 덩그러니 올린채 돌아가고 있는 내 서비스..


일단 게시판을 구현 하고

마이페이지 구현 후 캘린더 기능을 만드려 한다.


어제 오늘 기본적인 것들만 좀 확인하고 있는데

제일 답답한 부분은 CSS 부분.. 모르는 것도 많고 안되는 것도 많고 해서 여기 건드리기 시작하면 시간을 정말 오랫동안 먹고 있는다.

About 부분 수정하려고 했으나 footer가 body랑 겹치는 현상이 발생해서 footer를 없앨까 고민 중.


게시판 구현을 위해 DB도 추가 및 수정을 했는데

문제가 하나 발생하였다.


tb_bbs를 파일 업로드 전용으로 했다가

category 칼럼만 추가하여 차후에 여러 목적으로 사용하게끔 변형하였다.


문제는 tb_bbs에 게시판 내용이 들어가는데, 이를 불러오게 되면 넘버링이 달라진다.

tb_file 처럼 tb_bbs를 extends 하는 다른 bbs 테이블을 만들까 고민 하다가

이를 view로 처리해보자 라는 생각으로 도전중...


오늘도 동쪽으로 구글님을 향해 절 세번 한다..


사진 올리면 두장씩 올라가고

자꾸 눕는다.. 이거 설정해놨는데 진짜 왜그러지

자연수 n 개로 이루어진 집합 중에 다음 두 조건을 만족하는 집합을 최고의 집합이라고 합니다.

  1. 각 원소의 합이 S가 되는 수의 집합
  2. 위 조건을 만족하면서 각 원소의 곱 이 최대가 되는 집합

예를 들어서 자연수 2개로 이루어진 집합 중 합이 9가 되는 집합은 다음과 같이 4개가 있습니다.
{ 1, 8 }, { 2, 7 }, { 3, 6 }, { 4, 5 }
그중 각 원소의 곱이 최대인 { 4, 5 }가 최고의 집합입니다.

집합의 원소의 개수 n과 모든 원소들의 합 s가 매개변수로 주어질 때, 최고의 집합을 return 하는 solution 함수를 완성해주세요.

제한사항
  • 최고의 집합은 오름차순으로 정렬된 1차원 배열(list, vector) 로 return 해주세요.
  • 만약 최고의 집합이 존재하지 않는 경우에 크기가 1인 1차원 배열(list, vector) 에 -1 을 채워서 return 해주세요.
  • 자연수의 개수 n은 1 이상 10,000 이하의 자연수입니다.
  • 모든 원소들의 합 s는 1 이상, 100,000,000 이하의 자연수입니다.


우선 이 문제를 직관이 아닌 수학적 접근을 통해 증명한 승완이에게 박수를 보낸다...

(차후에 증명을 정리하면 추가해야지..)


이 문제 역시 예산 처럼, 제약조건이 있는 상황에서 최대값을 뽑는 문제이다.

예를 들어 변수가 3개라 할때 x + y + z  = N , xyz = ? 식의 구성이라 라그랑주로 접근할수도 있다(!!!!)

물론 난 그렇게 못한다..


직관적으로 접근해보면 어떤 경우에 가장 클까?

곱한 값이 가장 크려면, 가장 큰 애들끼리 곱하면 된다.

즉, 9를 두개의 수로 나누어서 곱한다고 할때, 제일 큰 수가 나오게 나누면 된다

이 얘기는 9의 평균 값, 4.5 * 4.5로 하면 가장 큰 값이 나온다는 뜻이다.


만약 9을 3개의 수로 나누어서 구해야 한다고 하면 당연히 3, 3, 3이 제일 크다.


(이러한 직관적 접근을 승완이는 수학적으로 접근하여 증명하였다!!!... 라그랑주 or 산술평균과 기하평균을 통해서...)


그렇기 때문에 평균에 가장 근접한 숫자들을 구해서 곱하면 된다.

물론 이렇게만 생각하면 한가지 큰 실수가 발생한다.

(나는 여기서 몫을 구하고 남은 나머지를 그냥 다른 하나의 값에 모두 더했다. 그리고 틀렸따...)


11을 3개의 숫자로 구성한다고 생각해보자.

1) 11을 3으로 나누면 3이 나온다.

2) 3, 3, 3의 총 3개의 숫자와 2가 남는다.

3) 남은 2를 3개중 아무거나에 더하면 3, 3, 5가 된다

4) 정답이 아니다.


왜 3,3,5는 정답이 아닐까? 

(정답은 3,4,4 이다.)


11을 다시 3으로 나눠보자, 자연수가 아닌 실수까지.

그러면 3.6... 이 나온다.

즉 가장 큰 값은 3.6 * 3.6 * 3.6이고 결국 우리가 구하는 값은 이에 가장 가까워야한다.


3, 3, 5

3, 4, 4,

이 두개의 수중 누가 더 3.6, 3.6, 3.6에 가까울까?

후자이다...


나는 위에까지 생각을 못했다...


이러한 사실을 알도 코드를 수정해봤지만 시간초과가 뜬다.. 슬프다







'1일 1문제, 프로그래머스' 카테고리의 다른 글

프로그래머스, 124 나라의 숫자  (0) 2018.07.06
소수 찾기  (0) 2018.06.30
최고의 집합  (0) 2018.06.23
간단한) 피보나치 수열  (0) 2018.06.20
끝말잇기, 18년 섬머 문제?  (0) 2018.06.15

프로그래머스 레벨2와 섬머 코딩 문제.


S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원해 줄 수 있는지 return 하도록 solution 함수를 완성해주세요.

제한사항
  • d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
  • d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
  • budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.
  • 물품을 구매해 줄 수 있는 부서 개수의 최댓값을 return 하세요.

부서 // 예산 // 결과값

1,3,2,5,4 // 9 // 3

2,2,3,3 // 10 // 4





문제가 상당히 길고, 거창하지만?? 생각보다 간단하게 접근하여 풀었다.

문제의 핵심은 어떤 부서인가가 아닌 최대의 부서 갯수를 구하는 것이기에 최대 갯수에 집중을 하면 된다.

그렇기에 가장 작은 값(가장 작은 예산)을 하나씩 없애고, 이 예산을 더하면서 주어진 값보다 커지는 순간의 갯수를 계산하면 된다.

즉 1 + 2 + 3 + 4 에서, 4가 되는 순간 9 보다 예산이 오바 되므로 4를 제외한 1,2,3부서, 총 3개가 최대 부서의 갯수라 할 수 있다.


같은 원리로 좀더 간단히, 슬라이싱을 이용하려면

1. 리스트 sort

2. 슬라이싱을 통한 더하기(lst[:d] )

등으로 간단히 구현할 수 있다.




'1일 1문제, 프로그래머스' 카테고리의 다른 글

소수 찾기  (0) 2018.06.30
레벨2) 최고의 집합  (0) 2018.06.23
간단한) 피보나치 수열  (0) 2018.06.20
끝말잇기, 18년 섬머 문제?  (0) 2018.06.15
땅따먹기, 프로그래머스  (0) 2018.06.13

+ Recent posts