Problem


Given a rectangular matrix of characters, add a border of asterisks(*) to it.


Example


For

picture = ["abc",
           "ded"]

the output should be

addBorder(picture) = ["*****",
                      "*abc*",
                      "*ded*",
                      "*****"]


Input/Output

  • [input] array.string picture

    A non-empty array of non-empty equal-length strings.

    Guaranteed constraints:
    1 ≤ picture.length ≤ 100,
    1 ≤ picture[i].length ≤ 100.

  • [output] array.string

    The same matrix of characters, framed with a border of asterisks of width 1.



Solution

def addBoarder(picture):

lst = []


lst.append("*" * len(picture[0] + 2))

for i in picture:

i = "*" + i + "*"

lst.append(i)

lst.append("*" * len(picture[0] + 2))


return lst


*lst : 애스터리스크(*)를 포함하여 저장할 리스트 변수입니다.

'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] arrayChange  (0) 2018.02.26
[Algorithm] areSimilar  (0) 2018.02.26
[Algorithm] alternatingSums  (0) 2018.02.26
[Algorithm] reverseParentheses  (0) 2018.02.20
[Algorithm] sortByHeight  (0) 2018.02.09

Example


Several people are standing in a row and need to be divided into two teams. The first person goes into team 1, the second goes into team 2, the third goes into team 1 again, the fourth into team 2, and so on.

You are given an array of positive integers - the weights of the people. Return an array of two integers, where the first element is the total weight of team 1, and the second element is the total weight of team 2 after the division is complete.


Example


For a = [50, 60, 60, 45, 70], the output should be
alternatingSums(a) = [180, 105].


Input/Output

  • [input] array.integer a

    Guaranteed constraints:
    1 ≤ a.length ≤ 10,
    45 ≤ a[i] ≤ 100.

  • [output] array.integer



Solution

def alternatingSums(a):

lst = [a[i] for i in range(len(a)) if i == 0 or i % 2 == 0]

lst2 = [a[i] for i in range(len(a)) if a[i] not in lst]


return [sum(lst), sum(lst2)]


*lst : 짝수번째에 해당하는 숫자를 저장하는 리스트입니다.

*lst2 : 홀수번째에 해당하는 숫자를 저장하는 리스트입니다.



'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] areSimilar  (0) 2018.02.26
[Algorithm] addBoarder  (0) 2018.02.26
[Algorithm] reverseParentheses  (0) 2018.02.20
[Algorithm] sortByHeight  (0) 2018.02.09
[Algorithm] isLucky  (0) 2018.02.09

Problem


You have a string s that consists of English letters, punctuation marks, whitespace characters, and brackets. It is guaranteed that the parentheses in s form a regular bracket sequence.

Your task is to reverse the strings contained in each pair of matching parentheses, starting from the innermost pair. The results string should not contain any parentheses.


Example


For string s = "a(bc)de", the output should be
reverseParentheses(s) = "acbde".


Input/Output

  • [input] string s

    A string consisting of English letters, punctuation marks, whitespace characters and brackets. It is guaranteed that parentheses form a regular bracket sequence.

    Constraints:
    5 ≤ s.length ≤ 55.

  • [output] string



Solution

def reverseParentheses(s):

for i in range(len(s)):

if s[i] == '(':

start_idx = i

elif s[i] == ')':

end_idx = i

