오늘은.. 진짜 일찍 잔다.
일찍 자려면 얼른 오늘 할 일들을 끝내자.
오늘 한 일은,
- 파이썬 공부
- 개인 퀘스트(달리기반) - [Python 응용하기] Lv3. 단어 맞추기 게임
- SQL 공부
- [SQLD 자격증 챌린지] 13주차 수강
파이썬 공부 : 개인 퀘스트(달리기반) - [Python 응용하기]
Lv3. 단어 맞추기 게임
Q1. 컴퓨터가 랜덤으로 영어단어를 선택하여 영어 단어의 자릿수를 알려준다.
import random
words = [
"airplane",
"apple",
"arm",
"bakery",
"banana",
"bank",
"bean",
"belt",
"bicycle",
"biography",
"blackboard",
"boat",
"bowl",
"broccoli",
"bus",
"car",
"carrot",
"chair",
"cherry",
"cinema",
"class",
"classroom",
"cloud",
"coat",
"cucumber",
"desk",
"dictionary",
"dress",
"ear",
"eye",
"fog",
"foot",
"fork",
"fruits",
"hail",
"hand",
"head",
"helicopter",
"hospital",
"ice",
"jacket",
"kettle",
"knife",
"leg",
"lettuce",
"library",
"magazine",
"mango",
"melon",
"motorcycle",
"mouth",
"newspaper",
"nose",
"notebook",
"novel",
"onion",
"orange",
"peach",
"pharmacy",
"pineapple",
"plate",
"pot",
"potato",
"rain",
"shirt",
"shoe",
"shop",
"sink",
"skateboard",
"ski",
"skirt",
"sky",
"snow",
"sock",
"spinach",
"spoon",
"stationary",
"stomach",
"strawberry",
"student",
"sun",
"supermarket",
"sweater",
"teacher",
"thunderstorm",
"tomato",
"trousers",
"truck",
"vegetables",
"vehicles",
"watermelon",
"wind"
]
word = random.choice(words)
우선 힌트로 주어진 단어 목록을 리스트에 넣어서 그 리스트에서 무작위로 단어 하나를 고르도록 random.choice() 함수를 이용해서 코드를 작성한다.
그러면 이렇게 실행할 때마다 무작위로 단어를 가져온다.
import random
words = [ … ]
display =[]
word = random.choice(words)
for w in range(len(word)):
display += "_"
print(display)
그리고 문자열의 개수를 세는 len() 함수와 for문을 사용해서 글자 수만큼 빈 칸을 표시하도록 작성했다.
Q2. 사용자는 A부터 Z까지의 알파벳 중 하나를 선택한다.
맞추면 해당 알파벳이 들어간 자리를 전부 보여주거나 틀릴 경우 목숨을 하나 차감한다.
import random
words = [ … ]
display =[]
lives = 9
word = random.choice(words)
for w in range(len(word)):
display += "_"
print(display)
guess = input("알파벳을 하나 입력하세요 : ").lower()
if guess in word :
for g in range(len(word)):
letter = word[g]
if letter == guess :
display[g] = letter
else :
lives -= 1
print(display)
print(f'남은 기회는 {lives}번입니다.')
으아 여기까지 적을 때까지 한 시간 정도 헤매다가 도달했다.
우선 input()을 이용해서 사용자가 입력할 수 있게 했다.
그리고 words 리스트와 맞춰볼 때 용이하도록 대문자를 입력해도 소문자로 바꿔주는 string.lower() 함수를 사용했다.
if 조건문을 이용해서 guess에 입력한 값이 word에 있을 때와 아닐 때를 구분해서 달리 조건을 줬다.
사용자의 추측이 맞았을 경우에는 for문을 이용해서 빈 칸을 해당 글자로 대체해서 보여주도록 적었다.
그리고 사용자의 추측이 틀렸을 경우엔 기회를 1번 차감하도록 했다.
(제대로 돌아가는지 확인하기 위해 우선 정답 단어도 함께 print 되도록 적었다)
추측이 맞았을 때는 왼쪽처럼 빈 칸 대신 맞힌 단어가 나타나고, 추측이 틀릴 경우는 빈 칸은 그대로 두고 기회만 1회 차감되는 걸 확인할 수 있다.
Q3. 사용자가 9번 틀리면 게임이 종료됩니다.
import random
words = [ … ]
display =[]
lives = 9
word = random.choice(words)
for w in range(len(word)):
display += "_"
print(display)
while not lives < 1 :
guess = input("알파벳을 하나 입력하세요 : ").lower()
if guess in word :
for g in range(len(word)):
letter = word[g]
if letter == guess :
display[g] = letter
else :
lives -= 1
print(display)
print(f'남은 기회는 {lives}번입니다.')
print("------------------------------")
while문을 사용해서 목숨이 0이 되는 때까지 반복되도록 작성했다.
처음엔 while 조건으로 'lives = 0'이라 적었는데 에러가 떠서 일단 눈치껏 'lives < 1'로 고쳤다.
그리고 출력될 때 절취선을 추가해줬다.
그러면 이렇게 계속 입력하면서 남은 기회가 차감되다가 0에 이르면 while문이 종료된다.
Q4. 게임이 종료되기 전에 사용자가 빈 칸을 모두 채우면 승리합니다.
import random
words = [ … ]
display =[]
lives = 9
word = random.choice(words)
for w in range(len(word)):
display += "_"
print(display)
while not lives < 1 :
guess = input("알파벳을 하나 입력하세요 : ").lower()
if guess in word :
for g in range(len(word)):
letter = word[g]
if letter == guess :
display[g] = letter
else :
lives -= 1
print(display)
print(f'남은 기회는 {lives}번입니다.')
print("------------------------------")
if "_" not in display:
lives = 0
print(display)
print("정답입니다!")
잘못된 추측으로 목숨이 다 차감되기 전에 정답을 맞춰도 게임이 종료되도록 하기 위해서 while문에 if 조건문을 추가했다.
빈 칸이 없어질 경우 목숨을 모두 차감하고(∵그래야 게임이 끝나니까), "정답입니다!" 문구가 뜨도록 작성했다.
뻥 안 치고 이 문제만 3시간 넘게 풀었다.. 시간을 확인했는데 처음엔 15시인 줄 알았는데 다시 보니까 그냥 5시였다. 하하.
내일 이거 다시 해봐야겠다.
지금까지 쓴 코딩에 새로운 내용 더 추가하고 싶은데 다른 강의 들어야 할 것도 있으니까 우선 오늘은 여기까지... 애썼다, 나 자신.
SQLD 공부: [SQLD 자격증 챌린지] 수강하기
DDL(Data Definition Language)
DDL과 데이터 유형
- DDL : 데이터를 저장하는 데이터베이스의 골격인 테이블을 다루는 언어
- 데이터 유형
- CHAR : 고정 길이의 문자열. 해당 길이보다 짧으면 공백으로 채워짐.
- VARCHAR2 : 가변 길이의 문자열. 오라클 기준
- NUMBER : 정수, 실수 등의 숫자 정보 오라클 기준
- NUMBER(p, s) : p는 몇 자릿수까지 표현할 것인지, s는 소수 자릿수
- NUMBER : 괄호 생략 시 입력 변형 없이 가변 저장
- DATE : 날짜, 시각 등 과 관련된 정보.
제약조건
- 제약조건 : 테이블에 부적절한 값이 들어오지 않도록 하는 규칙
- NOT NULL : 필수로 데이터가 입력돼야 하는 컬럼에 설정
- UNIQUE : 중복값을 허용하지 않음
- PRIMARY KEY : 테이블의 기본키를 설정
- 기본적으로 NOT NULL과 UNIQUE 제약조건을 함께 갖음
- 테이블당 1개의 기본키만 설정 가능
- 여러 칼럼을 묶어서 기본키로 사용 가능 한 개의 컬럼만으로 기본키 설정이 가능하다고 안 함
- FOREIGN KEY : 외래키를 지정.
- DEFAULT : 값이 입력되지 않을 경우 부여될 기본 값을 지정
- CHECK : 미리 지정한 조건에 맞는 데이터를 입력해야 함
테이블 생성
CREATE TABLE contact (
name VARCHAR2(10) NOT NULL,
age NUMBER(2),
email VARCHAR2(40) NOT NULL UNIQUE
);
이런 구조로 만들어 준다.
ALTER TABLE
- 컬럼 추가
- 새롭게 추가하는 컬럼은 테이블의 맨 마지막에 위치
컬럼의 순서를 바꾸고 싶다면 그냥 테이블을 다시 만들어야 함 - ALTER TABLE 테이블명 ADD 칼럼명 데이터_유형;
- 새롭게 추가하는 컬럼은 테이블의 맨 마지막에 위치
- 제약조건 추가
- ALTER TABLE 테이블_이름 ADD CONSTRAINT 제약_조건_이름 제약조건 (컬럼_이름);
- 컬럼 삭제
- ALTER TABLE 테이블_이름 DROP COLUMN 삭제_할_컬럼_이름;
- 제약조건 삭제
- ALTER TABLE 테이블_이름 DROP CONSTRAINT 제약_조건_이름;
- 컬럼 수정
- 컬럼의 크기를 줄이는 데는 제약이 있음 (∵기존 데이터가 훼손될 수 있기에)
- ALTER TABLE 테이블_이름 MODIFY ( 컬럼_이름_1 데이터_유형 [DEFAULT 식] [NOT NULL], 컬럼_이름_2 데이터_유형 [DEFAULT 식] [NOT NULL] ...); 명령어로 MODIFY 사용함
- 컬럼 이름 변경
- ALTER TABLE 테이블_이름 RENAME COLUMN 변경_할_컬럼_이름 TO 새로운_컬럼_이름;
- 테이블 변경
- ALTER TABLE 없이 이름 변경함
- RENAME 기존_테이블_이름 TO 새로운_테이블_이름;
DROP TABLE, TRUNCATE TABLE
- DROP TABLE : 테이블 전체를 삭제. 저장된 데이터도 함께 삭제
- DROP TABLE 테이블_이름 [CASCADE CONSTRAINT];
- CASCADE CONSTRAINT : 해당 테이블을 참조하는 제약조건에 대해 해당 테이블이 삭제될 때 같이 삭제될지 여부를 결정
- TRUNCATE TABLE : 테이블은 남기고 데이터만 삭제
- TRUNCATE TABLE 테이블_이름;
DML( Data Manipulation Language )
INSERT
- INSERT : 테이블에 필요한 데이터를 저장
- 데이터를 저장하는 방법은 2가지; 컬럼 리스트를 명시할 것인지, 아닌지
- INSERT INTO 테이블_이름 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);
- INSERT INTO 테이블_이름 VALUES (값1, 값2, ...);
UPDATE
- UPDATE : 입력된 데이터를 수정. WHERE절을 사용해 조건에 맞는 데이터만 수정할 수 있음
- UPDATE 테이블_이름 SET 수정_할_컬럼_이름 = 수정_할_새로운_값, ...
[WHERE 조건 내용];
- UPDATE 테이블_이름 SET 수정_할_컬럼_이름 = 수정_할_새로운_값, ...
DELETE
- DELETE : 데이터를 삭제. WHERE절을 사용해 조건에 맞는 데이터만 삭제할 수 있음
- DELETE FROM 테이블_이름 [WHERE 삭제할_조건]
- DELETE와 TRUNCATE의 차이
- DELETE : 실행하면 바로 데이터가 삭제되지 않고 COMMIT 명령어 이후에 DB에 적용됨
- TRUNCATE : DDL 명령어는 테이블에 바로 적용되기에 삭제된 데이터를 되돌릴 수 없음
TCL
트랜잭션의 기본 특성(ACID) -그냥 나올 때마다 계속 봐라, 중요한가보지
- 원자성 (Atomicity)
- 모든 연산은 '최소한의 조작 묶음'
- 조작 과정에서 하나의 연산이라도 실패하게 되면 아무것도 수행하지 않은 상태로 남아 있어야 함
- 일관성 (Consistency)
- 트랜잭션이 수행하기 전의 상태 그리고 수행하고 난 상태도 모두 잘못된 내용이 없어야 함
- 고립성/격리성 (Isolation)
- 트랜잭션이 다른 트랜잭션에 영향을 받아 잘못된 결과를 만들어선 안 됨
- 각 트랜잭션은 개별적으로 동작이 보장돼야 함
- 지속성 (Durability)
- 트랜잭션이 성공적으로 수행됐다면 그 갱신한 데이터베이스는 내용을 영구적으로 유지해야 함
- 특정 시간 동안만 유지됐다가 다시 돌아가는 불안정한 부분이 있어선 안 됨
COMMIT/ROLLBACK
- COMMIT
- 입력한 자료나 수정한 자료, 혹은 삭제한 자료에 대해서 문제가 없다고 판단이 되었을 때, 최종 트랜잭션을 확정하는 TCL 명령어
- 다른 사용자는 현재 변경된 내용에 접근하여 데이터의 변화를 확인할 수 없음
- 변경 중인 데이터 베이스도 Locking이 되어 다른 사용자가 변경할 수 없음
- ROLLBACK
- 트랙잭션 진행 중 에러가 발생하거나 잘못된 연산이 이뤄진 경우 변경 전 가장 최신 상태로 되돌릴 수 있음
- 데이터의 이전 상태로 복구되고 관련된 Locking이 풀리면서 다른 사용자들이 데이터를 변경할 수 있게 됨
SAVEPOINT
- 트랜잭션의 크기가 크고 시스템의 부하를 많이 주는 트랜잭션인 경우에 트랜잭션 중간에 SAVEPOINT를 설정하여 SAVEPOINT 까지만 되돌려서 시스템의 부하를 줄일 수 있음
DCL(Data Control Language)
DCL
- 특정 유저의 권한을 제어할 수 있는 명령어
- 권한을 부여할 수 있는 GRANT문
- GRANT privilege TO user;
- 권한을 회수할 수 있는 REVOKE문
- REVOKE privilege FROM user;
ROLE
- 롤(ROLE) : 사용자에게 허가할 수 있는 권한들의 집합
- 데이터베이스 관리자는 ROLE을 생성하고 각종 권한들을 부여한 후 이를 다른 ROLE이나 유저에게 부여할 수 있음
오늘까지 우선 강의 진도 나갈 건 나갔고 이게 모의고사 문제 풀이와 내용 요약 정리, 이렇게 2개만 남았다.
내일은 처음으로 모의고사를 풀어보는 날이구나. 대체 얼마나 풀 수 있을지 궁금하다.
'[내배캠] 데이터분석 6기 > 사전캠프 기록' 카테고리의 다른 글
[사전캠프 16일차] 아티클 스터디⑪, SQL 과제, SQLD 공부 (0) | 2025.02.14 |
---|---|
[사전캠프 14일차] 아티클 스터디⑩, SQLD 공부, SQL 과제 (0) | 2025.02.12 |
[사전캠프 13일차] SQLD 공부, SQL 과제 (0) | 2025.02.11 |
[사전캠프 12일차] 아티클 스터디⑨, 파이썬 공부, SQLD 공부 (0) | 2025.02.10 |
[사전캠프 11일차] 아티클 스터디⑧, SQL 공부, SQLD 공부 (0) | 2025.02.07 |