백준 2750 : 문제링크

  • 문제유형 : 정렬

  • 설명

    • 선택 정렬로 풀이

    • sort함수로도 해결 가능

  • 풀이

    • 선택 정렬

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      n = int(input())
      array = list()

      for _ in range(n):
      array.append(int(input()))

      for i in range(n):
      min_index = i
      for j in range(i+1, n):
      if array[min_index] > array[j]:
      min_index = j
      array[i], array[min_index] = array[min_index], array[i]

      for i in array:
      print(i)
    • 기본 라이브러리

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      n = int(input())
      array = list()

      for _ in range(n):
      array.append(int(input()))

      array.sort()

      for i in array:
      print(i)

Comment and share

수 찾기

in Algorithm, Hash

백준 4195 : 문제링크

  • 문제유형 : 해시, 배열, 구현

  • 설명

    • python에서 dictionary 자료형으로 HASH 구현가능

    • Union Find 알고리즘 이용

  • 풀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    def find(x):
    if parent[x] == x:
    return x
    else:
    p = find(parent[x])
    parent[x] = p
    return parent[x]

    def union(x, y):
    x = find(x)
    y = find(y)

    if x != y
    parent[y] = x
    number[x] += number[y]

    test_case = int(input())

    for _ in range(test_case):
    parent = dict()
    number = dict()

    f = int(input())

    for _ in range(f):
    x, y = input().split(' ')

    if x not in parent:
    parent[x] = x
    number[x] = 1
    if y not in parent:
    parent[y] = y
    number[y] = 1


    union(x, y)

    print(number[find(x)])

Comment and share

SHA-256

in Algorithm, Hash

백준 10930: 문제링크

  • 문제유형 : 해시, 구현

  • 설명

    hashlib.sha256 함수로 SHA 256 해시를 구한다.

  • 풀이

    1
    2
    3
    4
    5
    6
    import hashlib

    input_data = input()
    encoded_data = input_data.encode()
    result = hashlib.sha256(encoded_data).hexdigest()
    print(result)

Comment and share

키로거

in Algorithm, Greedy

백준 5397: 문제링크

  • 문제유형 :

  • 설명

    1. 스택을 두 개 생성하고, 스택 두 개의 중앙을 커서라고 생각한다.

    2. 문자 입력: 왼쪽 스택에 삽입

    3. ‘-‘ 입력 : 왼쪽 스택에서 삭제

    4. ‘<’ 입력 : 왼쪽 스택에서 오른쪽 스택으로 이동

    5. ‘>’ 입력 : 오른쪽 스택에서 왼쪽 스택으로 이동

  • 풀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    test_case = int(input())

    for _ in range(test_case):
    left_stack = []
    right_stack = []
    data = input()
    for i in data:
    if i == '-':
    if left_stack:
    left_stack.pop()
    elif i == '<':
    if left_stack:
    right_stack.append(left_stack.pop())
    elif i == '>':
    if right_stack:
    left_stack.append(right_stack.pop())
    else:
    left_stack.append(i)
    left_stack.extend(reversed(right_stack))
    print(''.join(left_stack))

Comment and share

