요즘 카카오톡 클론코딩을 하고있다.


엘리트코스로 코딩을 배운게 아니라 html css 가 정말 많이 부족한것같다. 


특히 서버공부를 할때 템플릿엔진을 하면서 볼때마다 너무 구려서 ㅠㅠ...


피로그래밍 9기 1차 결과가 얼마 안 남았는데 너무 긴장된다.

앞에서 while 문으로 별찍기를 할때 시간이 좀 걸렸다.

자바로 할 때는 별찍기 예제를 할때는 항상 for 문만 이용했기 때문이다.

파이썬을 공부하면서 좋은 경험을 했다.

오늘은 for 문이다.



[문제1] 1부터 100까지 출력

1부터 100까지의 숫자를 for문을 이용하여 출력하시오.


>>> for i in range(1, 101):

...     print(i)


위 코드는 내가 짠 코드



[문제2] 5의 배수의 총합

for문을 이용하여 1부터 1000까지의 자연수 중 5의 배수에 해당되는 자연수들의 총합을 구하시오.


>>> sum = 0

>>> for i in range(1, 1001):

...     if i%5 ==0:

...             sum += i

...

>>> print(sum)

100500



[문제3] 학급의 평균 점수

for문을 이용하여 A 학급의 평균 점수를 구해 보자.

A = [70, 60, 55, 75, 95, 90, 80, 80, 85, 100]


>>> Sum = 0

>>> for score in A:

...     Sum += score

...

>>> average = Sum/len(A)

>>> print(average)

79.0




[문제4] 혈액형

다음은 학생들의 혈액형(A, B, AB, O)에 대한 데이터이다.

['A', 'B', 'A', 'O', 'AB', 'AB', 'O', 'A', 'B', 'O', 'B', 'AB']

for 문을 이용하여 각 혈액형 별 학생수의 합계를 구하시오.


>>> A = [a for a in Data if a == 'A']

>>> B = [b for b in Data if b == 'B']

>>> AB = [ab for ab in Data if ab == 'AB']

>>> O = [o for o in Data if o == 'O']


[문제5] 리스트 내포1

리스트 중에서 홀수에만 2를 곱하여 저장하는 다음과 같은 코드가 있다.

numbers = [1, 2, 3, 4, 5]

result = []
for n in numbers:
    if n % 2 == 1:
        result.append(n*2)

위 코드를 리스트 내포(list comprehension)를 이용하여 표현하시오.




[문제6] 리스트 내포2

리스트 내포를 이용하여 다음 문장에서 모음('aeiou')을 제거하시오.

Life is too short, you need python




[문제1] 1부터 100까지 더하기

1부터 100까지의 자연수를 모두 더하고 그 결과를 출력하시오.


>>> Sum = 0

>>> i = 1

>>> while i <= 100:

...     Sum += i

...     i += 1

...

>>> print(Sum)

5050



[문제2] 3의 배수의 합

1부터 1000까지의 자연수 중 3의 배수의 합을 구하시오.



>>> result = 0

>>> i =1

>>> while i <= 1000:

...     if i%3 == 0:

...             result += i

...     i += 1

...

>>> print (result)




[문제3] 50점 이상의 총합

다음은 A학급 학생의 점수를 나타내는 리스트이다. 다음 리스트에서 50점 이상의 점수들의 총합을 구하시오.

A = [20, 55, 67, 82, 45, 33, 90, 87, 100, 25]



>>>

>>> i = 0

>>> sum = 0

>>> while i < 10:

...     if A[i] >= 50:

...             sum += A[i]

...     i += 1

...

>>> print(sum)

481



[문제4] 별 표시하기1

while문을 이용하여 아래와 같이 별(*)을 표시하는 프로그램을 작성해 보자.

*
**
***
****



>>> i = 1

>>> a = 1

>>> while i <= 5:

...     if a <= i:

...             print(i*'*')

...     i += 1

...

*

**

***

****

*****

>>>

위에 코드는 내가 푼것!


i = 0 while True: i += 1 # while문 수행 시 1씩 증가 if i > 5: break # i 값이 5보다 크면 while문을 벗어난다. print ('*' * i) # i 값 개수만큼 *를 출력한다.


위 코드는 해설

while 문은 true 를 이용하면 편하다.


>>> i = 0

>>> while True:

...     if i >= 5:break

