[내배캠] 데이터분석 6기/사전캠프 기록

[사전캠프 15일차] 파이썬 과제, SQLD 공부

물맨두 2025. 2. 13. 17:22
오늘은.. 진짜 일찍 잔다.

일찍 자려면 얼른 오늘 할 일들을 끝내자.

 

오늘 한 일은,

  • 파이썬 공부
    • 개인 퀘스트(달리기반) - [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 조건 내용];

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개만 남았다.

내일은 처음으로 모의고사를 풀어보는 날이구나. 대체 얼마나 풀 수 있을지 궁금하다.