2024-11-30

Suhyeon Lee·2024년 11월 30일
0

자기주도학습

목록 보기
60/83

CodeKata

SQL

135. Weather Observation Station 3

  • 작성한 쿼리
SELECT
  DISTINCT city
FROM
  station
WHERE
  id%2=0
;

→ point: exclude duplicates from the answer

참고할 만한 내용

  • Mysql 나머지 연산
    • N % M = 0
    • MOD(N,M) = 0
    • N MOD M = 0

136. Weather Observation Station 4

  • 작성한 쿼리
SELECT
  COUNT(city)-COUNT(DISTINCT city)
FROM
  station
;

137. Weather Observation Station 5

  • 작성한 쿼리
(
SELECT
  city
  , LENGTH(city)
FROM
  station
ORDER BY
  LENGTH(city)
  , city
LIMIT 1
)
UNION ALL
(
SELECT
  city
  , LENGTH(city)
FROM
  station
ORDER BY
  LENGTH(city) DESC
  , city
LIMIT 1
)
;

참고할 만한 내용

  • 문자열에 MAX() 사용했을 때
    • 데이터베이스가 해당 열에 정의한 정렬 순서에서 가장 높은 값을 찾음
      • 한글의 경우 자음 < 모음 < 한글 순으로 한글이 가장 큰 값
      • 영문의 경우 대문자 < 소문자 순으로 소문자 영문이 가장 큰 값
      • 한글과 영문, 숫자, 특수문자가 같이 있는 경우 특수문자 < 숫자 < 숫자(특) < 영문 < 영문(특) < 한글 < 한글(특)
    • 데이터 정렬 순서에 따라 가장 높은 값을 찾고, 해당 레코드에서 가장 왼쪽부터 비교
      • NULL값은 무시

Python

55. 카드 뭉치

  • 작성한 코드
def solution(cards1, cards2, goal):
    answer = ''
    for word in goal:
        if len(cards1) != 0 and word == cards1[0]:
            cards1.pop(0)
        elif len(cards2) != 0 and word == cards2[0]:
            cards2.pop(0)
        else:
            answer='No'
            break
        answer='Yes'
    return answer

참고할 만한 다른 풀이

  • deque
from collections import deque

def solution(cards1, cards2, goal):
    answer = 'Yes'
    
    cards1 = deque(cards1)
    cards2 = deque(cards2)
    for i in goal:
        if (len(cards1) != 0) and (i == cards1[0]):
            cards1.popleft()
        elif (len(cards2) != 0) and (i == cards2[0]):
            cards2.popleft()
        else:
            answer = 'No'
            break
        
    return answer
  1. popleft() 함수를 사용하기 위해 카드 뭉치를 deque 자료구조로 만듦
    • deque 자료구조를 사용하기 위해 deque 모듈 불러오기
      from collections import deque
  2. 틀린 경우만 찾아내기 위해 초기 결과를 Yes로 저장
    answer = 'Yes'
  3. 두 카드 뭉치를 deque 자료로 변경
    cards1 = deque(cards1) cards2 = deque(cards2)
  4. 만들어야 할 문장의 각 단어를 하나씩 추출
    for i in goal
  5. 만약 첫 번째 카드 뭉치에 카드가 남아 있고 해당 카드 뭉치의 첫 번째 단어가 추출한 단어와 동일하면
    if (len(cards1) != 0) and (i == cards1[0])
  6. 카드 뭉치의 제일 앞 단어를 제거
    cards1.popleft()
  7. 만약 두 번째 카드 뭉치에 카드가 남아 있고 해당 카드 뭉치의 첫 번째 단어가 추출한 단어와 동일하면
    elif (len(cards2) != 0) and (i == cards2[0])
  8. 카드 뭉치의 제일 앞 단어를 제거
    cards2.popleft()
  9. 반면에 추출한 단어가 두 카드 뭉치의 첫 번째 단어와 동일하지 않다면
    else
  10. 문장을 완성시킬 수 없으므로
    answer = 'No'
  11. 더 이상 문장을 완성시킬 수 없으므로 종료
    break
  • 각 배열의 인덱스를 변수로 관리하여 접근하는 방식