...     print(i*' '+'*')

...     i += 1




[문제5] 별 표시하기2

while문을 이용하여 아래와 같이 별(*)을 표시하는 프로그램을 작성해 보자.

*******
 *****
  ***
   *




>>> i = 0

>>> while True:

...     if i >=5:break

...     b =-2*i+7

...     print(i*' '+b*'*')

...     i += 1

...

*******

 *****

  ***

   *


위 코드는 내가 만든 코드



star = 7 # 별의 갯수 space = 0 # 공백의 갯수 while star > 0: print(' ' * space + '*' * star) # 공백 + 별 출력 star -= 2 # 별의 갯수는 2씩 감소 space += 1 # 공백의 갯수는 1씩 증가


위 코드는 해설 코드


내가만든코드가 더 좋은거같다...ㅋㅋ 뿌듯

현재 nodejs 로 로그인 연습을 하고 있다. 그런데 비밀번호는 무조건 암호화를 해야한다는 사실을 알게 되었다.

(어찌보면 당연한 이야기 ㅋㅋㅋ....)

자세히는 모르지만 CRYPTO 라는 방식을 이용해서 간단하게 비밀번호를 암호화 하는 방법을 알아봤다.



먼저 CRYPTO 를 사용하기 전 CRYPTO 모듈설치를 해야한다. 

터미널에서 npm install --save crypto 를 해주고 paxkage.json 에 잘 설치 되었다 확인한 뒤 모듈을 사용하면 된다.


const crypto = require('crypto')


이렇게 적어 주면 사용할 준비가 완료.



암호화는 단방향 암호화와 양방향 암호화가 있다. 단방향 암호화에 대하여 알아 볼 건데 단방향 암호화는 복호화 할 수 없는 암호화 방법이다. 

즉, 암호화된 문자열을 다시 원래 문자열로 돌려놓을 수 없다는 뜻이다. 따라서 단방향 암호화는 한 번 암호화하면 복호화할 수 없다.



crypto를 이용해서 단방향 암호화를 할 것 이다.

먼저 크립토 모듈을 불러와서 createHash 메소드를 사용한다.

먼저 기본 틀은 이렇다.


crypto.createHash(1).update(2).digest(3)



createHash 의 1에는 어떠한 알고리즘으로 암호화를 할 것인지 정하는 것인데 ( sha256, sha512 등이 있음 ) 나는 sha512 를 사용하겠다.


crypto.createHash('sha512').update(2).digest(3)



그다음 update 옆에 2에는 어떤 것을 암호화 할 것인지를 정해주면 된다.  비밀번호를 하나하나 다 치진 않을 것이기 때문에 변수 pw 를 넣어줬다. 



crypto.createHash('sha512').update(pw).digest(3)



 마지막으로 암호화된 문자열을 표시할지를 정해준다. ( base64, hex, latin1 등의 방식이 있다.)  나는 hex 방식을 사용하겠다.



crypto.createHash('sha512').update(pw).digest('hex')


이렇게 해준 뒤



function createPW(pw) {

  return crypto.createHash('sha512').update(pw).digest('hex')

}



함수로 묶어주면 암호화 하고싶은 비밀번호가 생길때마다 함수를 호출해주기만 하면 끝이다.

1. js 에서 코드 다듬기



const uname = req.body.username;

const pwd = req.body.password;

 

이렇게 긴 코드를


const { username:uname, password:pwd } = req.body;


이렇게 한줄로 바꿀 수 있었다.








[문제1] 조건문1

홍길동씨는 5,000원의 돈을 가지고 있고 카드는 없다고 한다. 이러한 홍길동씨의 상태는 아래와 같이 표현할 수 있을 것이다.

>>> money = 5000
>>> card = False

홍길동씨는 택시를 타고 목적지까지 가려고 한다. 목적지까지 가기 위해서는 카드를 소유하고 있거나 4,000원의 택시요금이 필요하다고 한다. 홍길동씨는 택시를 탈 수 있는지를 판별할 수 있는 조건식을 작성하고 그 결과를 출력하시오.


>>> if card or money >= 4000:

...     print("U can use TAXI")

...

U can use TAXI


[문제2] 조건문2

홍길동씨의 행운권 번호는 23번 이라고 한다. 다음은 행운권 당첨번호 리스트이다.

>>> lucky_list = [1, 9, 23, 46]

