Toggle navigation
Toggle navigation
This project
Loading...
Sign in
정나리
/
Jaksimsamil
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
송용우
2020-06-25 03:10:03 +0900
Browse Files
Options
Browse Files
Download
Plain Diff
Commit
adc232b34e917edf192d8b7e763f06e6c9294f68
adc232b3
2 parents
9f7a8157
38227cf5
Merge commit '
38227cf5
' into feature/frontend_page
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
1238 additions
and
491 deletions
jaksimsamil-page/src/components/setting/GoalNumForm.js
jaksimsamil-page/src/components/setting/SettingForm.js
jaksimsamil-page/src/containers/home/HomeContainer.js
jaksimsamil-page/src/containers/setting/SettingContainer.js
jaksimsamil-page/src/modules/profile.js
jaksimsamil-server/API.md
jaksimsamil-server/access.log
jaksimsamil-server/src/api/index.js
jaksimsamil-server/src/api/notify/index.js
jaksimsamil-server/src/api/notify/slack.ctrl.js
jaksimsamil-server/src/api/profile/index.js
jaksimsamil-server/src/api/profile/profile.ctrl.js
jaksimsamil-server/src/data/problem_set.js
jaksimsamil-server/src/models/profile.js
jaksimsamil-server/src/util/analyzeBJ.js
jaksimsamil-server/src/util/compareBJ.js
jaksimsamil-server/src/util/sendSlack.js
jaksimsamil-server/src/util/test.js
jaksimsamil-server/src/util/test.json
jaksimsamil-page/src/components/setting/GoalNumForm.js
0 → 100644
View file @
adc232b
import
React
from
'react'
;
import
{
makeStyles
}
from
'@material-ui/core/styles'
;
import
Button
from
'@material-ui/core/Button'
;
import
TextField
from
'@material-ui/core/TextField'
;
const
useStyles
=
makeStyles
((
theme
)
=>
({
root
:
{
'& > *'
:
{
margin
:
theme
.
spacing
(
1
),
},
},
}));
const
GoalNumForm
=
({
onChange
,
profile
,
onGoalNumSubmit
})
=>
{
const
classes
=
useStyles
();
return
(
<
div
>
<
form
onSubmit
=
{
onGoalNumSubmit
}
>
<
TextField
name
=
"goalNum"
type
=
"number"
onChange
=
{
onChange
}
value
=
{
profile
.
goalNum
}
placeholder
=
"일일 목표"
label
=
"일일 목표"
InputLabelProps
=
{{
shrink
:
true
,
}}
/
>
<
Button
variant
=
"outlined"
type
=
"submit"
>
등록
<
/Button
>
<
/form
>
<
/div
>
);
};
export
default
GoalNumForm
;
jaksimsamil-page/src/components/setting/SettingForm.js
View file @
adc232b
...
...
@@ -2,9 +2,12 @@ import React from 'react';
import
palette
from
'../../lib/styles/palette'
;
import
BJIDForm
from
'./BJIDForm'
;
import
SlackForm
from
'./SlackForm'
;
import
GoalNumForm
from
'./GoalNumForm'
;
import
{
makeStyles
}
from
'@material-ui/core/styles'
;
import
Paper
from
'@material-ui/core/Paper'
;
import
Grid
from
'@material-ui/core/Grid'
;
import
CircularProgress
from
'@material-ui/core/CircularProgress'
;
import
styled
from
'styled-components'
;
const
useStyles
=
makeStyles
((
theme
)
=>
({
root
:
{
...
...
@@ -18,15 +21,29 @@ const useStyles = makeStyles((theme) => ({
},
}));
const
LoadingParentStyle
=
styled
.
div
`
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding-top: 20px;
`
;
const
SettingForm
=
({
onChange
,
onBJIDSubmit
,
onSlackURLSubmit
,
profile
,
onSyncBJIDSubmit
,
onGoalNumSubmit
,
isLoading
,
})
=>
{
const
classes
=
useStyles
();
return
(
return
isLoading
?
(
<
LoadingParentStyle
>
<
CircularProgress
className
=
{
classes
.
loading
}
/
>
<
/LoadingParentStyle
>
)
:
(
<
div
className
=
{
classes
.
root
}
>
<
Grid
container
spacing
=
{
3
}
>
<
Grid
item
xs
=
{
12
}
>
...
...
@@ -54,6 +71,16 @@ const SettingForm = ({
/
>
<
/Paper
>
<
/Grid
>
<
Grid
container
item
xs
=
{
12
}
>
<
Paper
className
=
{
classes
.
paper
}
elevation
=
{
3
}
>
<
GoalNumForm
profile
=
{
profile
}
onChange
=
{
onChange
}
onGoalNumSubmit
=
{
onGoalNumSubmit
}
/
>
<
/Paper
>
<
/Grid
>
<
/Grid
>
<
/div
>
);
...
...
jaksimsamil-page/src/containers/home/HomeContainer.js
View file @
adc232b
...
...
@@ -3,14 +3,15 @@ import { useDispatch, useSelector } from 'react-redux';
import
{
withRouter
}
from
'react-router-dom'
;
import
HomeForm
from
'../../components/home/HomeForm'
;
import
{
getPROFILE
}
from
'../../modules/profile'
;
import
{
analyzeBJ
}
from
'../../lib/util/analyzeBJ'
;
const
HomeContainer
=
({
history
})
=>
{
const
dispatch
=
useDispatch
();
const
{
user
,
profile
}
=
useSelector
(({
user
,
profile
})
=>
({
user
:
user
.
user
,
profile
:
profile
,
}));
useEffect
(()
=>
{},
[
profile
.
solvedBJ
]);
useEffect
(()
=>
{
console
.
log
(
profile
);
},
[
profile
.
solvedBJ
]);
useEffect
(()
=>
{
if
(
user
)
{
let
username
=
user
.
username
;
...
...
jaksimsamil-page/src/containers/setting/SettingContainer.js
View file @
adc232b
import
React
,
{
useEffect
}
from
'react'
;
import
React
,
{
useEffect
,
useState
}
from
'react'
;
import
{
useDispatch
,
useSelector
}
from
'react-redux'
;
import
{
withRouter
}
from
'react-router-dom'
;
import
{
...
...
@@ -8,15 +8,20 @@ import {
syncBJID
,
initializeProfile
,
setSLACK
,
setGOALNUM
,
}
from
'../../modules/profile'
;
import
SettingForm
from
'../../components/setting/SettingForm'
;
const
SettingContainer
=
({
history
})
=>
{
const
[
isLoading
,
setLoading
]
=
useState
(
false
);
const
dispatch
=
useDispatch
();
const
{
user
,
profile
}
=
useSelector
(({
user
,
profile
})
=>
({
user
:
user
.
user
,
profile
:
profile
,
}));
const
{
user
,
profile
,
loading
}
=
useSelector
(
({
user
,
profile
,
loading
})
=>
({
user
:
user
.
user
,
profile
:
profile
,
loading
:
loading
,
}),
);
const
onChange
=
(
e
)
=>
{
const
{
value
,
name
}
=
e
.
target
;
...
...
@@ -33,6 +38,13 @@ const SettingContainer = ({ history }) => {
let
username
=
profile
.
username
;
dispatch
(
syncBJID
({
username
}));
};
const
onGoalNumSubmit
=
(
e
)
=>
{
e
.
preventDefault
();
let
username
=
profile
.
username
;
let
goalNum
=
profile
.
goalNum
;
dispatch
(
setGOALNUM
({
username
,
goalNum
}));
};
const
onSlackURLSubmit
=
(
e
)
=>
{
e
.
preventDefault
();
let
username
=
profile
.
username
;
...
...
@@ -60,6 +72,13 @@ const SettingContainer = ({ history }) => {
};
}
},
[
dispatch
,
user
,
history
]);
useEffect
(()
=>
{
if
(
loading
[
'profile/SYNC_BJID'
]
==
true
)
{
setLoading
(
true
);
}
else
{
setLoading
(
false
);
}
},
[
dispatch
,
loading
]);
return
(
<
SettingForm
...
...
@@ -68,7 +87,9 @@ const SettingContainer = ({ history }) => {
onBJIDSubmit
=
{
onBJIDSubmit
}
onSyncBJIDSubmit
=
{
onSyncBJIDSubmit
}
onSlackURLSubmit
=
{
onSlackURLSubmit
}
onGoalNumSubmit
=
{
onGoalNumSubmit
}
profile
=
{
profile
}
isLoading
=
{
isLoading
}
><
/SettingForm
>
);
};
...
...
jaksimsamil-page/src/modules/profile.js
View file @
adc232b
...
...
@@ -17,6 +17,11 @@ const [
SET_SLACK_FAILURE
,
]
=
createRequestActionTypes
(
'/profile/SET_SLACK'
);
const
[
SET_GOALNUM
,
SET_GOALNUM_SUCCESS
,
SET_GOALNUM_FAILURE
,
]
=
createRequestActionTypes
(
'/profile/SET_GOALNUM'
);
const
[
GET_PROFILE
,
GET_PROFILE_SUCCESS
,
GET_PROFILE_FAILURE
,
...
...
@@ -31,6 +36,7 @@ export const initializeProfile = createAction(INITIALIZE);
export
const
syncBJID
=
createAction
(
SYNC_BJID
,
({
username
})
=>
({
username
,
}));
export
const
setSLACK
=
createAction
(
SET_SLACK
,
({
username
,
slackWebHookURL
})
=>
({
...
...
@@ -38,6 +44,14 @@ export const setSLACK = createAction(
slackWebHookURL
,
}),
);
export
const
setGOALNUM
=
createAction
(
SET_GOALNUM
,
({
username
,
goalNum
})
=>
({
username
,
goalNum
,
}),
);
export
const
setBJID
=
createAction
(
SET_BJID
,
({
username
,
userBJID
})
=>
({
username
,
userBJID
,
...
...
@@ -58,16 +72,21 @@ const initialState = {
friendList
:
[],
profileError
:
''
,
slackWebHookURL
:
''
,
solvedBJ_date
:
''
,
goalNum
:
''
,
};
const
getPROFILESaga
=
createRequestSaga
(
GET_PROFILE
,
profileAPI
.
getPROFILE
);
const
setBJIDSaga
=
createRequestSaga
(
SET_BJID
,
profileAPI
.
setBJID
);
const
setSLACKSaga
=
createRequestSaga
(
SET_SLACK
,
profileAPI
.
setPROFILE
);
const
setGOALNUMSaga
=
createRequestSaga
(
SET_GOALNUM
,
profileAPI
.
setPROFILE
);
const
syncBJIDSaga
=
createRequestSaga
(
SYNC_BJID
,
profileAPI
.
syncBJ
);
export
function
*
profileSaga
()
{
yield
takeLatest
(
SET_BJID
,
setBJIDSaga
);
yield
takeLatest
(
GET_PROFILE
,
getPROFILESaga
);
yield
takeLatest
(
SYNC_BJID
,
syncBJIDSaga
);
yield
takeLatest
(
SET_SLACK
,
setSLACKSaga
);
yield
takeLatest
(
SET_GOALNUM
,
setGOALNUMSaga
);
}
export
default
handleActions
(
...
...
@@ -80,7 +99,15 @@ export default handleActions(
[
GET_PROFILE_SUCCESS
]:
(
state
,
{
payload
:
{
username
,
userBJID
,
solvedBJ
,
friendList
,
slackWebHookURL
},
payload
:
{
username
,
userBJID
,
solvedBJ
,
friendList
,
slackWebHookURL
,
solvedBJ_date
,
goalNum
,
},
},
)
=>
({
...
state
,
...
...
@@ -90,6 +117,8 @@ export default handleActions(
friendList
:
friendList
,
profileError
:
null
,
slackWebHookURL
:
slackWebHookURL
,
solvedBJ_date
:
solvedBJ_date
,
goalNum
:
goalNum
,
}),
[
GET_PROFILE_FAILURE
]:
(
state
,
{
payload
:
error
})
=>
({
...
state
,
...
...
@@ -114,6 +143,14 @@ export default handleActions(
...
state
,
profileError
:
error
,
}),
[
SET_GOALNUM_SUCCESS
]:
(
state
,
{
payload
:
{
goalNum
}
})
=>
({
...
state
,
goalNum
:
goalNum
,
}),
[
SET_GOALNUM_FAILURE
]:
(
state
,
{
payload
:
error
})
=>
({
...
state
,
profileError
:
error
,
}),
[
SYNC_BJID_SUCCESS
]:
(
state
,
{
payload
:
{
solvedBJ
}
})
=>
({
...
state
,
solvedBJ
,
...
...
jaksimsamil-server/API.md
View file @
adc232b
...
...
@@ -18,22 +18,22 @@
## API Table
| group | description
| method | URL
| Detail | Auth |
| ------- | ---------------------------
| --------- | -
----------------------- | -------- | --------- |
| user | 유저 등록
| POST | api/user
| 바로가기 | JWT Token |
| user | 유저 삭제
| DELETE | api/user:id
| 바로가기 | JWT Token |
| user | 특정 유저 조회
| GET | api/user:id
| 바로가기 | None |
| user | 전체 유저 조회
| GET | api/user
| 바로가기 | JWT Token |
| friend | 유저 친구 등록
| POST | api/friend
| 바로가기 | JWT Token |
| friend | 유저의 친구 조회
| GET | api/friend:id
| 바로가기 | None |
| profile | 유저가 푼 문제 조회(백준)
| GET | api/profile/solvedBJ:id
| 바로가기 | None |
| profile | 유저가 푼 문제 동기화(백준)
| PATCH | api/profile/syncBJ
| 바로가기 | None |
| profile | 유저 정보 수정
| POST | api/profile/setprofile
| 바로가기 | JWT TOKEN |
| profile | 유저 정보 받아오기
| POST | api/profile/getprofile
| 바로가기 | JWT |
| profile | 추천 문제 조회
| GET | api/profile/recommend:id
| 바로가기 | None |
| notify | 슬랙 메시지 전송 요청
| POST | api/notify/
|
|
slack | 바로가기 | Jwt Token
|
| auth | 로그인
| POST | api/auth/login
| 바로가기 | None |
| auth | 로그아웃
| POST | api/auth/logout
| 바로가기 | JWT Token |
| auth | 회원가입
| POST | api/auth/register
| 바로가기 | None |
| auth | 로그인 확인
| GET | api/auth/check
| 바로가기 | None |
| group | description
| method | URL
| Detail | Auth |
| ------- | ---------------------------
------ | ------ |
----------------------- | -------- | --------- |
| user | 유저 등록
| POST | api/user
| 바로가기 | JWT Token |
| user | 유저 삭제
| DELETE | api/user:id
| 바로가기 | JWT Token |
| user | 특정 유저 조회
| GET | api/user:id
| 바로가기 | None |
| user | 전체 유저 조회
| GET | api/user
| 바로가기 | JWT Token |
| friend | 유저 친구 등록
| POST | api/friend
| 바로가기 | JWT Token |
| friend | 유저의 친구 조회
| GET | api/friend:id
| 바로가기 | None |
| profile | 유저가 푼 문제 조회(백준)
| GET | api/profile/solvedBJ:id
| 바로가기 | None |
| profile | 유저가 푼 문제 동기화(백준)
| PATCH | api/profile/syncBJ
| 바로가기 | None |
| profile | 유저 정보 수정
| POST | api/profile/setprofile
| 바로가기 | JWT TOKEN |
| profile | 유저 정보 받아오기
| POST | api/profile/getprofile
| 바로가기 | JWT |
| profile | 추천 문제 조회
| POST | api/profile/recommend
| 바로가기 | None |
| notify | 슬랙 메시지 전송 요청
(성취여부) | POST | api/notify/goal | 바로가기 | Jwt Token
|
|
notify | 슬랙 메시지 전송 요청 (문제 추천) | POST | api/notify/recommend | 바로가기 | None
|
| auth | 로그인
| POST | api/auth/login
| 바로가기 | None |
| auth | 로그아웃
| POST | api/auth/logout
| 바로가기 | JWT Token |
| auth | 회원가입
| POST | api/auth/register
| 바로가기 | None |
| auth | 로그인 확인
| GET | api/auth/check
| 바로가기 | None |
...
...
jaksimsamil-server/access.log
View file @
adc232b
...
...
@@ -1286,3 +1286,99 @@
::ffff:127.0.0.1 - - [24/Jun/2020:11:31:05 +0000] "POST /api/profile/getprofile HTTP/1.1" 200 16266 "http://localhost:3000/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:11:39:21 +0000] "POST /api/profile/getprofile HTTP/1.1" 401 12 "http://localhost:3000/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:11:39:22 +0000] "POST /api/profile/getprofile HTTP/1.1" 200 16266 "http://localhost:3000/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:13:41:48 +0000] "PATCH /api/profile/syncBJ HTTP/1.1" 200 33281 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:13:42:48 +0000] "PATCH /api/profile/syncBJ HTTP/1.1" 200 33281 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::1 - - [24/Jun/2020:13:52:15 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:13:53:07 +0000] "POST /api/profile/recommend HTTP/1.1" 500 21 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:13:54:22 +0000] "POST /api/profile/recommend HTTP/1.1" 500 21 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:13:54:40 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:13:55:32 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:13:57:11 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:13:57:49 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:13:58:26 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::ffff:127.0.0.1 - - [24/Jun/2020:13:58:49 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:13:58:59 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:13:59:43 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:00:09 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:02:01 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:02:52 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:03:53 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:04:43 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:05:13 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:07:09 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:08:00 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:09:35 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:10:57 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:11:19 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:12:04 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:15:21 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:15:24 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:15:27 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:15:28 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:15:30 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:15:35 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:15:38 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:15:40 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:19:33 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:14:19:36 +0000] "POST /api/profile/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::ffff:127.0.0.1 - - [24/Jun/2020:15:35:00 +0000] "POST /api/profile/setprofile HTTP/1.1" 200 33281 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:35:04 +0000] "POST /api/profile/getprofile HTTP/1.1" 401 12 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:35:04 +0000] "GET /api/auth/check HTTP/1.1" 200 55 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:35:05 +0000] "POST /api/profile/getprofile HTTP/1.1" 200 33281 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:37:14 +0000] "POST /api/profile/setprofile HTTP/1.1" 200 33281 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:37:50 +0000] "POST /api/profile/setprofile HTTP/1.1" 200 33281 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:37:54 +0000] "GET /api/auth/check HTTP/1.1" 200 55 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:37:54 +0000] "POST /api/profile/getprofile HTTP/1.1" 401 12 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:37:55 +0000] "POST /api/profile/getprofile HTTP/1.1" 200 33281 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:39:50 +0000] "POST /api/profile/getprofile HTTP/1.1" 401 12 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:39:50 +0000] "GET /api/auth/check HTTP/1.1" 200 55 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:39:50 +0000] "POST /api/profile/getprofile HTTP/1.1" 200 33281 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:39:54 +0000] "POST /api/profile/setprofile HTTP/1.1" 200 33281 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:40:00 +0000] "GET /api/auth/check HTTP/1.1" 200 55 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:40:00 +0000] "POST /api/profile/getprofile HTTP/1.1" 401 12 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:40:00 +0000] "POST /api/profile/getprofile HTTP/1.1" 200 33281 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::1 - - [24/Jun/2020:15:40:32 +0000] "POST /api/profile/setprofile HTTP/1.1" 200 33293 "-" "PostmanRuntime/7.25.0"
::ffff:127.0.0.1 - - [24/Jun/2020:15:41:51 +0000] "GET /api/auth/check HTTP/1.1" 200 55 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:41:51 +0000] "POST /api/profile/getprofile HTTP/1.1" 401 12 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:15:41:51 +0000] "POST /api/profile/getprofile HTTP/1.1" 200 33293 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::1 - - [24/Jun/2020:16:47:20 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:47:43 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:48:07 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:49:04 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:50:59 +0000] "POST /api/notify/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:52:40 +0000] "POST /api/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::ffff:127.0.0.1 - - [24/Jun/2020:16:52:55 +0000] "POST /api/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:54:01 +0000] "POST /api/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:54:14 +0000] "POST /api/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:54:28 +0000] "POST /api/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:56:14 +0000] "POST /api/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:56:33 +0000] "POST /api/profile/getprofile HTTP/1.1" 200 33293 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:56:52 +0000] "POST /api/notify/slack/goal HTTP/1.1" 500 21 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:57:18 +0000] "POST /api/notify/slack/goal HTTP/1.1" 500 21 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:16:57:50 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:00:04 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::ffff:127.0.0.1 - - [24/Jun/2020:17:00:27 +0000] "POST /api/profile/getprofile HTTP/1.1" 200 33293 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::ffff:127.0.0.1 - - [24/Jun/2020:17:00:29 +0000] "POST /api/profile/setprofile HTTP/1.1" 200 33293 "http://localhost:3000/setting" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36 Edg/83.0.478.54"
::1 - - [24/Jun/2020:17:00:37 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:01:46 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::ffff:127.0.0.1 - - [24/Jun/2020:17:12:37 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:13:17 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:13:36 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:14:19 +0000] "POST /api/notify/slack/goal HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:22:37 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:23:06 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:27:52 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:30:55 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:32:42 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:34:03 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:36:50 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:40:43 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 500 21 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:42:09 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:43:17 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:53:11 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:53:24 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:54:40 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:55:11 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:55:24 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:17:55:39 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 404 9 "-" "PostmanRuntime/7.25.0"
::1 - - [24/Jun/2020:18:00:32 +0000] "POST /api/notify/slack/recommend HTTP/1.1" 500 21 "-" "PostmanRuntime/7.25.0"
...
...
jaksimsamil-server/src/api/index.js
View file @
adc232b
...
...
@@ -3,7 +3,7 @@ const api = new Router();
const
auth
=
require
(
"./auth"
);
const
friend
=
require
(
"./friend"
);
const
notify
=
require
(
"./
profile
"
);
const
notify
=
require
(
"./
notify
"
);
const
user
=
require
(
"./user"
);
const
profile
=
require
(
"./profile"
);
...
...
jaksimsamil-server/src/api/notify/index.js
View file @
adc232b
const
Router
=
require
(
"koa-router"
);
const
notify
=
new
Router
();
notify
.
post
(
"/slack"
);
const
slackCtrl
=
require
(
"./slack.ctrl"
);
notify
.
post
(
"/slack/goal"
,
slackCtrl
.
slackGoal
);
notify
.
post
(
"/slack/recommend"
,
slackCtrl
.
slackRecommend
);
module
.
exports
=
notify
;
...
...
jaksimsamil-server/src/api/notify/slack.ctrl.js
0 → 100644
View file @
adc232b
const
Profile
=
require
(
"../../models/profile"
);
const
sendSlack
=
require
(
"../../util/sendSlack"
);
const
problem_set
=
require
(
"../../data/problem_set"
);
const
compareBJ
=
require
(
"../../util/compareBJ"
);
/*
POST api/notify/slack/goal
{
username: "username"
}
*/
exports
.
slackGoal
=
async
(
ctx
)
=>
{
try
{
const
{
username
}
=
ctx
.
request
.
body
;
const
profile
=
await
Profile
.
findByUsername
(
username
);
if
(
!
profile
)
{
ctx
.
status
=
401
;
return
;
}
let
slackURL
=
profile
.
getslackURL
();
if
(
!
slackURL
)
{
ctx
.
status
=
401
;
return
;
}
let
goalNum
=
profile
.
getgoalNum
();
let
todayNum
=
profile
.
getTodaySovled
();
let
message
=
""
;
if
(
goalNum
<
todayNum
)
{
message
=
"오늘의 목표 "
+
goalNum
+
"문제 중 "
+
todayNum
+
"문제를 풀었습니다."
+
"\n"
+
"잘하셨습니다!"
;
}
else
{
message
=
"오늘의 목표 "
+
goalNum
+
"문제 중 "
+
todayNum
+
"문제를 풀었습니다."
+
"\n"
+
"분발하세요!"
;
}
sendSlack
.
send
(
message
,
slackURL
);
}
catch
(
e
)
{
ctx
.
throw
(
500
,
e
);
}
};
/*
POST api/notify/slack/recommend
{
username: "username"
}
*/
exports
.
slackRecommend
=
async
(
ctx
)
=>
{
try
{
console
.
log
(
"1"
);
const
{
username
}
=
ctx
.
request
.
body
;
const
profile
=
await
Profile
.
findByUsername
(
username
);
if
(
!
profile
)
{
ctx
.
status
=
401
;
return
;
}
let
slackURL
=
profile
.
getslackURL
();
if
(
!
slackURL
)
{
ctx
.
status
=
401
;
return
;
}
let
unsolved_data
=
compareBJ
.
compareBJ
(
profile
.
getBJdata
(),
problem_set
.
problem_set
);
let
recommendData
=
compareBJ
.
randomItem
(
unsolved_data
);
if
(
!
recommendData
)
{
ctx
.
status
=
401
;
return
;
}
let
message
=
"오늘의 추천 문제는 "
+
recommendData
.
problem_number
+
"번 "
+
" <https://www.boj.kr/"
+
recommendData
.
problem_number
+
"|"
+
recommendData
.
problem_title
+
">"
+
" 입니다."
;
sendSlack
.
send
(
message
,
slackURL
);
}
catch
(
e
)
{
ctx
.
throw
(
500
,
e
);
}
};
jaksimsamil-server/src/api/profile/index.js
View file @
adc232b
const
Router
=
require
(
"koa-router"
);
const
profile
=
new
Router
();
const
profileCtrl
=
require
(
"./profile.ctrl"
);
profile
.
post
(
"/solved:id"
);
profile
.
get
(
"/solvednum:id"
);
profile
.
get
(
"/recommendps:id"
);
profile
.
post
(
"/recommend"
,
profileCtrl
.
recommend
);
profile
.
patch
(
"/syncBJ"
,
profileCtrl
.
syncBJ
);
profile
.
post
(
"/setprofile"
,
profileCtrl
.
setProfile
);
profile
.
post
(
"/getprofile"
,
profileCtrl
.
getProfile
);
...
...
jaksimsamil-server/src/api/profile/profile.ctrl.js
View file @
adc232b
...
...
@@ -2,6 +2,9 @@ const Profile = require("../../models/profile");
const
mongoose
=
require
(
"mongoose"
);
const
getBJ
=
require
(
"../../util/getBJ"
);
const
Joi
=
require
(
"joi"
);
const
analyzeBJ
=
require
(
"../../util/analyzeBJ"
);
const
compareBJ
=
require
(
"../../util/compareBJ"
);
const
problem_set
=
require
(
"../../data/problem_set"
);
const
{
ObjectId
}
=
mongoose
.
Types
;
...
...
@@ -47,7 +50,7 @@ exports.setProfile = async (ctx) => {
//freindList: Joi.array().items(Joi.string()),
})
.
unknown
();
console
.
log
(
ctx
.
request
.
body
);
const
result
=
Joi
.
validate
(
ctx
.
request
.
body
,
schema
);
if
(
result
.
error
)
{
ctx
.
status
=
400
;
...
...
@@ -95,9 +98,10 @@ exports.syncBJ = async function (ctx) {
}
const
BJID
=
await
profile
.
getBJID
();
let
BJdata
=
await
getBJ
.
getBJ
(
BJID
);
let
BJdata_date
=
await
analyzeBJ
.
analyzeBJ
(
BJdata
);
const
updateprofile
=
await
Profile
.
findOneAndUpdate
(
{
username
:
username
},
{
solvedBJ
:
BJdata
},
{
solvedBJ
:
BJdata
,
solvedBJ_date
:
BJdata_date
},
{
new
:
true
}
).
exec
();
ctx
.
body
=
updateprofile
;
...
...
@@ -105,3 +109,33 @@ exports.syncBJ = async function (ctx) {
ctx
.
throw
(
500
,
e
);
}
};
/*
POST /api/proflie/recommend
{
username: 'userid'
}
*/
exports
.
recommend
=
async
(
ctx
)
=>
{
const
{
username
}
=
ctx
.
request
.
body
;
if
(
!
username
)
{
ctx
.
status
=
401
;
return
;
}
try
{
const
profile
=
await
Profile
.
findByUsername
(
username
);
if
(
!
profile
)
{
ctx
.
status
=
401
;
return
;
}
let
unsolved_data
=
compareBJ
.
compareBJ
(
profile
.
getBJdata
(),
problem_set
.
problem_set
);
ctx
.
body
=
compareBJ
.
randomItem
(
unsolved_data
);
//데이터가 비었을 떄 예외처리 필요
}
catch
(
e
)
{
ctx
.
throw
(
500
,
e
);
}
};
...
...
jaksimsamil-server/src/data/problem_set.js
View file @
adc232b
export
const
problem_set
=
[
"1517"
,
"2448"
,
"1891"
,
"1074"
,
"2263"
,
"1780"
,
"11728"
,
"10816"
,
"10815"
,
"2109"
,
"1202"
,
"1285"
,
"2138"
,
"1080"
,
"11399"
,
"1931"
,
"11047"
,
"15666"
,
"15665"
,
"15664"
,
"15663"
,
"15657"
,
"15656"
,
"15655"
,
"15654"
,
"15652"
,
"15651"
,
"15650"
,
"15649"
,
"6603"
,
"10971"
,
"10819"
,
"10973"
,
"10974"
,
"10972"
,
"7576"
,
"1248"
,
"2529"
,
"15661"
,
"14501"
,
"1759"
,
"14391"
,
"14889"
,
"1182"
,
"11723"
,
"1748"
,
"6064"
,
"1107"
,
"3085"
,
"2309"
,
"1748"
,
"14500"
,
"1107"
,
"1476"
,
"3085"
,
"2309"
,
"1261"
,
"13549"
,
"14226"
,
"13913"
,
"1697"
,
"1967"
,
"1167"
,
"11725"
,
"2250"
,
"1991"
,
"7562"
,
"2178"
,
"4963"
,
"2667"
,
"1707"
,
"11724"
,
"1260"
,
"13023"
,
"11652"
,
"1377"
,
"11004"
,
"10825"
,
"2751"
,
"9461"
,
"1699"
,
"9095"
,
"2225"
,
"2133"
,
"11727"
,
"11726"
,
"1463"
,
"2748"
,
"2747"
,
"11656"
,
"10824"
,
"2743"
,
"10820"
,
"10808"
,
"11655"
,
"11720"
,
"1008"
,
"10951"
,
"2557"
,
"1021"
,
"1966"
,
"2164"
,
"10799"
,
"17413"
,
"10866"
,
"1158"
,
"10845"
,
"1406"
,
"1874"
,
"9012"
,
"9093"
,
"10828"
,
"11721"
,
"11719"
,
"11718"
,
"10953"
,
"2558"
,
"10814"
,
"1181"
,
"11651"
,
"11650"
,
"1427"
,
"2108"
,
"10989"
,
"2751"
,
"2750"
,
"1436"
,
"1018"
,
"7568"
,
"2231"
,
"2798"
,
"1002"
,
"3053"
,
"4153"
,
"3009"
,
"1085"
,
"9020"
,
"4948"
,
"1929"
,
"2581"
,
"1978"
,
"2292"
,
"6064"
,
"2775"
,
"10250"
,
"2869"
,
"1011"
,
"1193"
,
"2839"
,
"1712"
,
"1316"
,
"2941"
,
"5622"
,
"2908"
,
"1152"
,
"1157"
,
"2675"
,
"10809"
,
"11720"
,
"11654"
,
"11729"
,
"2447"
,
"3052"
,
"10818"
,
"10872"
,
"10870"
,
"1065"
,
"4673"
,
"15596"
,
"4344"
,
"2920"
,
"8958"
,
"1546"
,
"2577"
,
"2562"
,
"1110"
,
"10951"
,
"10952"
,
"10871"
,
"2439"
,
"2438"
,
"11022"
,
"11021"
,
"2742"
,
"2741"
,
"15552"
,
"8393"
,
"10950"
,
"2739"
,
"10817"
,
"2884"
,
"2753"
,
"9498"
,
"1330"
,
"2588"
,
"10430"
,
"10869"
,
"1008"
,
"10998"
,
"7287"
,
"10172"
,
"10171"
,
"10718"
,
"1001"
,
"1000"
,
"2557"
,
exports
.
problem_set
=
[
{
problem_number
:
"1517"
,
problem_title
:
"버블 소트"
,
solved_date
:
"20200621"
,
},
{
problem_number
:
"2448"
,
problem_title
:
"별 찍기 - 11"
,
solved_date
:
"20200621"
,
},
{
problem_number
:
"1891"
,
problem_title
:
"사분면"
,
solved_date
:
"20200621"
},
{
problem_number
:
"1074"
,
problem_title
:
"Z"
,
solved_date
:
"20200620"
},
{
problem_number
:
"2263"
,
problem_title
:
"트리의 순회"
,
solved_date
:
"20200620"
,
},
{
problem_number
:
"1780"
,
problem_title
:
"종이의 개수"
,
solved_date
:
"20200619"
,
},
{
problem_number
:
"11728"
,
problem_title
:
"배열 합치기"
,
solved_date
:
"20200619"
,
},
{
problem_number
:
"10816"
,
problem_title
:
"숫자 카드 2"
,
solved_date
:
"20200619"
,
},
{
problem_number
:
"10815"
,
problem_title
:
"숫자 카드"
,
solved_date
:
"20200619"
,
},
{
problem_number
:
"2109"
,
problem_title
:
"순회강연"
,
solved_date
:
"20200619"
,
},
{
problem_number
:
"1202"
,
problem_title
:
"보석 도둑"
,
solved_date
:
"20200619"
,
},
{
problem_number
:
"1285"
,
problem_title
:
"동전 뒤집기"
,
solved_date
:
"20200617"
,
},
{
problem_number
:
"2138"
,
problem_title
:
"전구와 스위치"
,
solved_date
:
"20200617"
,
},
{
problem_number
:
"1080"
,
problem_title
:
"행렬"
,
solved_date
:
"20200617"
},
{
problem_number
:
"11399"
,
problem_title
:
"ATM"
,
solved_date
:
"20200616"
},
{
problem_number
:
"1931"
,
problem_title
:
"회의실배정"
,
solved_date
:
"20200616"
,
},
{
problem_number
:
"11047"
,
problem_title
:
"동전 0"
,
solved_date
:
"20200615"
},
{
problem_number
:
"15666"
,
problem_title
:
"N과 M (12)"
,
solved_date
:
"20200614"
,
},
{
problem_number
:
"15665"
,
problem_title
:
"N과 M (11)"
,
solved_date
:
"20200614"
,
},
{
problem_number
:
"15664"
,
problem_title
:
"N과 M (10)"
,
solved_date
:
"20200614"
,
},
{
problem_number
:
"15663"
,
problem_title
:
"N과 M (9)"
,
solved_date
:
"20200614"
,
},
{
problem_number
:
"15657"
,
problem_title
:
"N과 M (8)"
,
solved_date
:
"20200614"
,
},
{
problem_number
:
"15656"
,
problem_title
:
"N과 M (7)"
,
solved_date
:
"20200614"
,
},
{
problem_number
:
"15655"
,
problem_title
:
"N과 M (6)"
,
solved_date
:
"20200614"
,
},
{
problem_number
:
"15654"
,
problem_title
:
"N과 M (5)"
,
solved_date
:
"20200614"
,
},
{
problem_number
:
"15652"
,
problem_title
:
"N과 M (4)"
,
solved_date
:
"20200614"
,
},
{
problem_number
:
"15651"
,
problem_title
:
"N과 M (3)"
,
solved_date
:
"20200612"
,
},
{
problem_number
:
"15650"
,
problem_title
:
"N과 M (2)"
,
solved_date
:
"20200612"
,
},
{
problem_number
:
"15649"
,
problem_title
:
"N과 M (1)"
,
solved_date
:
"20200612"
,
},
{
problem_number
:
"6603"
,
problem_title
:
"로또"
,
solved_date
:
"20200612"
},
{
problem_number
:
"10971"
,
problem_title
:
"외판원 순회 2"
,
solved_date
:
"20200611"
,
},
{
problem_number
:
"10819"
,
problem_title
:
"차이를 최대로"
,
solved_date
:
"20200611"
,
},
{
problem_number
:
"10973"
,
problem_title
:
"이전 순열"
,
solved_date
:
"20200611"
,
},
{
problem_number
:
"10974"
,
problem_title
:
"모든 순열"
,
solved_date
:
"20200611"
,
},
{
problem_number
:
"10972"
,
problem_title
:
"다음 순열"
,
solved_date
:
"20200611"
,
},
{
problem_number
:
"7576"
,
problem_title
:
"토마토"
,
solved_date
:
"20200608"
},
{
problem_number
:
"1248"
,
problem_title
:
"맞춰봐"
,
solved_date
:
"20200312"
},
{
problem_number
:
"2529"
,
problem_title
:
"부등호"
,
solved_date
:
"20200311"
},
{
problem_number
:
"15661"
,
problem_title
:
"링크와 스타트"
,
solved_date
:
"20200311"
,
},
{
problem_number
:
"14501"
,
problem_title
:
"퇴사"
,
solved_date
:
"20200311"
},
{
problem_number
:
"1759"
,
problem_title
:
"암호 만들기"
,
solved_date
:
"20200310"
,
},
{
problem_number
:
"14391"
,
problem_title
:
"종이 조각"
,
solved_date
:
"20200306"
,
},
{
problem_number
:
"14889"
,
problem_title
:
"스타트와 링크"
,
solved_date
:
"20200305"
,
},
{
problem_number
:
"1182"
,
problem_title
:
"부분수열의 합"
,
solved_date
:
"20200305"
,
},
{
problem_number
:
"11723"
,
problem_title
:
"집합"
,
solved_date
:
"20200305"
},
{
problem_number
:
"1748"
,
problem_title
:
"수 이어 쓰기 1"
,
solved_date
:
"20200305"
,
},
{
problem_number
:
"6064"
,
problem_title
:
"카잉 달력"
,
solved_date
:
"20200305"
,
},
{
problem_number
:
"1107"
,
problem_title
:
"리모컨"
,
solved_date
:
"20200305"
},
{
problem_number
:
"3085"
,
problem_title
:
"사탕 게임"
,
solved_date
:
"20200305"
,
},
{
problem_number
:
"2309"
,
problem_title
:
"일곱 난쟁이"
,
solved_date
:
"20200305"
,
},
{
problem_number
:
"1748"
,
problem_title
:
"수 이어 쓰기 1"
,
solved_date
:
"20200228"
,
},
{
problem_number
:
"14500"
,
problem_title
:
"테트로미노"
,
solved_date
:
"20200228"
,
},
{
problem_number
:
"1107"
,
problem_title
:
"리모컨"
,
solved_date
:
"20200228"
},
{
problem_number
:
"1476"
,
problem_title
:
"날짜 계산"
,
solved_date
:
"20200228"
,
},
{
problem_number
:
"3085"
,
problem_title
:
"사탕 게임"
,
solved_date
:
"20200228"
,
},
{
problem_number
:
"2309"
,
problem_title
:
"일곱 난쟁이"
,
solved_date
:
"20200228"
,
},
{
problem_number
:
"1261"
,
problem_title
:
"알고스팟"
,
solved_date
:
"20200228"
,
},
{
problem_number
:
"13549"
,
problem_title
:
"숨바꼭질 3"
,
solved_date
:
"20200227"
,
},
{
problem_number
:
"14226"
,
problem_title
:
"이모티콘"
,
solved_date
:
"20200227"
,
},
{
problem_number
:
"13913"
,
problem_title
:
"숨바꼭질 4"
,
solved_date
:
"20200227"
,
},
{
problem_number
:
"1697"
,
problem_title
:
"숨바꼭질"
,
solved_date
:
"20200227"
,
},
{
problem_number
:
"1967"
,
problem_title
:
"트리의 지름"
,
solved_date
:
"20200221"
,
},
{
problem_number
:
"1167"
,
problem_title
:
"트리의 지름"
,
solved_date
:
"20200221"
,
},
{
problem_number
:
"11725"
,
problem_title
:
"트리의 부모 찾기"
,
solved_date
:
"20200221"
,
},
{
problem_number
:
"2250"
,
problem_title
:
"트리의 높이와 너비"
,
solved_date
:
"20200221"
,
},
{
problem_number
:
"1991"
,
problem_title
:
"트리 순회"
,
solved_date
:
"20200221"
,
},
{
problem_number
:
"7562"
,
problem_title
:
"나이트의 이동"
,
solved_date
:
"20200220"
,
},
{
problem_number
:
"2178"
,
problem_title
:
"미로 탐색"
,
solved_date
:
"20200220"
,
},
{
problem_number
:
"4963"
,
problem_title
:
"섬의 개수"
,
solved_date
:
"20200219"
,
},
{
problem_number
:
"2667"
,
problem_title
:
"단지번호붙이기"
,
solved_date
:
"20200219"
,
},
{
problem_number
:
"1707"
,
problem_title
:
"이분 그래프"
,
solved_date
:
"20200217"
,
},
{
problem_number
:
"11724"
,
problem_title
:
"연결 요소의 개수"
,
solved_date
:
"20200214"
,
},
{
problem_number
:
"1260"
,
problem_title
:
"DFS와 BFS"
,
solved_date
:
"20200214"
,
},
{
problem_number
:
"13023"
,
problem_title
:
"ABCDE"
,
solved_date
:
"20200213"
},
{
problem_number
:
"11652"
,
problem_title
:
"카드"
,
solved_date
:
"20200210"
},
{
problem_number
:
"1377"
,
problem_title
:
"버블 소트"
,
solved_date
:
"20200210"
,
},
{
problem_number
:
"11004"
,
problem_title
:
"K번째 수"
,
solved_date
:
"20200210"
,
},
{
problem_number
:
"10825"
,
problem_title
:
"국영수"
,
solved_date
:
"20200210"
},
{
problem_number
:
"2751"
,
problem_title
:
"수 정렬하기 2"
,
solved_date
:
"20200210"
,
},
{
problem_number
:
"9461"
,
problem_title
:
"파도반 수열"
,
solved_date
:
"20200205"
,
},
{
problem_number
:
"1699"
,
problem_title
:
"제곱수의 합"
,
solved_date
:
"20200205"
,
},
{
problem_number
:
"9095"
,
problem_title
:
"1, 2, 3 더하기"
,
solved_date
:
"20200205"
,
},
{
problem_number
:
"2225"
,
problem_title
:
"합분해"
,
solved_date
:
"20200205"
},
{
problem_number
:
"2133"
,
problem_title
:
"타일 채우기"
,
solved_date
:
"20200204"
,
},
{
problem_number
:
"11727"
,
problem_title
:
"2×n 타일링 2"
,
solved_date
:
"20200203"
,
},
{
problem_number
:
"11726"
,
problem_title
:
"2×n 타일링"
,
solved_date
:
"20200203"
,
},
{
problem_number
:
"1463"
,
problem_title
:
"1로 만들기"
,
solved_date
:
"20200203"
,
},
{
problem_number
:
"2748"
,
problem_title
:
"피보나치 수 2"
,
solved_date
:
"20200203"
,
},
{
problem_number
:
"2747"
,
problem_title
:
"피보나치 수"
,
solved_date
:
"20200203"
,
},
{
problem_number
:
"11656"
,
problem_title
:
"접미사 배열"
,
solved_date
:
"20200203"
,
},
{
problem_number
:
"10824"
,
problem_title
:
"네 수"
,
solved_date
:
"20200203"
},
{
problem_number
:
"2743"
,
problem_title
:
"단어 길이 재기"
,
solved_date
:
"20200203"
,
},
{
problem_number
:
"10820"
,
problem_title
:
"문자열 분석"
,
solved_date
:
"20200203"
,
},
{
problem_number
:
"10808"
,
problem_title
:
"알파벳 개수"
,
solved_date
:
"20200203"
,
},
{
problem_number
:
"11655"
,
problem_title
:
"ROT13"
,
solved_date
:
"20200203"
},
{
problem_number
:
"11720"
,
problem_title
:
"숫자의 합"
,
solved_date
:
"20200131"
,
},
{
problem_number
:
"1008"
,
problem_title
:
"A/B"
,
solved_date
:
"20200131"
},
{
problem_number
:
"10951"
,
problem_title
:
"A+B - 4"
,
solved_date
:
"20200131"
,
},
{
problem_number
:
"2557"
,
problem_title
:
"Hello World"
,
solved_date
:
"20200131"
,
},
{
problem_number
:
"1021"
,
problem_title
:
"회전하는 큐"
,
solved_date
:
"20200131"
,
},
{
problem_number
:
"1966"
,
problem_title
:
"프린터 큐"
,
solved_date
:
"20200131"
,
},
{
problem_number
:
"2164"
,
problem_title
:
"카드2"
,
solved_date
:
"20200131"
},
{
problem_number
:
"10799"
,
problem_title
:
"쇠막대기"
,
solved_date
:
"20200131"
,
},
{
problem_number
:
"17413"
,
problem_title
:
"단어 뒤집기 2"
,
solved_date
:
"20200131"
,
},
{
problem_number
:
"10866"
,
problem_title
:
"덱"
,
solved_date
:
"20200131"
},
{
problem_number
:
"1158"
,
problem_title
:
"요세푸스 문제"
,
solved_date
:
"20200131"
,
},
{
problem_number
:
"10845"
,
problem_title
:
"큐"
,
solved_date
:
"20200130"
},
{
problem_number
:
"1406"
,
problem_title
:
"에디터"
,
solved_date
:
"20200130"
},
{
problem_number
:
"1874"
,
problem_title
:
"스택 수열"
,
solved_date
:
"20200130"
,
},
{
problem_number
:
"9012"
,
problem_title
:
"괄호"
,
solved_date
:
"20200130"
},
{
problem_number
:
"9093"
,
problem_title
:
"단어 뒤집기"
,
solved_date
:
"20200130"
,
},
{
problem_number
:
"10828"
,
problem_title
:
"스택"
,
solved_date
:
"20200129"
},
{
problem_number
:
"11721"
,
problem_title
:
"열 개씩 끊어 출력하기"
,
solved_date
:
"20200126"
,
},
{
problem_number
:
"11719"
,
problem_title
:
"그대로 출력하기 2"
,
solved_date
:
"20200126"
,
},
{
problem_number
:
"11718"
,
problem_title
:
"그대로 출력하기"
,
solved_date
:
"20200126"
,
},
{
problem_number
:
"10953"
,
problem_title
:
"A+B - 6"
,
solved_date
:
"20200126"
,
},
{
problem_number
:
"2558"
,
problem_title
:
"A+B - 2"
,
solved_date
:
"20200126"
},
{
problem_number
:
"10814"
,
problem_title
:
"나이순 정렬"
,
solved_date
:
"20200123"
,
},
{
problem_number
:
"1181"
,
problem_title
:
"단어 정렬"
,
solved_date
:
"20200122"
,
},
{
problem_number
:
"11651"
,
problem_title
:
"좌표 정렬하기 2"
,
solved_date
:
"20200122"
,
},
{
problem_number
:
"11650"
,
problem_title
:
"좌표 정렬하기"
,
solved_date
:
"20200122"
,
},
{
problem_number
:
"1427"
,
problem_title
:
"소트인사이드"
,
solved_date
:
"20190823"
,
},
{
problem_number
:
"2108"
,
problem_title
:
"통계학"
,
solved_date
:
"20190823"
},
{
problem_number
:
"10989"
,
problem_title
:
"수 정렬하기 3"
,
solved_date
:
"20190823"
,
},
{
problem_number
:
"2751"
,
problem_title
:
"수 정렬하기 2"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"2750"
,
problem_title
:
"수 정렬하기"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"1436"
,
problem_title
:
"영화감독 숌"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"1018"
,
problem_title
:
"체스판 다시 칠하기"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"7568"
,
problem_title
:
"덩치"
,
solved_date
:
"20190814"
},
{
problem_number
:
"2231"
,
problem_title
:
"분해합"
,
solved_date
:
"20190814"
},
{
problem_number
:
"2798"
,
problem_title
:
"블랙잭"
,
solved_date
:
"20190814"
},
{
problem_number
:
"1002"
,
problem_title
:
"터렛"
,
solved_date
:
"20190814"
},
{
problem_number
:
"3053"
,
problem_title
:
"택시 기하학"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"4153"
,
problem_title
:
"직각삼각형"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"3009"
,
problem_title
:
"네 번째 점"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"1085"
,
problem_title
:
"직사각형에서 탈출"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"9020"
,
problem_title
:
"골드바흐의 추측"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"4948"
,
problem_title
:
"베르트랑 공준"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"1929"
,
problem_title
:
"소수 구하기"
,
solved_date
:
"20190814"
,
},
{
problem_number
:
"2581"
,
problem_title
:
"소수"
,
solved_date
:
"20190811"
},
{
problem_number
:
"1978"
,
problem_title
:
"소수 찾기"
,
solved_date
:
"20190811"
,
},
{
problem_number
:
"2292"
,
problem_title
:
"벌집"
,
solved_date
:
"20190811"
},
{
problem_number
:
"6064"
,
problem_title
:
"카잉 달력"
,
solved_date
:
"20190811"
,
},
{
problem_number
:
"2775"
,
problem_title
:
"부녀회장이 될테야"
,
solved_date
:
"20190811"
,
},
{
problem_number
:
"10250"
,
problem_title
:
"ACM 호텔"
,
solved_date
:
"20190811"
,
},
{
problem_number
:
"2869"
,
problem_title
:
"달팽이는 올라가고 싶다"
,
solved_date
:
"20190811"
,
},
{
problem_number
:
"1011"
,
problem_title
:
"Fly me to the Alpha Centauri"
,
solved_date
:
"20190811"
,
},
{
problem_number
:
"1193"
,
problem_title
:
"분수찾기"
,
solved_date
:
"20190810"
,
},
{
problem_number
:
"2839"
,
problem_title
:
"설탕 배달"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"1712"
,
problem_title
:
"손익분기점"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"1316"
,
problem_title
:
"그룹 단어 체커"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"2941"
,
problem_title
:
"크로아티아 알파벳"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"5622"
,
problem_title
:
"다이얼"
,
solved_date
:
"20190809"
},
{
problem_number
:
"2908"
,
problem_title
:
"상수"
,
solved_date
:
"20190809"
},
{
problem_number
:
"1152"
,
problem_title
:
"단어의 개수"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"1157"
,
problem_title
:
"단어 공부"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"2675"
,
problem_title
:
"문자열 반복"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"10809"
,
problem_title
:
"알파벳 찾기"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"11720"
,
problem_title
:
"숫자의 합"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"11654"
,
problem_title
:
"아스키 코드"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"11729"
,
problem_title
:
"하노이 탑 이동 순서"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"2447"
,
problem_title
:
"별 찍기 - 10"
,
solved_date
:
"20190809"
,
},
{
problem_number
:
"3052"
,
problem_title
:
"나머지"
,
solved_date
:
"20190807"
},
{
problem_number
:
"10818"
,
problem_title
:
"최소, 최대"
,
solved_date
:
"20190807"
,
},
{
problem_number
:
"10872"
,
problem_title
:
"팩토리얼"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"10870"
,
problem_title
:
"피보나치 수 5"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"1065"
,
problem_title
:
"한수"
,
solved_date
:
"20190628"
},
{
problem_number
:
"4673"
,
problem_title
:
"셀프 넘버"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"15596"
,
problem_title
:
"정수 N개의 합"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"4344"
,
problem_title
:
"평균은 넘겠지"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"2920"
,
problem_title
:
"음계"
,
solved_date
:
"20190628"
},
{
problem_number
:
"8958"
,
problem_title
:
"OX퀴즈"
,
solved_date
:
"20190628"
},
{
problem_number
:
"1546"
,
problem_title
:
"평균"
,
solved_date
:
"20190628"
},
{
problem_number
:
"2577"
,
problem_title
:
"숫자의 개수"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"2562"
,
problem_title
:
"최댓값"
,
solved_date
:
"20190628"
},
{
problem_number
:
"1110"
,
problem_title
:
"더하기 사이클"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"10951"
,
problem_title
:
"A+B - 4"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"10952"
,
problem_title
:
"A+B - 5"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"10871"
,
problem_title
:
"X보다 작은 수"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"2439"
,
problem_title
:
"별 찍기 - 2"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"2438"
,
problem_title
:
"별 찍기 - 1"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"11022"
,
problem_title
:
"A+B - 8"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"11021"
,
problem_title
:
"A+B - 7"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"2742"
,
problem_title
:
"기찍 N"
,
solved_date
:
"20190628"
},
{
problem_number
:
"2741"
,
problem_title
:
"N 찍기"
,
solved_date
:
"20190628"
},
{
problem_number
:
"15552"
,
problem_title
:
"빠른 A+B"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"8393"
,
problem_title
:
"합"
,
solved_date
:
"20190628"
},
{
problem_number
:
"10950"
,
problem_title
:
"A+B - 3"
,
solved_date
:
"20190628"
,
},
{
problem_number
:
"2739"
,
problem_title
:
"구구단"
,
solved_date
:
"20190628"
},
{
problem_number
:
"10817"
,
problem_title
:
"세 수"
,
solved_date
:
"20190627"
},
{
problem_number
:
"2884"
,
problem_title
:
"알람 시계"
,
solved_date
:
"20190627"
,
},
{
problem_number
:
"2753"
,
problem_title
:
"윤년"
,
solved_date
:
"20190627"
},
{
problem_number
:
"9498"
,
problem_title
:
"시험 성적"
,
solved_date
:
"20190627"
,
},
{
problem_number
:
"1330"
,
problem_title
:
"두 수 비교하기"
,
solved_date
:
"20190627"
,
},
{
problem_number
:
"2588"
,
problem_title
:
"곱셈"
,
solved_date
:
"20190627"
},
{
problem_number
:
"10430"
,
problem_title
:
"나머지"
,
solved_date
:
"20190627"
},
{
problem_number
:
"10869"
,
problem_title
:
"사칙연산"
,
solved_date
:
"20190627"
,
},
{
problem_number
:
"1008"
,
problem_title
:
"A/B"
,
solved_date
:
"20190627"
},
{
problem_number
:
"10998"
,
problem_title
:
"A×B"
,
solved_date
:
"20190627"
},
{
problem_number
:
"7287"
,
problem_title
:
"등록"
,
solved_date
:
"20190627"
},
{
problem_number
:
"10172"
,
problem_title
:
"개"
,
solved_date
:
"20190627"
},
{
problem_number
:
"10171"
,
problem_title
:
"고양이"
,
solved_date
:
"20190627"
},
{
problem_number
:
"10718"
,
problem_title
:
"We love kriii"
,
solved_date
:
"20190627"
,
},
{
problem_number
:
"1001"
,
problem_title
:
"A-B"
,
solved_date
:
"20190607"
},
{
problem_number
:
"1000"
,
problem_title
:
"A+B"
,
solved_date
:
"20190607"
},
{
problem_number
:
"2557"
,
problem_title
:
"Hello World"
,
solved_date
:
"20190607"
,
},
];
...
...
jaksimsamil-server/src/models/profile.js
View file @
adc232b
...
...
@@ -6,8 +6,10 @@ const ProfileSchema = new Schema({
username
:
{
type
:
String
,
required
:
true
,
unique
:
true
},
userBJID
:
String
,
solvedBJ
:
Object
,
solvedBJ_date
:
Object
,
friendList
:
[
String
],
slackWebHookURL
:
String
,
goalNum
:
Number
,
});
ProfileSchema
.
statics
.
findByUsername
=
function
(
username
)
{
return
this
.
findOne
({
username
});
...
...
@@ -15,6 +17,20 @@ ProfileSchema.statics.findByUsername = function (username) {
ProfileSchema
.
methods
.
getBJID
=
function
()
{
return
this
.
userBJID
;
};
ProfileSchema
.
methods
.
getBJdata
=
function
()
{
return
this
.
solvedBJ
;
};
ProfileSchema
.
methods
.
getslackURL
=
function
()
{
return
this
.
slackWebHookURL
;
};
ProfileSchema
.
methods
.
getgoalNum
=
function
()
{
return
this
.
goalNum
;
};
ProfileSchema
.
methods
.
getTodaySovled
=
function
()
{
if
(
this
.
solvedBJ_date
)
{
return
this
.
solvedBJ_date
.
presentNum
;
}
};
ProfileSchema
.
methods
.
serialize
=
function
()
{
const
data
=
this
.
toJSON
();
...
...
jaksimsamil-server/src/util/analyzeBJ.js
View file @
adc232b
/*
2. 현재 날짜와의 차이 =>
3. 오늘 푼 문제 => 앞에서부터 순회하면서 데이트 같은거 찾기
3. 최근 일주일간 푼 문제 수 => 앞에서부터 순회하면서 - 값이
4. 추천 문제 => 정규 셋에서 없는거 찾기
5. 날짜별로 묶기.
데이터베이스에서 처리하자
*/
let
moment
=
require
(
'moment'
);
let
moment
=
require
(
"moment"
);
exports
.
analyzeBJ
=
function
(
solvedBJ
)
{
try
{
if
(
solvedBJ
)
{
console
.
log
(
solvedBJ
[
0
]);
let
presentDate
=
moment
();
let
presentDate_str
=
presentDate
.
format
(
'YYYYMMDD'
);
let
latestDate
=
moment
(
solvedBJ
[
0
].
solved_date
,
'YYYYMMDD'
);
let
difflatest
=
presentDate
.
diff
(
latestDate
,
'days'
);
let
presentDate_str
=
presentDate
.
format
(
"YYYYMMDD"
);
let
latestDate
=
moment
(
solvedBJ
[
0
].
solved_date
,
"YYYYMMDD"
);
let
difflatest
=
presentDate
.
diff
(
latestDate
,
"days"
);
let
solvedBJbyDATE
=
{};
for
(
let
i
=
0
;
i
<
solvedBJ
.
length
;
i
++
)
{
...
...
@@ -34,13 +24,13 @@ exports.analyzeBJ = function (solvedBJ) {
?
solvedBJbyDATE
[
presentDate_str
].
length
:
0
;
let
returnOBJ
=
{
latestDate
:
latestDate
.
format
(
'YYYYMMDD'
),
latestDate
:
latestDate
.
format
(
"YYYYMMDD"
),
difflatest
:
difflatest
,
latestNum
:
latestNum
,
presentNum
:
presentNum
,
solvedBJbyDATE
:
solvedBJbyDATE
,
};
console
.
log
(
returnOBJ
);
return
returnOBJ
;
}
}
catch
(
e
)
{
...
...
jaksimsamil-server/src/util/compareBJ.js
View file @
adc232b
/*
집중을 해보자.
새거와 데이터가 있다.
데이터 기준으로 새거에 자료가 있으면 넘어가기
없으면 새 배열에 추가
키만 모아둔 리스트를 만들자.
그렇게 해서
반복은 새거 길이만큼
데이터에 있으면 추가 X
없으면 추가
그렇게 반환
*/
exports
.
compareBJ
=
function
(
solvedBJ_new
,
problem_set
)
{
try
{
let
new_obj
=
[];
for
(
let
i
=
0
;
i
<
solvedBJ
.
length
;
i
++
)
{
if
(
solvedBJ_new
[
i
].
problem_number
in
problem_set
)
{
new_obj
.
push
(
solvedBJ_new
[
i
]);
for
(
let
i
=
0
;
i
<
problem_set
.
length
;
i
++
)
{
let
found
=
false
;
for
(
let
j
=
0
;
j
<
solvedBJ_new
.
length
;
j
++
)
{
if
(
solvedBJ_new
[
j
].
problem_number
==
problem_set
[
i
].
problem_number
)
{
found
=
true
;
break
;
}
}
if
(
!
found
)
{
new_obj
.
push
(
problem_set
[
i
]);
}
}
console
.
log
(
new_obj
);
return
new_obj
;
}
catch
(
e
)
{
console
.
log
(
e
);
}
};
exports
.
randomItem
=
function
(
a
)
{
return
a
[
Math
.
floor
(
Math
.
random
()
*
a
.
length
)];
};
...
...
jaksimsamil-server/src/util/sendSlack.js
View file @
adc232b
const
Slack
=
require
(
"slack-node"
);
// 슬랙 모듈 사용
/*
const webhookUri =
"https://hooks.slack.com/services/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"
;
// Webhook URL
"https://hooks.slack.com/services/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"; // Webhook URL
*/
const
slack
=
new
Slack
();
slack
.
setWebhook
(
webhookUri
);
const
send
=
async
(
message
)
=>
{
exports
.
send
=
async
(
message
,
webhookUri
)
=>
{
const
slack
=
new
Slack
();
slack
.
setWebhook
(
webhookUri
);
slack
.
webhook
(
{
text
:
message
,
...
...
@@ -16,5 +17,3 @@ const send = async (message) => {
}
);
};
send
(
"hello"
);
...
...
jaksimsamil-server/src/util/test.js
View file @
adc232b
var
getBJ
=
require
(
"./getBJ"
);
var
fs
=
require
(
"fs"
);
let
dataset
=
[
"1517"
,
"2448"
,
"1891"
,
"1074"
,
"2263"
,
"1780"
,
"11728"
,
"10816"
,
"10815"
,
"2109"
,
"1202"
,
"1285"
,
"2138"
,
"1080"
,
"11399"
,
"1931"
,
"11047"
,
"15666"
,
"15665"
,
"15664"
,
"15663"
,
"15657"
,
"15656"
,
"15655"
,
"15654"
,
"15652"
,
"15651"
,
"15650"
,
"15649"
,
"6603"
,
"10971"
,
"10819"
,
"10973"
,
"10974"
,
"10972"
,
"7576"
,
"1248"
,
"2529"
,
"15661"
,
"14501"
,
"1759"
,
"14391"
,
"14889"
,
"1182"
,
"11723"
,
"1748"
,
"6064"
,
"1107"
,
"3085"
,
"2309"
,
"1748"
,
"14500"
,
"1107"
,
"1476"
,
"3085"
,
"2309"
,
"1261"
,
"13549"
,
"14226"
,
"13913"
,
"1697"
,
"1967"
,
"1167"
,
"11725"
,
"2250"
,
"1991"
,
"7562"
,
"2178"
,
"4963"
,
"2667"
,
"1707"
,
"11724"
,
"1260"
,
"13023"
,
"11652"
,
"1377"
,
"11004"
,
"10825"
,
"2751"
,
"9461"
,
"1699"
,
"9095"
,
"2225"
,
"2133"
,
"11727"
,
"11726"
,
"1463"
,
"2748"
,
"2747"
,
"11656"
,
"10824"
,
"2743"
,
"10820"
,
"10808"
,
"11655"
,
"11720"
,
"1008"
,
"10951"
,
"2557"
,
"1021"
,
"1966"
,
"2164"
,
"10799"
,
"17413"
,
"10866"
,
"1158"
,
"10845"
,
"1406"
,
"1874"
,
"9012"
,
"9093"
,
"10828"
,
"11721"
,
"11719"
,
"11718"
,
"10953"
,
"2558"
,
"10814"
,
"1181"
,
"11651"
,
"11650"
,
"1427"
,
"2108"
,
"10989"
,
"2751"
,
"2750"
,
"1436"
,
"1018"
,
"7568"
,
"2231"
,
"2798"
,
"1002"
,
"3053"
,
"4153"
,
"3009"
,
"1085"
,
"9020"
,
"4948"
,
"1929"
,
"2581"
,
"1978"
,
"2292"
,
"6064"
,
"2775"
,
"10250"
,
"2869"
,
"1011"
,
"1193"
,
"2839"
,
"1712"
,
"1316"
,
"2941"
,
"5622"
,
"2908"
,
"1152"
,
"1157"
,
"2675"
,
"10809"
,
"11720"
,
"11654"
,
"11729"
,
"2447"
,
"3052"
,
"10818"
,
"10872"
,
"10870"
,
"1065"
,
"4673"
,
"15596"
,
"4344"
,
"2920"
,
"8958"
,
"1546"
,
"2577"
,
"2562"
,
"1110"
,
"10951"
,
"10952"
,
"10871"
,
"2439"
,
"2438"
,
"11022"
,
"11021"
,
"2742"
,
"2741"
,
"15552"
,
"8393"
,
"10950"
,
"2739"
,
"10817"
,
"2884"
,
"2753"
,
"9498"
,
"1330"
,
"2588"
,
"10430"
,
"10869"
,
"1008"
,
"10998"
,
"7287"
,
"10172"
,
"10171"
,
"10718"
,
"1001"
,
"1000"
,
"2557"
,
];
const
test
=
async
(
userid
)
=>
{
let
lst
=
await
getBJ
.
getBJ
(
userid
);
let
return_lst
=
[];
...
...
@@ -217,7 +8,7 @@ const test = async (userid) => {
return_lst
.
push
(
lst
[
i
].
problem_number
);
}
var
stringJson
=
JSON
.
stringify
(
return_
lst
)
+
"\n"
;
var
stringJson
=
JSON
.
stringify
(
lst
)
+
"\n"
;
fs
.
open
(
"test.json"
,
"a"
,
"666"
,
function
(
err
,
id
)
{
if
(
err
)
{
console
.
log
(
"file open err!!"
);
...
...
jaksimsamil-server/src/util/test.json
View file @
adc232b
...
...
@@ -206,3 +206,4 @@
"1000"
,
"2557"
]
[{
"problem_number"
:
"1517"
,
"problem_title"
:
"버블 소트"
,
"solved_date"
:
"20200621"
},{
"problem_number"
:
"2448"
,
"problem_title"
:
"별 찍기 - 11"
,
"solved_date"
:
"20200621"
},{
"problem_number"
:
"1891"
,
"problem_title"
:
"사분면"
,
"solved_date"
:
"20200621"
},{
"problem_number"
:
"1074"
,
"problem_title"
:
"Z"
,
"solved_date"
:
"20200620"
},{
"problem_number"
:
"2263"
,
"problem_title"
:
"트리의 순회"
,
"solved_date"
:
"20200620"
},{
"problem_number"
:
"1780"
,
"problem_title"
:
"종이의 개수"
,
"solved_date"
:
"20200619"
},{
"problem_number"
:
"11728"
,
"problem_title"
:
"배열 합치기"
,
"solved_date"
:
"20200619"
},{
"problem_number"
:
"10816"
,
"problem_title"
:
"숫자 카드 2"
,
"solved_date"
:
"20200619"
},{
"problem_number"
:
"10815"
,
"problem_title"
:
"숫자 카드"
,
"solved_date"
:
"20200619"
},{
"problem_number"
:
"2109"
,
"problem_title"
:
"순회강연"
,
"solved_date"
:
"20200619"
},{
"problem_number"
:
"1202"
,
"problem_title"
:
"보석 도둑"
,
"solved_date"
:
"20200619"
},{
"problem_number"
:
"1285"
,
"problem_title"
:
"동전 뒤집기"
,
"solved_date"
:
"20200617"
},{
"problem_number"
:
"2138"
,
"problem_title"
:
"전구와 스위치"
,
"solved_date"
:
"20200617"
},{
"problem_number"
:
"1080"
,
"problem_title"
:
"행렬"
,
"solved_date"
:
"20200617"
},{
"problem_number"
:
"11399"
,
"problem_title"
:
"ATM"
,
"solved_date"
:
"20200616"
},{
"problem_number"
:
"1931"
,
"problem_title"
:
"회의실배정"
,
"solved_date"
:
"20200616"
},{
"problem_number"
:
"11047"
,
"problem_title"
:
"동전 0"
,
"solved_date"
:
"20200615"
},{
"problem_number"
:
"15666"
,
"problem_title"
:
"N과 M (12)"
,
"solved_date"
:
"20200614"
},{
"problem_number"
:
"15665"
,
"problem_title"
:
"N과 M (11)"
,
"solved_date"
:
"20200614"
},{
"problem_number"
:
"15664"
,
"problem_title"
:
"N과 M (10)"
,
"solved_date"
:
"20200614"
},{
"problem_number"
:
"15663"
,
"problem_title"
:
"N과 M (9)"
,
"solved_date"
:
"20200614"
},{
"problem_number"
:
"15657"
,
"problem_title"
:
"N과 M (8)"
,
"solved_date"
:
"20200614"
},{
"problem_number"
:
"15656"
,
"problem_title"
:
"N과 M (7)"
,
"solved_date"
:
"20200614"
},{
"problem_number"
:
"15655"
,
"problem_title"
:
"N과 M (6)"
,
"solved_date"
:
"20200614"
},{
"problem_number"
:
"15654"
,
"problem_title"
:
"N과 M (5)"
,
"solved_date"
:
"20200614"
},{
"problem_number"
:
"15652"
,
"problem_title"
:
"N과 M (4)"
,
"solved_date"
:
"20200614"
},{
"problem_number"
:
"15651"
,
"problem_title"
:
"N과 M (3)"
,
"solved_date"
:
"20200612"
},{
"problem_number"
:
"15650"
,
"problem_title"
:
"N과 M (2)"
,
"solved_date"
:
"20200612"
},{
"problem_number"
:
"15649"
,
"problem_title"
:
"N과 M (1)"
,
"solved_date"
:
"20200612"
},{
"problem_number"
:
"6603"
,
"problem_title"
:
"로또"
,
"solved_date"
:
"20200612"
},{
"problem_number"
:
"10971"
,
"problem_title"
:
"외판원 순회 2"
,
"solved_date"
:
"20200611"
},{
"problem_number"
:
"10819"
,
"problem_title"
:
"차이를 최대로"
,
"solved_date"
:
"20200611"
},{
"problem_number"
:
"10973"
,
"problem_title"
:
"이전 순열"
,
"solved_date"
:
"20200611"
},{
"problem_number"
:
"10974"
,
"problem_title"
:
"모든 순열"
,
"solved_date"
:
"20200611"
},{
"problem_number"
:
"10972"
,
"problem_title"
:
"다음 순열"
,
"solved_date"
:
"20200611"
},{
"problem_number"
:
"7576"
,
"problem_title"
:
"토마토"
,
"solved_date"
:
"20200608"
},{
"problem_number"
:
"1248"
,
"problem_title"
:
"맞춰봐"
,
"solved_date"
:
"20200312"
},{
"problem_number"
:
"2529"
,
"problem_title"
:
"부등호"
,
"solved_date"
:
"20200311"
},{
"problem_number"
:
"15661"
,
"problem_title"
:
"링크와 스타트"
,
"solved_date"
:
"20200311"
},{
"problem_number"
:
"14501"
,
"problem_title"
:
"퇴사"
,
"solved_date"
:
"20200311"
},{
"problem_number"
:
"1759"
,
"problem_title"
:
"암호 만들기"
,
"solved_date"
:
"20200310"
},{
"problem_number"
:
"14391"
,
"problem_title"
:
"종이 조각"
,
"solved_date"
:
"20200306"
},{
"problem_number"
:
"14889"
,
"problem_title"
:
"스타트와 링크"
,
"solved_date"
:
"20200305"
},{
"problem_number"
:
"1182"
,
"problem_title"
:
"부분수열의 합"
,
"solved_date"
:
"20200305"
},{
"problem_number"
:
"11723"
,
"problem_title"
:
"집합"
,
"solved_date"
:
"20200305"
},{
"problem_number"
:
"1748"
,
"problem_title"
:
"수 이어 쓰기 1"
,
"solved_date"
:
"20200305"
},{
"problem_number"
:
"6064"
,
"problem_title"
:
"카잉 달력"
,
"solved_date"
:
"20200305"
},{
"problem_number"
:
"1107"
,
"problem_title"
:
"리모컨"
,
"solved_date"
:
"20200305"
},{
"problem_number"
:
"3085"
,
"problem_title"
:
"사탕 게임"
,
"solved_date"
:
"20200305"
},{
"problem_number"
:
"2309"
,
"problem_title"
:
"일곱 난쟁이"
,
"solved_date"
:
"20200305"
},{
"problem_number"
:
"1748"
,
"problem_title"
:
"수 이어 쓰기 1"
,
"solved_date"
:
"20200228"
},{
"problem_number"
:
"14500"
,
"problem_title"
:
"테트로미노"
,
"solved_date"
:
"20200228"
},{
"problem_number"
:
"1107"
,
"problem_title"
:
"리모컨"
,
"solved_date"
:
"20200228"
},{
"problem_number"
:
"1476"
,
"problem_title"
:
"날짜 계산"
,
"solved_date"
:
"20200228"
},{
"problem_number"
:
"3085"
,
"problem_title"
:
"사탕 게임"
,
"solved_date"
:
"20200228"
},{
"problem_number"
:
"2309"
,
"problem_title"
:
"일곱 난쟁이"
,
"solved_date"
:
"20200228"
},{
"problem_number"
:
"1261"
,
"problem_title"
:
"알고스팟"
,
"solved_date"
:
"20200228"
},{
"problem_number"
:
"13549"
,
"problem_title"
:
"숨바꼭질 3"
,
"solved_date"
:
"20200227"
},{
"problem_number"
:
"14226"
,
"problem_title"
:
"이모티콘"
,
"solved_date"
:
"20200227"
},{
"problem_number"
:
"13913"
,
"problem_title"
:
"숨바꼭질 4"
,
"solved_date"
:
"20200227"
},{
"problem_number"
:
"1697"
,
"problem_title"
:
"숨바꼭질"
,
"solved_date"
:
"20200227"
},{
"problem_number"
:
"1967"
,
"problem_title"
:
"트리의 지름"
,
"solved_date"
:
"20200221"
},{
"problem_number"
:
"1167"
,
"problem_title"
:
"트리의 지름"
,
"solved_date"
:
"20200221"
},{
"problem_number"
:
"11725"
,
"problem_title"
:
"트리의 부모 찾기"
,
"solved_date"
:
"20200221"
},{
"problem_number"
:
"2250"
,
"problem_title"
:
"트리의 높이와 너비"
,
"solved_date"
:
"20200221"
},{
"problem_number"
:
"1991"
,
"problem_title"
:
"트리 순회"
,
"solved_date"
:
"20200221"
},{
"problem_number"
:
"7562"
,
"problem_title"
:
"나이트의 이동"
,
"solved_date"
:
"20200220"
},{
"problem_number"
:
"2178"
,
"problem_title"
:
"미로 탐색"
,
"solved_date"
:
"20200220"
},{
"problem_number"
:
"4963"
,
"problem_title"
:
"섬의 개수"
,
"solved_date"
:
"20200219"
},{
"problem_number"
:
"2667"
,
"problem_title"
:
"단지번호붙이기"
,
"solved_date"
:
"20200219"
},{
"problem_number"
:
"1707"
,
"problem_title"
:
"이분 그래프"
,
"solved_date"
:
"20200217"
},{
"problem_number"
:
"11724"
,
"problem_title"
:
"연결 요소의 개수"
,
"solved_date"
:
"20200214"
},{
"problem_number"
:
"1260"
,
"problem_title"
:
"DFS와 BFS"
,
"solved_date"
:
"20200214"
},{
"problem_number"
:
"13023"
,
"problem_title"
:
"ABCDE"
,
"solved_date"
:
"20200213"
},{
"problem_number"
:
"11652"
,
"problem_title"
:
"카드"
,
"solved_date"
:
"20200210"
},{
"problem_number"
:
"1377"
,
"problem_title"
:
"버블 소트"
,
"solved_date"
:
"20200210"
},{
"problem_number"
:
"11004"
,
"problem_title"
:
"K번째 수"
,
"solved_date"
:
"20200210"
},{
"problem_number"
:
"10825"
,
"problem_title"
:
"국영수"
,
"solved_date"
:
"20200210"
},{
"problem_number"
:
"2751"
,
"problem_title"
:
"수 정렬하기 2"
,
"solved_date"
:
"20200210"
},{
"problem_number"
:
"9461"
,
"problem_title"
:
"파도반 수열"
,
"solved_date"
:
"20200205"
},{
"problem_number"
:
"1699"
,
"problem_title"
:
"제곱수의 합"
,
"solved_date"
:
"20200205"
},{
"problem_number"
:
"9095"
,
"problem_title"
:
"1, 2, 3 더하기"
,
"solved_date"
:
"20200205"
},{
"problem_number"
:
"2225"
,
"problem_title"
:
"합분해"
,
"solved_date"
:
"20200205"
},{
"problem_number"
:
"2133"
,
"problem_title"
:
"타일 채우기"
,
"solved_date"
:
"20200204"
},{
"problem_number"
:
"11727"
,
"problem_title"
:
"2×n 타일링 2"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"11726"
,
"problem_title"
:
"2×n 타일링"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"1463"
,
"problem_title"
:
"1로 만들기"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"2748"
,
"problem_title"
:
"피보나치 수 2"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"2747"
,
"problem_title"
:
"피보나치 수"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"11656"
,
"problem_title"
:
"접미사 배열"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"10824"
,
"problem_title"
:
"네 수"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"2743"
,
"problem_title"
:
"단어 길이 재기"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"10820"
,
"problem_title"
:
"문자열 분석"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"10808"
,
"problem_title"
:
"알파벳 개수"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"11655"
,
"problem_title"
:
"ROT13"
,
"solved_date"
:
"20200203"
},{
"problem_number"
:
"11720"
,
"problem_title"
:
"숫자의 합"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"1008"
,
"problem_title"
:
"A/B"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"10951"
,
"problem_title"
:
"A+B - 4"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"2557"
,
"problem_title"
:
"Hello World"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"1021"
,
"problem_title"
:
"회전하는 큐"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"1966"
,
"problem_title"
:
"프린터 큐"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"2164"
,
"problem_title"
:
"카드2"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"10799"
,
"problem_title"
:
"쇠막대기"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"17413"
,
"problem_title"
:
"단어 뒤집기 2"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"10866"
,
"problem_title"
:
"덱"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"1158"
,
"problem_title"
:
"요세푸스 문제"
,
"solved_date"
:
"20200131"
},{
"problem_number"
:
"10845"
,
"problem_title"
:
"큐"
,
"solved_date"
:
"20200130"
},{
"problem_number"
:
"1406"
,
"problem_title"
:
"에디터"
,
"solved_date"
:
"20200130"
},{
"problem_number"
:
"1874"
,
"problem_title"
:
"스택 수열"
,
"solved_date"
:
"20200130"
},{
"problem_number"
:
"9012"
,
"problem_title"
:
"괄호"
,
"solved_date"
:
"20200130"
},{
"problem_number"
:
"9093"
,
"problem_title"
:
"단어 뒤집기"
,
"solved_date"
:
"20200130"
},{
"problem_number"
:
"10828"
,
"problem_title"
:
"스택"
,
"solved_date"
:
"20200129"
},{
"problem_number"
:
"11721"
,
"problem_title"
:
"열 개씩 끊어 출력하기"
,
"solved_date"
:
"20200126"
},{
"problem_number"
:
"11719"
,
"problem_title"
:
"그대로 출력하기 2"
,
"solved_date"
:
"20200126"
},{
"problem_number"
:
"11718"
,
"problem_title"
:
"그대로 출력하기"
,
"solved_date"
:
"20200126"
},{
"problem_number"
:
"10953"
,
"problem_title"
:
"A+B - 6"
,
"solved_date"
:
"20200126"
},{
"problem_number"
:
"2558"
,
"problem_title"
:
"A+B - 2"
,
"solved_date"
:
"20200126"
},{
"problem_number"
:
"10814"
,
"problem_title"
:
"나이순 정렬"
,
"solved_date"
:
"20200123"
},{
"problem_number"
:
"1181"
,
"problem_title"
:
"단어 정렬"
,
"solved_date"
:
"20200122"
},{
"problem_number"
:
"11651"
,
"problem_title"
:
"좌표 정렬하기 2"
,
"solved_date"
:
"20200122"
},{
"problem_number"
:
"11650"
,
"problem_title"
:
"좌표 정렬하기"
,
"solved_date"
:
"20200122"
},{
"problem_number"
:
"1427"
,
"problem_title"
:
"소트인사이드"
,
"solved_date"
:
"20190823"
},{
"problem_number"
:
"2108"
,
"problem_title"
:
"통계학"
,
"solved_date"
:
"20190823"
},{
"problem_number"
:
"10989"
,
"problem_title"
:
"수 정렬하기 3"
,
"solved_date"
:
"20190823"
},{
"problem_number"
:
"2751"
,
"problem_title"
:
"수 정렬하기 2"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"2750"
,
"problem_title"
:
"수 정렬하기"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"1436"
,
"problem_title"
:
"영화감독 숌"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"1018"
,
"problem_title"
:
"체스판 다시 칠하기"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"7568"
,
"problem_title"
:
"덩치"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"2231"
,
"problem_title"
:
"분해합"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"2798"
,
"problem_title"
:
"블랙잭"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"1002"
,
"problem_title"
:
"터렛"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"3053"
,
"problem_title"
:
"택시 기하학"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"4153"
,
"problem_title"
:
"직각삼각형"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"3009"
,
"problem_title"
:
"네 번째 점"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"1085"
,
"problem_title"
:
"직사각형에서 탈출"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"9020"
,
"problem_title"
:
"골드바흐의 추측"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"4948"
,
"problem_title"
:
"베르트랑 공준"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"1929"
,
"problem_title"
:
"소수 구하기"
,
"solved_date"
:
"20190814"
},{
"problem_number"
:
"2581"
,
"problem_title"
:
"소수"
,
"solved_date"
:
"20190811"
},{
"problem_number"
:
"1978"
,
"problem_title"
:
"소수 찾기"
,
"solved_date"
:
"20190811"
},{
"problem_number"
:
"2292"
,
"problem_title"
:
"벌집"
,
"solved_date"
:
"20190811"
},{
"problem_number"
:
"6064"
,
"problem_title"
:
"카잉 달력"
,
"solved_date"
:
"20190811"
},{
"problem_number"
:
"2775"
,
"problem_title"
:
"부녀회장이 될테야"
,
"solved_date"
:
"20190811"
},{
"problem_number"
:
"10250"
,
"problem_title"
:
"ACM 호텔"
,
"solved_date"
:
"20190811"
},{
"problem_number"
:
"2869"
,
"problem_title"
:
"달팽이는 올라가고 싶다"
,
"solved_date"
:
"20190811"
},{
"problem_number"
:
"1011"
,
"problem_title"
:
"Fly me to the Alpha Centauri"
,
"solved_date"
:
"20190811"
},{
"problem_number"
:
"1193"
,
"problem_title"
:
"분수찾기"
,
"solved_date"
:
"20190810"
},{
"problem_number"
:
"2839"
,
"problem_title"
:
"설탕 배달"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"1712"
,
"problem_title"
:
"손익분기점"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"1316"
,
"problem_title"
:
"그룹 단어 체커"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"2941"
,
"problem_title"
:
"크로아티아 알파벳"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"5622"
,
"problem_title"
:
"다이얼"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"2908"
,
"problem_title"
:
"상수"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"1152"
,
"problem_title"
:
"단어의 개수"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"1157"
,
"problem_title"
:
"단어 공부"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"2675"
,
"problem_title"
:
"문자열 반복"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"10809"
,
"problem_title"
:
"알파벳 찾기"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"11720"
,
"problem_title"
:
"숫자의 합"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"11654"
,
"problem_title"
:
"아스키 코드"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"11729"
,
"problem_title"
:
"하노이 탑 이동 순서"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"2447"
,
"problem_title"
:
"별 찍기 - 10"
,
"solved_date"
:
"20190809"
},{
"problem_number"
:
"3052"
,
"problem_title"
:
"나머지"
,
"solved_date"
:
"20190807"
},{
"problem_number"
:
"10818"
,
"problem_title"
:
"최소, 최대"
,
"solved_date"
:
"20190807"
},{
"problem_number"
:
"10872"
,
"problem_title"
:
"팩토리얼"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"10870"
,
"problem_title"
:
"피보나치 수 5"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"1065"
,
"problem_title"
:
"한수"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"4673"
,
"problem_title"
:
"셀프 넘버"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"15596"
,
"problem_title"
:
"정수 N개의 합"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"4344"
,
"problem_title"
:
"평균은 넘겠지"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"2920"
,
"problem_title"
:
"음계"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"8958"
,
"problem_title"
:
"OX퀴즈"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"1546"
,
"problem_title"
:
"평균"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"2577"
,
"problem_title"
:
"숫자의 개수"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"2562"
,
"problem_title"
:
"최댓값"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"1110"
,
"problem_title"
:
"더하기 사이클"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"10951"
,
"problem_title"
:
"A+B - 4"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"10952"
,
"problem_title"
:
"A+B - 5"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"10871"
,
"problem_title"
:
"X보다 작은 수"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"2439"
,
"problem_title"
:
"별 찍기 - 2"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"2438"
,
"problem_title"
:
"별 찍기 - 1"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"11022"
,
"problem_title"
:
"A+B - 8"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"11021"
,
"problem_title"
:
"A+B - 7"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"2742"
,
"problem_title"
:
"기찍 N"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"2741"
,
"problem_title"
:
"N 찍기"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"15552"
,
"problem_title"
:
"빠른 A+B"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"8393"
,
"problem_title"
:
"합"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"10950"
,
"problem_title"
:
"A+B - 3"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"2739"
,
"problem_title"
:
"구구단"
,
"solved_date"
:
"20190628"
},{
"problem_number"
:
"10817"
,
"problem_title"
:
"세 수"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"2884"
,
"problem_title"
:
"알람 시계"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"2753"
,
"problem_title"
:
"윤년"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"9498"
,
"problem_title"
:
"시험 성적"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"1330"
,
"problem_title"
:
"두 수 비교하기"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"2588"
,
"problem_title"
:
"곱셈"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"10430"
,
"problem_title"
:
"나머지"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"10869"
,
"problem_title"
:
"사칙연산"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"1008"
,
"problem_title"
:
"A/B"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"10998"
,
"problem_title"
:
"A×B"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"7287"
,
"problem_title"
:
"등록"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"10172"
,
"problem_title"
:
"개"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"10171"
,
"problem_title"
:
"고양이"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"10718"
,
"problem_title"
:
"We love kriii"
,
"solved_date"
:
"20190627"
},{
"problem_number"
:
"1001"
,
"problem_title"
:
"A-B"
,
"solved_date"
:
"20190607"
},{
"problem_number"
:
"1000"
,
"problem_title"
:
"A+B"
,
"solved_date"
:
"20190607"
},{
"problem_number"
:
"2557"
,
"problem_title"
:
"Hello World"
,
"solved_date"
:
"20190607"
}]
...
...
Please
register
or
login
to post a comment