백준 1874: 문제링크

  • 문제유형 : 큐, 구현, 그리디

  • 설명

    1. queue의 head의 값이 최대값과 동일한 지 확인한다.

    2. 동일하면 지정한 값과 동일한 지 확인한다.

      아니면 값을 queue의 tail로 보낸다

    3. 지정한 값과 동일하면 출력 아니면 값을 제거한다.

  • 풀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    test_case = int(input())

    for _ in range(test_case):
    n, m = list(map(int, input().split(' ')))
    queue = list(map(int, input().split(' '))
    queue = [(i, idx) for idx, i in enumerate(queue)]

    count = 0

    while True:
    if queue[0][0] == max(queue, key=lambda x : x[0])[0]:
    count += 1
    if queue[0][1] == m:
    print(count)
    break
    else:
    queue.pop(0)
    else:
    queue.append(queue.pop(0))

Comment and share

백준 1874: 문제링크

  • 문제유형 : 스택, 그리디

  • 설명

    1. 스택에 특정 수에 도달할 때까지 push한다.

    2. 스택이 특정 수에 도달하면 pop한다.

    3. 수의 배열을 완성하면 출력하고 불가능하면 NO를 출력한다

  • 풀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    n = int(input())

    count = 1
    stack = []
    result = []

    for i in range(1, n + 1): # 데이터 개수만큼 반복
    data = int(input())

    while count <= data: # 입력 받은 데이터에 도달할 때 까지 삽입
    stack.append(count)
    count += 1
    result.append('+')

    if stack[-1] == data: # 스택의 최상위 원소가 데이터와 같을 때 출력
    stack.pop()
    result.append('-')
    else: # 불가능한 경우
    print('NO')
    exit(0)

    print('\n'.join(result)) # 가능한 경우

Comment and share

백준 2789 : 문제링크

  • 문제유형 : 배열, 완전탐색

  • 설명

    1. 완전탐색으로 가능한 숫자 조합을 모두 구한다.

    2. 만들어진 조합의 합을 구한다.

    3. 합이 M을 넘지 않았을 때 최대값을 비교하여 갱신한다.

  • 풀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    n, m = list(map(int, input().split(' ')))
    data = list(map(int, input().split(' ')))

    result = 0
    length = len(data)

    count = 0
    for i in range(0, length):
    for j in range(i + 1, length):
    for k in range(j + 1, length):
    sum_value = data[i] + data[j] + data[j]
    if sum_value <= m:
    result = max(result, sum_value)

    print(result)

Comment and share

음계

in Algorithm

백준 2920 : 문제 링크

  • 문제 유형 : 배열, 구현

  • 설명

    1. 오름차순 변수 ascending, 내림차순 변수 descending 둘 다 True로 설정

    2. 한 문자라도 내림차순이면 ascending False

      한 문자라도 오름차순이면 descending False

    3. 둘 다 False이면 mixed

  • 풀이
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    a = list(map(int, input().split())

    ascending = True
    descending = True

    for i in range(1, 8):
    if a[i] > a[i-1]:
    descending = False
    elif a[i] < a[i-1]:
    ascending = False

    if ascending:
    print('ascending')
    elif descending:
    print('descending')
    else:
    print('mixed)

Comment and share

SELECT

정의 : 데이터를 검색할때 사용되는 문법

SELECT FROM

  • 기본 포멧

    SELECT <column_name_1>, <column_name_2>, ... FROM <table_name>

  • 전체 컬럼 데이터 조회

    1
    2
    sql> SELECT *
    FROM world.country
  • code, name 세개의 컬럼 데이터 조회

    1
    sql> SELECT code, name FROM world.country
  • 데이터 베이스 선택 : FROM 절에 world. 을 사용할 필요가 없다.

    1
    2
    sql> USE world;
    sql> SELECT * FROM country
  • alias : 컬럼의 이름을 변경할수 있습니다.

    1
    sql> SELECT code as country_code, name as country_name FROM country
  • 데이터 베이스, 테이블, 컬럼 리스트 확인

    1
    2
    3
    sql> SHOW DATABASES;
    sql> SHOW TABLES;
    sql> DESC city;

WHERE

특정 조건을 주어 데이터를 검색하는데 사용되는 문법

  • 비교연산 - 인구가 1억이 넘는 국가를 출력

    1
    SELECT * FROM country WHERE Population >= 100000000
  • 논리 연산 : AND, OR - 인구가 7000만에서 1억인 국가를 출력

    1
    2
    SELECT * FROM country
    WHERE Population >= 70000000 AND Population <= 100000000
  • 범위 연산 : BETWEEN

    • 인구가 7000만에서 1억인 국가를 출력

      1
      2
      SELECT * FROM country
      WHERE Population BETWEEN 70000000 AND 100000000
    • 아시아와 아프리카 대륙의 국가 데이터를 출력

      1
      2
      SELECT * FROM country
      WHERE Continent = "Asia" OR Continent = "Africa"
  • 특정 조건을 포함 : IN, NOT IN

    • 아시아와 아프리카 대륙의 국가 데이터를 출력

      1
      2
      SELECT * FROM country
      WHERE Continent IN ("Asia", "Africa")
    • 아시아와 아프리카 대륙의 국가가 아닌 데이터를 출력

      1
      2
      SELECT * FROM country
      WHERE Continent NOT IN ("Asia", "Africa")
    • 아시아와 아프리카 대륙의 국가가 아닌 데이터를 출력 (논리연산 사용)

      1
      2
      SELECT * FROM country
      WHERE Continent != "Asia" AND Continent != "Africa"
  • 특정 문자열이 포함된 데이터 출력 : LIKE

    • 정부형태에 Republic이 포함된 데이터 출력
      1
      2
      SELECT * FROM country
      WHERE GovernmentForm LIKE "%Republic%"

ORDER BY

특정 컬럼의 값으로 데이터 정렬에 사용되는 문법

  • 오름차순 인구순으로 국가의 리스트를 출력 (ASC는 생략이 가능)

    1
    SELECT * FROM country ORDER BY population ASC
  • 내림차수 인구순으로 국가의 리스트를 출력

    1
    SELECT * FROM country ORDER BY population DESC
  • 국가 코드를 알파벳 순으로 정렬하고 같은 국가 코드를 가지면 인구순으로 내림차순으로 정렬

    1
    SELECT * FROM city ORDER BY CountryCode ASC, Population DESC

LIMIT

LIMIT은 조회하는 데이터의 수를 제한할수 있습니다.

  • 인구가 많은 상위 5개 국가 데이터를 출력

    1
    SELECT * FROM country ORDER BY population DESC LIMIT 5
  • 인구가 많은 상위 6위 ~ 8위의 3개 국가 데이터를 출력

    1
    SELECT * FROM country ORDER BY population DESC LIMIT 5, 3

GRUOP BY, HAVING

GROUP BY는 여러개의 동일한 데이터를 가지는 특정 컬럼을 합쳐주는 역할을 하는 명령입니다.

SQL에는 아래와 같은 그룹함수가 있습니다.
COUNT, MAX, MIN, AVG, VAR_SAMP, STDDEV

  • COUNT

    • city 테이블의 CountryCode를 묶고 각 코드마다 몇개의 데이터가 있는지 확인
      1
      2
      sql> SELECT CountryCode, COUNT(CountryCode) FROM city
      GROUP BY CountryCode
    • countrylanguage 테이블에서 전체 언어가 몇개 있는지 구하시오.
      • DISTINCT 중복을 제거해주는 문법
        1
        2
        sql > SELECT COUNT(DISTINCT(Language)) as language_count
        FROM countrylanguage
  • MAX

    • 대륙별 인구수와 GNP 최대 값을 조회
      1
      2
      3
      4
      5
      6
      7
      8
              sql> SELECT continent, MAX(Population) as Population, MAX(GNP) as GNP
      FROM country GROUP BY continent
      ```
      - MIN
      - 대륙별 인구수와 GNP 최소 값을 조회 (GNP와 인구수가 0이 아닌 데이터 중에서)
      ```
      sql> SELECT continent, MIN(Population) as Population, MIN(GNP) as GNP FROM country
      WHERE GNP != 0 AND Population != 0 GROUP BY continent
  • SUM

    • 대륙별 총 인구수와 총 GNP
      1
      2
      3
      sql> SELECT continent, SUM(Population) as Population, SUM(GNP) as GNP
      FROM country
      WHERE GNP != 0 AND Population != 0 GROUP BY continent
  • AVG

    • 대륙별 평균 인구수와 평균 GNP 결과를 인구수로 내림차순 정렬
      1
      2
      3
      4
      sql> SELECT continent, AVG(Population) as Population, AVG(GNP) as GNP
      FROM country
      WHERE GNP != 0 AND Population != 0 GROUP BY continent
      ORDER BY Population DESC
  • HAVING

    GROUP BY에서 반환되는 결과에 조건을 줄수 있습니다.

    • 대륙별 전체인구를 구하고 5억이상인 대륙만 조회

      1
      2
      3
      sql> SELECT continent, SUM(Population) as Population FROM country
      GROUP BY continent
      HAVING Population > 500000000
    • 대륙별 평균 인구수, 평균 GNP, 1인당 GNP한 결과를 1인당 GNP가 0.01 이상인 데이터를 조회하고 1인당 GNP를 내림차순으로 정렬

      1
      2
      3
      4
      5
      sql> SELECT continent, AVG(Population) as Population, AVG(GNP) as GNP, AVG(GNP) / AVG(Population) * 1000 as AVG
      FROM country
      WHERE GNP != 0 AND Population != 0 GROUP BY continent
      HAVING AVG > 0.01
      ORDER BY AVG DESC
  • WITH ROLLUP

    • 고객과 스탭별 매출과 고객별 매출의 총합을 출력
      1
      2
      sql> SELECT customer_id, staff_id, SUM(amount) as amount FROM payment
      GROUP BY customer_id, staff_id WITH ROLLUP

Comment and share

데이터 베이스 모델링

개념적 모델링

업무분석해서 핵심 데이터의 집합을 정의하는 과정

논리적 모델링

개념적 모델링을 상세화 하는 과정

물리적 모델링

논리적 모델링을 DBMS에 추가하기 위해 구체화하는 과정

자료형, 키 값등 설정

Comment and share

Yechan Kim

author.bio


author.job