홍길동씨가 당첨되었다면 “야호”라는 문자열을 출력하는 프로그램을 작성하시오.


>>> lucky_list = [1, 9, 23, 46]

>>> if 23 in lucky_list:

...     print("야호")

...

야호



[문제3] 홀수 짝수 판별

주어진 수가 짝수인지 홀수인지 판별하는 프로그램을 작성하시오.

>>> a = 12

>>> if a%2 ==1:

...     print("홀수")

... elif a%2 == 0:

...     print("짝수")

...

짝수


[문제4] 문자열 분석

다음 문자열을 분석하여 나이가 30미만이고 키가 175이상인 경우에는 YES를 출력하고 아닌 경우에는 NO를 출력하는 프로그램을 작성하시오.

나이:30,키:180


>>> if 나이 < 30 and 키 >= 175:

...     print("yes")

... else:

...     print("NO")

...

NO



[문제5] 조건문3

다음 코드의 결과값은 무엇일까?

>>> a = "Life is too short, you need python"
>>> if 'wife' in a:
...     print('wife')
... elif 'python' in a and 'you' not in a:
...     print('python')
... elif 'shirt' not in a:
...     print('shirt')
... elif 'need' in a:
...     print('need')
... else:
...     print('none')


shirt


튜플 vs 리스트


1. 리스트는 항목값이 변화 가능함.

2. 튜플은 항목값이 변화가 불가능 함. 따라서 값이 변하지 않길 원한다면 튜플을 써야한다.



 [문제1] 튜플 작성

숫자 3만을 요소값으로 가지는 튜플을 작성하라.


a = (3,) 1개의 요소값 갖는 튜플은 항상 콤마 포함하기!

a  = 3, 도 가능!



[문제2] 튜플 변경

다음은 튜플 (1, 2, 3)을 (1, 4, 3)과 같이 변경하려고 시도했을 경우이다. 오류의 원인에 대해서 설명하시오.

>>> a = (1, 2, 3)
>>> a[1] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment


튜플은 리스트와 다르게 항목값 변경이 불가능하다. 따라서 오류가 나온것.



[문제3] 튜플 추가

(1,2,3)이라는 튜플에 4라는 값을 추가하여 (1,2,3,4)처럼 만들어 출력해 보자.


a = (1,2,3)

a = a + (4,)

해주면 

a 는 (1,2,3,4) 가 완성 된다.


일단 Mysql 로 DB 를 다루기 전에 그냥 파일로 저장해봤다. 

로그인 완료창이랑 로그아웃때 템플릿엔진으로 좀 괜찮은 디자인을 사용하고 싶은데

디자인하는거는 너무 어려워서 나중에 디자이너한테 부탁해야겠다. 

디자인이 일단 너무 구림...


코딩하기 전 구상... 와 글씨 너무 끔찍하다 아무리 나 혼자 보는거지만...






코드...




var express = require('express')

var session = require('express-session')

var MySQLStore = require('express-mysql-session')(session)

var bodyParser = require('body-parser')

var app = express()

app.use(bodyParser.urlencoded({ extended: false }));

app.use(session({

  secret: 'djqiowjd2212@@!sd32dk9023kjd09j',

  resave: false,

  saveUninitialized: true,

  store:new MySQLStore({

    host: 'localhost',

    port: 3306,

    user: 'root',

    password: 'root',

    database: 'adopt'

  })

}));


app.set('view engine', 'ejs')

app.set('views', './views')


app.get('/adopt_login', function(req, res){

  res.render('view')

})


app.get('/adopt_logout', function(req, res){

  delete req.session.displayName;

  res.redirect('/welcome')

})


var users =[

  {

    username:'Jeong',

    password:'111',

    displayName:'Jeong'

  }

];


app.post('/adopt_login', function(req, res){

  var uname = req.body.username;

  var pwd = req.body.password;

  for(var i=0; i<users.length; i++){

    var user = users[i];

    if(uname === user.username && pwd === user.password){

      req.session.displayName = user.displayName;

      return res.redirect('/welcome');

    }

  }

    res.send('Who are u <a href="/Adopt_login">Login</a>');

});


app.get('/welcome', function(req, res){

  if(req.session.displayName){

    res.send(`

      <h1>Hello, ${req.session.displayName}</h1>

      <a href="/adopt_logout">logout</a>

      `)

  } else {

    res.send(`

      <h1>Welcome</h1>

      <a href="/adopt_login">Login</a><br>

      <a href="/adopt_register">Register</a>

    `);

  }

})