def solution(cards1, cards2, goal):
    answer = []
    n = len(cards1)
    m = len(cards2)
    
    i = j = 0
    for word in goal:
        if i < n and word == cards1[i]:
            answer.append(cards1[i])
            i += 1
            
        if j < m and word == cards2[j]:
            answer.append(cards2[j])
            j += 1
        
    return 'Yes' if answer == goal else 'No'
  • if cards1
from collections import deque

def solution2(cards1, cards2, goal):
    cards1 = deque(cards1)
    cards2 = deque(cards2)
    
    for word in goal:
        if card1 and word == cards1[0]: cards1.popleft()
        if card2 and word == cards2[0]: cards2.popleft()
        else: return 'No'
    
    return 'Yes'

cards1[0] 또는 cards2[0]에 접근하려면 cards1 또는 cards2가 빈 리스트가 아닌 상태여야 한다.
단순히 if i == cards1[0]만 작성하면 cards1에 요소가 하나도 없을 때 IndexError가 발생하게 된다.
그렇기 때문에 리스트에 값이 존재하는 경우에 True가 되므로 그때 [0]번 인덱스와 비교하는 것

def solution(cards1, cards2, goal):
    for i in goal:
        if cards1 and i == cards1[0]:
            cards1.pop(0)
        elif cards2 and i == cards2[0]:
            cards2.pop(0)
        else:
            return 'No'
    return 'Yes'

cards1 = ["i", "drink", "water"], cards2 = ["want", "to"], goal = ["i", "want", "to", "drink", "water"]이면 goal의 요소를 for문으로 하나씩 불러온다.
'i'가 cards1의 0번째 요소와 같으므로 cards1의 0번째 요소인 'i'를 지우고 다음 요소를 비교한다. → cards1 = ["drink", "water"], cards2 = ["want", "to"]
'want'는 cards2의 0번째 요소와 같으므로 cards2의 0번째 요소인 'want'를 지우고 다음 요소를 비교한다. → cards1 = ["drink", "water"], cards2 = ["to"]
'to'는 cards2의 0번째 요소와 같으므로 cards2의 0번째 요소인 'to'를 지우고 다음 요소를 비교한다. → cards1 = ["drink", "water"], cards2 = []
'drink'는 cards1의 0번째 요소와 같으므로 cards1의 0번째 요소인 'drink'를 지우고 다음 요소를 비교한다. → cards1 = ["water"], cards2 = []
'water'는 cards1의 0번째 요소와 같으므로 cards1의 0번째 요소인 'water'를 지우고 반복문을 마친다. → cards1 = [], cards2 = []
for문을 문제없이 마무리하면 Yes를 리턴한다.
하지만, 중간에 cards1 또는 cards2의 0번째 요소와 다르다면 순서대로 만들어진 문장이 아니므로 No를 리턴한다.

  • if len(cards1) > 0
def solution(cards1, cards2, goal):
    for g in goal:
        if len(card1)>0 and g == cards1[0]:
            cards1.pop(0)
        elif len(card1)>0 and g == cards2[0]:
            cards2.pop(0)
        else:
            return 'No'
    return 'Yes'

TypeError: 'builtin_function_or_method' object is unsubscriptable

  • builtin_function_or_method' 객체는 subscriptable 하지 않다는 얘기.
    • 즉, builtin_function_or_method 이란 이름의 객체는 [ ] 연산자를 이용할 수 없다는 의미이다.
  • 최종적으로 나온 에러 메세지는 TypeError
    • [ ] 연산자가 사용될 수 없는 객체에 이 연산자를 사용하려 했기 때문에 객체의 type 이 맞지 않는다는 의미
    • 파이썬은 객체의 타입이 없는 것 같지만 실은 있다. 단지 '늦게' 결정될 뿐이다.
      • 그래서 숫자이어야 하거나 문자이어야 하면 무조건 형변환을 시켜버린 후 작업하는 게 편함

회고

  • 코드카타 하고 팀 프로젝트에 필요한 머신 러닝 공부를 좀 했음
    • 실제 데이터에 적용시키는 건 내일 하자…
profile
2 B R 0 2 B

0개의 댓글

관련 채용 정보