return reverseParentheses(s[:start_idx] + s[start_idx + 1:end_idx][::-1] + s[end_idx + 1:]

return s


*start_idx : 괄호가 시작하는 부분의 인덱스를 저장하는 변수입니다.

*end_idx : 괄호가 끝나는 부분의 인덱스를 저장하는 변수입니다.


괄호 사이에 위치한 문자를 거꾸로 배열하여 전체 문장을 반환하는 문제였습니다.

Input값에서 괄호가 한 번씩만 등장한다면 문제가 수월해지겠으나, 한 번씩만 등장한다는 전제조건은 없기 때문에 재귀 함수를 사용하여 문제를 해결하였습니다.


'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] addBoarder  (0) 2018.02.26
[Algorithm] alternatingSums  (0) 2018.02.26
[Algorithm] sortByHeight  (0) 2018.02.09
[Algorithm] isLucky  (0) 2018.02.09
[Algorithm] commonCharacterCount  (0) 2018.02.09


앞선 포스팅에서 애플리케이션의 뼈대를 만들어 보았습니다. 이제부터는 실제 개발 대상인 애플리케이션을 추가해 나가도록 하겠습니다.

애플리케이션 파일들을 담을 디렉토리와 애플리케이션 개발에 필요한 파일은 이미 만들었습니다. 파일에 우리가 원하는 내용들을 채워주기만 하면 됩니다.


우리가 개발하게 될 애플리케이션의 내용은 설문에 해당하는 질문을 보여주고, 질문에 포함되어 있는 답변 항목에 투표한 후, 투표 결과를 알려주는 예제입니다.






1. Application 개발 - Model 설계

  코딩을 시작하기 전, 애플리케이션의 로직을 설계해보도록 하겠습니다. 앞서 말씀드린 예제의 요구사항을 분석한 결과 3개의 페이지에 대한 개발이 필요하다고 생각했습니다.


1. index.html : 최근에 실시한 질문의 리스트를 표시합니다.

2. detail.html : 하나의 질문에 대해 투표할 수 있도록 답변 항목을 보여줍니다.

3. results.html : 질문에 따른 투표 결과를 표시합니다.


  위와 같은 요구사항을 반영하여 필요한 테이블을 설계하였습니다.
    • 모든 컬럼은 Null을 담을 수 없도록 했습니다.
    • PK는 자동 증가 속성으로 저장하였습니다.
    • Choice 테이블의 question_id 컬럼은 Question 테이블과 Foreign Key 관계로 연결되도록 했고, 또한 Index를 생성하도록 하였습니다.

< Question Table >

 컬럼명

타입 

제약 조건 

설명 

id 

integer 

NotNull, PK, AutoIncrement 

Primary Key 

question_text 

varchar(200) 

NotNull 

질문 문장 

pub_date 

datetime 

NotNull 

질문 생성 시각 

  질문을 저장하는 테이블입니다.


< Choice Table >

 컬럼명

타입 

제약 조건 

설명 

id 

integer 

NotNull, PK, AutoIncrement 

Primary Key 

choice_text 

varchar(200)

NotNull 

답변 항목 카운트 

votes 

integer 

NotNull 

투표 카운트 

question_id 

integer 

NotNull, FK(Question.id), Index

Foreign Key 

  질문별로 선택용 답변 항목을 저장하는 테이블입니다.






2. Application 개발 - Model 코딩

  모델 작업은 데이터베이스에 테이블을 생성하도록 해주는 작업입니다. 다음 순서대로 진행합니다.

1. vi settings.py

2. vi models.py

3. vi admin.py

4. python manage.py makemigrations

5. python manage.py migrate

6. python manage.py runserver



데이터베이스 확인 (settings.py 파일 설정하기)

  장고는 기본적으로 SQLite3 데이터베이스 엔진을 사용하도록 지정해줍니다. 만일 MySQL 이나 Oracle 등 다른 데이터베이스로 변경하고 싶다면 settings.py 파일에서 수정해주면 됩니다. settings.py 파일은 프로젝트의 전반적인 사항들을 설정해주는 곳으로, 루트 디렉토리를 포함한 각종 디렉토리의 위치, 로그의 형식, 프로젝트에 포함된 애플리케이션 등이 지정되어 있어서 그 내용에 익숙해질수록 장고의 모습을 이해하는 데 도움이 됩니다.

  해당 예제에서는 변경없이 SQLite3 데이터베이스를 사용하여 진행하도록 하기 때문에 설정된 사항을 변경없이 확인만 해보도록 하겠습니다.
  

$ cd ch3/mysite/

$ vi settings.py


  위의 명령어를 입력하여 settings.py 파일을 열고, 중간을 확인해보면 아래와 같이 SQLite3로 데이터베이스가 설정되어 있음을 확인할  수 있습니다.


  추가적으로 몇 가지 더 설정하도록 하겠습니다. 첫 번째로, 프로젝트에 포함되는 애플리케이션들은 모두 설정 파일에 지정되어야 합니다. 따라서, 우리가 개발하고 있는 polls 애플리케이션도 다음과 같이 등록해야 합니다. settings.py 파일 중간에 위치한 INSTALLED_APPS 의 대괄호 안에 polls를 입력해줍니다. 

INSTALLED_APPS = [

...,

'polls',

]



  두 번째로, 타임존이 최초에는 세계표준시로 설정되어 있는데, 한국 시간으로 변경하도록 하겠습니다.

기존 설정 : TIME_ZONE = 'UTC'

바꾼 설정 : TIME_ZONE = 'Asia/Seoul'




테이블 정의 (models.py 파일 설정하기)

앞서 설계한 것처럼, polls 애플리케이션은 Question과 Choice 두 개의 테이블이 필요합니다. 테이블은 models.py 파일에 정의합니다.

$ cd ch3/polls

$ vi models.py


  vi 명령을 사용하여 models.py 파일에 들어가면 아무 내용도 적혀 있지 않은 것을 확인할 수 있습니다.  그곳에 테이블을 설계한 내용에 따라 다음과 같이 입력합니다.   

from django.db import models


class Question(models.Model):

question_text = models.CharField(max_length = 200)

pub_data = models.DateTimeField('data published')


def __str__(self):

return self.question_text    # 이 함수는 객체를 스트링으로 표현할 때 사용하는 함수입니다.                                나중에 보게 될 Admin 사이트나 장고 쉘 등에서 테이블명을 보여줘야 하는데,                                이 함수를 정의하지 않으면 테이블명이 제대로 표시되지 않습니다.



class Choice(models.Model):

question = models.ForeignKey(Question)

choice_text = models.CharField(max_length = 200)

votes = models.IntegerField(default = 0)


def __str__(self):

return self.choice_text

  장고에서는 테이블을 하나의 클래스로 정의하고, 테이블의 컬럼은 클래스의 변수(속성)로 매핑합니다. 테이블 클래스는 django.db.models.Model 클래스를 상속받아 정의하고, 각 클래스 변수의 타입도 장고에서 미리 정의된 필드 클래스를 사용합니다. 


  장고에서 테이블을 설계할 때 몇 가지 유의할 사항은 다음과 같습니다.

  • PK는 클래스에 지정해주지 않아도, 장고는 항상 PK에 대한 속성을 Not Null 및 AutoIncrement로, 이름은 테이블명의 소문자를 접두어로하여 자동으로 생성합니다.
  • DateTimeField() 필드 클래스에 정의한 date published는 pub_date 컬럼에 대한 레이블 문구입니다. 나중에 설명하는 Admin 사이트에서 해당 문구를 확인할 수 있습니다.
  • FK는 항상 다른 테이블의 PK에 연결되므로, Question 클래스의 question_id까지 지정할 필요 없이 Question 클래스만 지정합니다.



Admin 사이트에 테이블 반영 (admin.py 파일 설정하기)

  admin 사이트에 접속해보면 현재까지는 장고에서 기본적으로 제공하는 Users, Groups 테이블만 보입니다. 이제 앞서 models.py 파일에서 정의한 테이블도 Admin 사이트에 보이도록 등록하겠습니다.

$ cd ch3/polls

$ vi admin.py


  models.py 모듈에서 정의한 Question, Choice 클래스를 import 하고, admin.site.register() 함수를 사용하여 임포트한 클래스를 Admin 사이트에 등록해주면 됩니다. 이와 같이 테이블을 새로 만들때는 models.py 와 admin.py 두 개의 파일을 함께 수정해야 합니다.

from django.contrib import admin

from polls.models import Question, Choice


admin.site.register(Question)

admin.site.register(Choice)



데이터베이스에 변경사항 반영

  테이블의 신규 생성, 테이블의 정의 변경 등 데이터베이스에 변경이 필요한 사항이 있으면, 이를 데이터베이스에 실제로 반영해주는 작업을 해야 합니다. 아직까지는 클래스로 테이블 정의만 변경한 상태입니다. 다음 명령으로 변경사항을 데이터베이스에 반영합니다.

$ cd ch3/

$ python manage.py makemigrations    # polls/migrations 디렉토리 하위에 마이그레이션 파일들이 생깁니다.

$ python manage.py migrate    # migrate 명령이 데이터베이스에 테이블을 생성합니다.


  migration 이라는 용어는 장고 1.7 버전부터 사용된 개념으로, 테이블 및 필드의 생성, 삭제, 변경 등과 같이 데이터베이스에 대한 변경사항을 알려주는 정보입니다. 물리적으로는 애플리케이션 디렉토리별로 마이그레이션 파일이 존재합니다. 즉, 우리 예제에서는 polls/migrations 디렉토리 하위에 마이그레이션 파일들이 존재합니다.

    


지금까지의 작업 확인

  지금까지 데이터베이스 관련 사항을 작업하였습니다. 즉, models.py 파일에 테이블을 정의하고 이를 데이터베이스에 반영하는 명령을 실행하였습니다. 또한 테이블을 Admin 사이트에도 등록하였습니다. 지금까지의 작업이 정상적으로 잘 처리되었는지 확인하기 위해 Admin 사이트로 접속해보도록 하겠습니다. 

  만일 runserver가 실행되지 않았다면, 앞서 설명한 것처럼 runserver를 실행시키고, 브라우저 주소창에 다음과 같이 입력합니다.

$ cd ch3/

$ python manage.py runserver 127.0.0.1:8000


http://127.0.0.1:8000/admin

  

  로그인 화면이 나오게 되는데, superuser를 생성하지 않았다면 다음과 같은 명령을 통해 슈퍼계정을 생성합니다.

$ cd ch3/

$ python manage.py createsuperuser


  로그인 화면에서 createsuperuser 명령으로 만든 관리자 Username / Password를 입력하여 로그인하면 다음과 같이 Users, Groups 이외에 우리가 추가한 테이블이 생성되어 있는 것을 확인할 수 있습니다.




Problem


Some people are standing in a row in a park. There are trees between them which cannot be moved. Your task is to rearrange the people by their heights in a non-descending order without moving the trees.


Example

For a = [-1, 150, 190, 170, -1, -1, 160, 180], the output should be
sortByHeight(a) = [-1, 150, 160, 170, -1, -1, 180, 190].


Input/Output

  • [input] array.integer a

    If a[i] = -1, then the ith position is occupied by a tree. Otherwise a[i] is the height of a person standing in the ith position.

    Guaranteed constraints:
    5 ≤ a.length ≤ 15,
    -1 ≤ a[i] ≤ 200.

  • [output] array.integer

    Sorted array a with all the trees untouched.


Solution

def sortByHeight(a):

lst = sorted([i for i in a if i > 0])

err_lst = [i for i in range(len(a)) if a[i] == -1]


for i in err_lst:

lst.insert(i, -1)


return lst


*lst : Input 리스트의 값 중 0 이상인 값들을 정렬한 리스트를 저장한 변수입니다.

*err_lst : Input 리스트의 값이 -1인 값들의 인덱스 값을 저장한 변수입니다.


-1을 제외한 나머지 숫자들만 정렬하는 문제입니다.

-1을 제외한 숫자들을 sort() 함수를 통해 정렬하고, -1에 해당하는 인덱스 값을 나중에 삽입하는 방식으로 문제 해결이 가능합니다. 

'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] alternatingSums  (0) 2018.02.26
[Algorithm] reverseParentheses  (0) 2018.02.20
[Algorithm] isLucky  (0) 2018.02.09
[Algorithm] commonCharacterCount  (0) 2018.02.09
[Algorithm] allLongestStrings  (0) 2018.02.09


Problem


Ticket numbers usually consist of an even number of digits. A ticket number is considered lucky if the sum of the first half of the digits is equal to the sum of the second half.

Given a ticket number n, determine if it's lucky or not.


Example

  • For n = 1230, the output should be
    isLucky(n) = true;
  • For n = 239017, the output should be
    isLucky(n) = false.


Input/Output

  • [input] integer n

    A ticket number represented as a positive integer with an even number of digits.

    Guaranteed constraints:
    10 ≤ n < 106.

  • [output] boolean

    true if n is a lucky ticket number, false otherwise.


Solution

def isLucky(n):

number = str(n)


sh = number[:int(len(number)/2)]

he = number[int(len(number)/2):]


return sum([int(i) for i in sh]) == sum([int(i) for i in he])


*number : 인덱스 슬라이싱을 하기 위해 integer로 들어오는 입력 값을 string으로 변환한 값을 저장하는 변수입니다.

*sh : start to half, 처음부터 중간까지 문자열을 저장하는 변수입니다.

*he : half to end : 중간부터 끝까지 문자열을 저장하는 변수입니다.

Input 값으로 입력된 숫자의 절반과 나머지의 합이 같은지를 판단하는 문제입니다.

인덱스 슬라이싱을 위해 Input값을 String으로 변환하고, 변환한 상태에서 절반씩 나누어 변수에 저장해주었습니다.

for문을 사용하여 각각의 숫자 값을 integer로 변환 후 리스트로 반환하고, 반환한 리스트를 더한 값을 서로 비교하여 문제를 해결할 수 있습니다.


'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] reverseParentheses  (0) 2018.02.20
[Algorithm] sortByHeight  (0) 2018.02.09
[Algorithm] commonCharacterCount  (0) 2018.02.09
[Algorithm] allLongestStrings  (0) 2018.02.09
[Algorithm] matrixElementsSum  (0) 2018.02.08


Problem


Given two strings, find the number of common characters between them.


Example

For s1 = "aabcc" and s2 = "adcaa", the output should be
commonCharacterCount(s1, s2) = 3.

Strings have 3 common characters - 2"a"s and 1 "c".


Input/Output

  • [input] string s1

    A string consisting of lowercase latin letters a-z.

    Guaranteed constraints:
    1 ≤ s1.length ≤ 15.

  • [input] string s2

    A string consisting of lowercase latin letters a-z.

    Guaranteed constraints:
    1 ≤ s2.length ≤ 15.

  • [output] integer


Solution

def commonCharacterCount(s1, s2):

return sum([min(s1.count(i), s2.count(i)) for i in set(s1)])

두 개의 입력 문자열 중 공통된 문자열을 취하여 개수를 반환하는 형태입니다.

만약 s1이 문자 'a'를 2개, s2가 1개를 가지고 있는 형태라면, 최소값인 s2의 개수가 선택됩니다.

위와 같은 개념을 활용하면 문제를 해결할 수 있습니다.


'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] sortByHeight  (0) 2018.02.09
[Algorithm] isLucky  (0) 2018.02.09
[Algorithm] allLongestStrings  (0) 2018.02.09
[Algorithm] matrixElementsSum  (0) 2018.02.08
[Algorithm] almostIncreasingSequence  (0) 2018.02.08


Problem


Given an array of strings, return another array containing all of its longest strings.


Example

For inputArray = ["aba", "aa", "ad", "vcd", "aba"], the output should be
allLongestStrings(inputArray) = ["aba", "vcd", "aba"].


Input/Output

  • [input] array.string inputArray

    A non-empty array.

    Guaranteed constraints:
    1 ≤ inputArray.length ≤ 10,
    1 ≤ inputArray[i].length ≤ 10.

  • [output] array.string

    Array of the longest strings, stored in the same order as in the inputArray.


Solution

def allLongestStrings(inputArray):

length = max([len(i) for i in inputArray])

return [i for i in inputArray if len(i) == length]

*length : string으로 구성된 inputArray 속의 문자열들에 대한 길이의 최대값을 저장하는 변수입니다.

최종적으로 length에 저장된 길이와 같은 문자열들을 반환하여 문제를 해결할 수 있습니다.


'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] isLucky  (0) 2018.02.09
[Algorithm] commonCharacterCount  (0) 2018.02.09
[Algorithm] matrixElementsSum  (0) 2018.02.08
[Algorithm] almostIncreasingSequence  (0) 2018.02.08
[Algorithm] makeArrayConsecutive2  (0) 2018.02.08


Problem

After they became famous, the CodeBots all decided to move to a new building and live together. The building is represented by a rectangular matrix of rooms. Each cell in the matrix contains an integer that represents the price of the room. Some rooms are free (their cost is 0), but that's probably because they are haunted, so all the bots are afraid of them. That is why any room that is free or is located anywhere below a free room in the same column is not considered suitable for the bots to live in.

Help the bots calculate the total price of all the rooms that are suitable for them.


Example

  • For
matrix = [[0, 1, 1, 2], 
          [0, 5, 0, 0], 
          [2, 0, 3, 3]]

the output should be
matrixElementsSum(matrix) = 9.

Here's the rooms matrix with unsuitable rooms marked with 'x':

[[x, 1, 1, 2], 
 [x, 5, x, x], 
 [x, x, x, x]]

Thus, the answer is 1 + 5 + 1 + 2 = 9.

  • For
matrix = [[1, 1, 1, 0], 
          [0, 5, 0, 1], 
          [2, 1, 3, 10]]

the output should be
matrixElementsSum(matrix) = 9.

Here's the rooms matrix with unsuitable rooms marked with 'x':

[[1, 1, 1, x], 
 [x, 5, x, x], 
 [x, 1, x, x]]

Note that the free room in the first row make the full column unsuitable for bots.

Thus, the answer is 1 + 1 + 1 + 5 + 1 = 9.


Input/Output

  • [input] array.array.integer matrix

    A 2-dimensional array of integers representing a rectangular matrix of the building.

    Guaranteed constraints:
    1 ≤ matrix.length ≤ 5,
    1 ≤ matrix[i].length ≤ 5,
    0 ≤ matrix[i][j] ≤ 10.

  • [output] integer

    The total price of all the rooms that are suitable for the CodeBots to live in.


Solution

def matrixElementsSum(matrix):

for i in range(len(matrix) - 1):

for j in range(len(matrix[0])):

if matrix[i][j] == 0:

matrix[i+1][j] = 0


return sum([sum(matrix[i]) for i in range(len(matrix))])

2차원 배열의 탐색을 위해 중첩 for문을 사용하였습니다. 

만약 [i][j]의 값이 0이라면, 그 아래에 위치하는 값을 0으로 바꾸는 방식으로 진행하였습니다.



'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] commonCharacterCount  (0) 2018.02.09
[Algorithm] allLongestStrings  (0) 2018.02.09
[Algorithm] almostIncreasingSequence  (0) 2018.02.08
[Algorithm] makeArrayConsecutive2  (0) 2018.02.08
[Algorithm] shapeArea  (0) 2018.02.08


Problem

Given a sequence of integers as an array, determine whether it is possible to obtain a strictly increasing sequence by removing no more than one element from the array.


Example

  • For sequence = [1, 3, 2, 1], the output should be
    almostIncreasingSequence(sequence) = false;

    There is no one element in this array that can be removed in order to get a strictly increasing sequence.

  • For sequence = [1, 3, 2], the output should be
    almostIncreasingSequence(sequence) = true.

    You can remove 3 from the array to get the strictly increasing sequence [1, 2]. Alternately, you can remove 2 to get the strictly increasing sequence [1, 3].


Input/Output

  • [input] array.integer sequence

    Guaranteed constraints:
    2 ≤ sequence.length ≤ 105,
    -105 ≤ sequence[i] ≤ 105.

  • [output] boolean

    Return true if it is possible to remove one element from the array in order to get a strictly increasing sequence, otherwise return false.


Solution

def almostIncreasingSequence(sequence):

count_decreasing_sq = 0


for i in range(len(sequence) - 1):

if count_decreasing_sq > 1:

return False

elif sequence[i] > sequence[i+1]:

count_decreasing_sq += 1

if i >= 1 and sequence[i+1] <= sequence[i-1]:

if len(sequence) - 2 > i and sequence[i+2] <= sequence[i]:

count_decreasing_sq += 1


return count_decreasing_sq <= 1

*count_decreasing_sq : 내림차순으로 이어지는 흐름의 개수를 저장하는 변수입니다. 이 변수를 통해 정상적인 흐름으로 진행하고 있는지를 판단합니다.

문제에서 하나의 수는 제거할 수 있다고 했으므로, 한 번의 비정상적은 흐름은 감수합니다. 만약 비정상적인 흐름이 2번 이상 발견된다면 False를 반환합니다.


'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] allLongestStrings  (0) 2018.02.09
[Algorithm] matrixElementsSum  (0) 2018.02.08
[Algorithm] makeArrayConsecutive2  (0) 2018.02.08
[Algorithm] shapeArea  (0) 2018.02.08
[Algorithm] adjacentElementsProduct  (0) 2018.02.08

+ Recent posts