app.get('/adopt_register', function(req, res){

  var output=`

  <h1>Register</h1>

  <form action="/adopt_register" method="post">

    <p>

      <input type="text" name="username" placeholder="username"

    </p>

    <p>

      <input type="password" name="password" placeholder="password"

    </p>

    <p>

      <input type="text" name="displayName" placeholder="displatName"

    </p>

    <p>

      <input type = "submit">

    </p>

  </form>

  `

  res.send(output)

})


app.post('/adopt_register', function(req, res){

  users.push({

    username:req.body.username,

    password:req.body.password,

    displayName:req.body.displayName

  })

  req.session.displayName = req.body.displayName;

  req.session.save(function(){

    res.redirect('/welcome')

  })

})


app.listen(3003, function(){

  console.log('Connected 3003!');

});



느낀점...

실제 서비스를 이용할때는 파일로 DB 관리를 하면 전혀 실용적이지 않을 것같다.

포트연결이 끊어지는 순간 다 휘발...

sql 로 빨리 만들어봐야겠다.



리스트 자료형에 대한 정리.


[문제1] 리스트 인덱싱

다음과 같은 리스트 a가 있다.

>>> a = ['Life', 'is', 'too', 'short', 'you', 'need', 'python']

a 리스트를 이용하여 다음과 같은 문자열을 출력하시오.

you too


-> 풀이

a[4]+' '+a[2] 




[문제2] 리스트 조인

['Life', 'is', 'too', 'short'] 라는 리스트를 Life is too short라는 문자열로 만들어 출력해 보자.





[문제3] 리스트의 갯수

다음과 같은 리스트 a가 있다.

>>> a = [1, 2, 3]

이 리스트의 갯수(사이즈)를 구하시오.


[문제4] 리스트의 append와 extend

다음과 같은 리스트 a가 있다.

>>> a = [1, 2, 3]

리스트 a에 [4, 5]를 append 했을 때와 extend했을 때의 차이점은 무엇인가?


-> 풀이

a.append([4, 5]) 를 하면 a = [ 1, 2, 3, [4, 5] ]

a.extend([4, 5]) 를 하면 a = [ 1, 2, 3, 4, 5 ]

로나온다


즉, 리스트의 append 함수는 한 개의 값을 추가하는 함수이다. 여기서 사용된 한 개의 값은 [4, 5]라는 리스트이므로 리스트 a에 [4, 5]라는 리스트가 가장 마지막에 추가된 것이다.

반면 expend 함수는 리스트값에 입력받은 리스트를 더하는 함수이다. 따라서 [ 1, 2, 3, 4, 5 ] 가 나온다.




[문제5] 리스트 정렬

[1, 3, 5, 4, 2]라는 리스트를 [5, 4, 3, 2, 1]로 만들어보자. (힌트. 리스트의 내장함수인 sort와 reverse를 활용해 보자.)

먼저 a = [1,3,5,4,2] 로 리스트값을 준다.

그 다음 순서가 엉망 진창이니까 a.sort() 로 순서를 맞춰주면 a = [ 1,2,3,4,5 ]

가 된다.

그리고 순서를 뒤집어야 하기에 a.reverse() 를 해주면서 a = [ 5,4,3,2,1 ] 이 완성된다.




[문제6] 리스트 삭제

[1, 2, 3, 4, 5]라는 리스트를 [1, 3, 5]로 만들어 보자.


먼저 remove 함수를 사용한다.

a.remove(2) 로 2삭제

a.remove(4) 로 4삭제


그러면 a = [1,3,5] 가남는다.

Python 의 숫자 자료형같은 경우 자바나 C# 과 비슷해서 큰 어려움이 없었다.


1. ** 연산자의 경우 제곱을 나타낸다.


>>> a = 3 >>> b = 4 >>> a ** b 81


2. // 연산자의 경우 소숫점의 아랫자리를 버려준다.


>>> 7 // 4 1


반면 / 연산자의 경우 소숫점 아랫자리를 보존한다.


>>> 7 / 4 1.75


3. % 연산자는 나머지를 반환 해 준다.


>>> 7 % 3 1 >>> 3 % 7 3



+ Recent posts