TIL 알고리즘(9)

알고리즘

목록 보기
8/21

SQL

-- select Name from STUDENTS where Marks > 75
-- order by Name 


-- select regexp_substr(Name, '\\w{3}$') from STUDENTS
-- tha
-- lia
-- ney

-- select Name from STUDENTS
-- Samantha
-- Julia
-- Britney


-- select regexp_substr(Name, '\\w{3}$') from STUDENTS where Marks > 75

-- select regexp_substr(Name, '\\w{3}$') from STUDENTS where Marks > 75 order by 1, ID

select Name from STUDENTS where Marks > 75 order by regexp_substr(Name, '\\w{3}$'), ID
  1. 컬럼 안의 데이터를 조작하는 게 오랜만이어서 어떻게 해야할 지 막막했다.
  2. 생각나는 대로 검색을 했더니 잊고있던 substring()이 있었다.
  3. substring으로는 컬럼 내의 자료를 솎아내기 힘들었다.
  4. regexp으로 하는 방법밖에는 없을 것 같아서 dev.mysql.com을 뒤져봤다.
  5. regexp_substr이라는 게 있었지만, 적힌 내용으로는 파악하기 힘들었다.
  6. mysqltutorial.org이라는 사이트에서 단초를 찾을 수 있었다.('\d{4}'로 year를 따옴.)
  7. 전에 봐둔 정규표현식 자료를 참고하며 실험했다.(\w는 단어, \는 escape, a{5}는 exactly five)
  8. order by에서 select에는 없는 가상의 column으로 정렬이 가능한 지 뻘짓이라고 생각하고 테스트해봤다.
  9. 됐다. ^^

알고리즘

heapq.heappush(list_, x)

백준 1927번 문제: 최소 힙
https://www.acmicpc.net/problem/1927

import heapq

list_ = []
# list_.heapify()

N = int(input())

# for _ in range(N):
# N번 하는 게 아니야!
while 1:
    x = int(input())

    if x > 0:
        list_.heappush(x)
        # AttributeError: 'list' object has no attribute 'heappush'
    else:
        try:
            print(list_[-1:-1:-1])
            # IndexError: list index out of range
            list_.remove(min(list_))

        except ValueError: # 배열이 비어있는데 가장 작은 값을 출력할 경우 0 출력
            print("0")

맨땅에서 풀다가 pop, remove 등에서 indexerror에 이질이 나서 검색을 했다.

heapq라는 모듈이 있다.
그런데 사용할 수가 없었다.
vscode에서 import heapq의 heapq만 회색이고, not accessed라는 설명이 나왔다.

아무리 검색을 해도 개선할 수가 없었다.
오히려 pip에서 잘못됐나 싶어서 오류만 무진장 팠다.
pytest를 돌렸다가, venv를 설치했다가 지우고 내장인 것 같지만 install해보고,
pip install --upgrade pip했다가 액세스가 거부되고,
업그레이드 하라는 거 복사해서 붙여도 bash오류나오고
검색해서 영어설명 다 읽어봐도 지쳐서 너무 힘들었따.

-> 근데 알고보니 사용법이 틀렸었다. ^^
heapq.heappush(list_, x)처럼 써야하고,
그러면 신기하게도 import도 색이 진해졌다.
아마도 함수에서의 argument처럼 색이 바랬다가 진해지는 모양과 비슷한 것 같다.

list의 += 사용

a = [2]
b = [3]
print(a + b)
# [2, 3]

a += b
print(a)
# [2, 3]

a[0]+=b[0]
print(a)
# [5]

위부터 순서대로
1. 리스트간의 합연산
2. 리스트간의 합연산
3. 정수간의 합연산

어제 튜터님의 풀이에 등장한 건 2번!

2차원 배열 ^^

N, M = map(int, input().split())

matrix_a = []
matrix_b = []

for _ in range(N):
    row = list(map(int, input().split()))
    matrix_a.append(row)
    
for _ in range(N):
    row = list(map(int, input().split()))
    matrix_b.append(row)

for i in range(N):
    for j in range(M):
        matrix_a[i][j] += matrix_b[i][j]
# print(matrix_a)
# [[4, 4, 4], [6, 6, 6], [5, 6, 100]]

for i in range(N):
    matrix_a[i] = " ".join(str(x) for x in matrix_a[i])

for i in range(N):
    print(f"{matrix_a[i]}")
# 4 4 4
# 6 6 6
# 5 6 100

for문을 5번
아니 6번
^^
처음 두 번은 값을 받는데 사용했다.
다음은 연산하는 데 nn
그리고 출력 준비에 한 번, 출력에 한 번 ^^

풀고나서 다른 사람들의 답안이 너무너무너무 보고싶었다.

한 분은 값을 받는 것 까지는 같았다.
답안에 for/for를 쓰고 print()안에서 연산을 하고(print(3+2)느낌)
end의 개행을 없애고 print()를 첫 for문에서 돌렸다.
하히하ㅏㅎ히하하ㅣ하히

sys모듈 사용

import heapq, sys
list_ = []
N = int(sys.stdin.readline())

for _ in range(N):
    x = int(sys.stdin.readline())
    if x > 0:
        heapq.heappush(list_, x)
    elif list_ and x == 0:
        sys.stdout.write(f"{heapq.heappop(list_)}\n")
    else: # list_가 비어있을 경우
        sys.stdout.write(f"0")
# 9
# 0
# 12345678
# 1
# 2
# 0
# 01
# 0
# 2
# 0
# 12345678
# 0
# 32
# 0
# 틀렸습니다.

sys.stdin.readline()과 print()

import heapq, sys
list_ = []
N = int(sys.stdin.readline())

for _ in range(N):
    x = int(sys.stdin.readline())
    if x > 0:
        heapq.heappush(list_, x)
    elif list_ and x == 0:
        print(heapq.heappop(list_))
    else: # list_가 비어있을 경우
        print(0)
# 9
# 0
# 0
# 12345678
# 1
# 2
# 0
# 1
# 0
# 2
# 0
# 12345678
# 0
# 0
# 32
# 맞았습니다!!
# ?????????????????????????????????????????????????????????????????????//
  • 요약
    읽을 때는 sys 출력은 print로 하자.
    (적어도 문제 풀 때는..)

0개의 댓글