jeeyeonLIM / coding_test

Let's practice the coding test!
1 stars 0 forks source link

▲▲▲ 알고리즘 공부 순서▲▲▲ #65

Open jeeyeonLIM opened 3 years ago

jeeyeonLIM commented 3 years ago

우선순위 점검

💡 중요도 순으로 정리 & 문풀

기타

마인드셋

jeeyeonLIM commented 3 years ago

정렬


![image](https://user-images.githubusercontent.com/45617225/106143902-c57a4980-61b6-11eb-9b29-c4a44acf3ba1.png)

#### 관련 문제
- [K번째 수](#1  )
- [가장 큰 수](#8 ) : 혼자 못풀었어서 다시 풀어보기
- [H-index](#39  ) : 아직 못함...
jeeyeonLIM commented 3 years ago

문자열

"1234".isalpha(), "1234".isdigit() # (False, True)

isalpha() : 문자로만 구성된경우만 True

isdigit() : 숫자로만 구성된경우만 True


#### 정규식 !! 
- 정규식 관련 메타문자는 총 12개다. 👉  `$()*+.?[\^{|` 
#### match
```python
import re 

p=re.compile('[a-z]+')    # copile 메서드엔 내가 찾고 싶은 정규식 pattern 입력해주기.
m= p.match("python")   # 문자열 처음부터 정규식과 매치되는지 조사 
if m:  # 만약 일치하는 게 있다면 match객체를 돌려줄테고, 해당 if문이 실행된다.
   print(m.group())
else: 
   print("No")

image

search

import re 

p=re.compile('[a-z]+')    # copile 메서드엔 내가 찾고 싶은 정규식 pattern 입력해주기.
s=p.search("3 python")

findall


s=
import re 
re.match('a', 'abc') 
# re.match(patter, string, flags) : 문자열 처음부터 시작해서 일치하는 내용 찾기. 만약 일치하면 match object값을, 일치하지 않으면 None값 

re.search(pattern, string, flags)
# re.match와 비슷하지만, 반드시 문자열 처음부터 일치해야 하는 것은 아니다. 

re.findall(pattern, string, flags)
# 패턴과 일치되는 모든 부분을 찾는다. 

re.fullmatch(pattern, string, flags)
# 패턴과 문자열이 남는 부분 없이 완벽히 일치되는가를 확인함!! 즉 pattern == string일 경우만 Match obj 반환함.

기타 예시

# slicing
mylist[::-1] # 문자열 뒤집기
mylist[0::2] # 홀수번째 문자열만(총 세개의 인자를 넣을 수 있는데 0번째 index부터 끝까지 추출하는데 2간격으로 뛰면서 나오도록 하는 의미.
mylist[1::2] # 짝수번째 문자열만

# 문자 검사
mylist.isalpha() # 문자열이 알파벳으로만 이루어져있는 것인지 확인할 수 있음.
mylist.isalnum() # alnum = alpha + numeric인지 검사. 즉 문자열이 알파벳과 숫자로만 이루어져 있는지 검사할 수 있음.
mylist.islower() # 문자열이 모두 소문자인지 검사함.
mylist.isupper() # 문자열이 모두 대문자인지 검사함.

# 숫자검사 
mylist.isnumeric() 

# 문자열 양식 변경
mylist.upper() #대문자로 변경
mylist.lower() #소문자로 변경
mylist.capitalize() # 첫글자만 대문자로 변경

# 문자 검색하기 
mylist.index('m') 
mylist.find('m')
# 참고 mylist.index('m', 4) 이렇게 사용하면 mylist의 4번째 자리부터 'm'이 있는지 검사함.
   # index, find 함수 모두 m이라는 문자가 몇 번째 index에 위치하는지 알 수 있음.
   # 단, 두 함수간의 차이는 find는 해당 문자가 없으면 -1을 반환하고, index는 error를 반환한다.

# 문자열 다듬기
mylist.lstrip # 왼쪽 공백 제거 
mylist.rstrip # 오른쪽 공백 제거 
mylist.strip # 양쪽 공백 제거 

Reference

jeeyeonLIM commented 3 years ago

해시

d={'one':'하나','two':'둘'} d.keys() d.values() d.items() # zip에서와 같은 방식~!

#### 예제
- strings값이 들어올 때 알파벳이 몇개씩 있는지를 보여주는 hash를 작성해보자.
```python
def solution(strings):
    hash_map={} # 해시맵 만들거야
    for string in strings:

        # key값에 string 값이 없으면 새로 지정해서 넣어주기
        if string not in hash_map.keys(): 
            hash_map[string]=1
        # key값에 이미 들어와 있더라면 value에 +1  
        else: 
            hash_map[string] += 1

    return hash_map

image

관련 문제

jeeyeonLIM commented 3 years ago

완전탐색

관련 문제

jeeyeonLIM commented 3 years ago

SQL

이름 조작 SQL
Create 생성 INSERT
Read 읽기 SELECT
Update 갱신 UPDATE
Delete 삭제 DELETE

CRUD(Create, Read, Update, Delete)

1. Create

# 값 생성하기
SELECT * FROM Mytable ORDER BY a1; # 먼저 Mytable이 어떤 변수값을 포함하는지 확인해준다
INSERT INTO Mytable VALUES ('jeeyeon', 'LIM', 'DJ') # 각각 a1, a2, a3 변수에 포함될 값을 적어준다.

# 아래는 테이블 생성 예시
CREATE TABLE PLAYER (
       PLAYER_ID                CHAR(7)             NOT NULL,
       PLAYER_NAME        VARCHAR2(20)  NOT NULL,
       TEAM_ID                   CHAR(3)             NOT NULL,
       E_PLAYER_NAME   VARCHAR2(40),
       NICKNAME               VARCHAR2(30),

      CONSTRAINT PLAYER_PK PRIMARY KEY (PLAYER_ID),
      CONSTRAINT PLAYER_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID)

);
# 출처: https://hyeonstorage.tistory.com/291 [개발이 하고 싶어요]

2. Read

mysql - date 다루기

DATE_FORMAT(STR_TO_DATE(date_char, '%Y%m%d'),'%Y-%m-%d ') # char 형태를 date 형태의 포맷으로 변환하기

date 형식 다루기

PLUS

DATE_ADD(날짜, INTERVAL 1 YEAR) DATE_ADD(날짜, INTERVAL 1 MONTH) DATE_ADD(날짜, INTERVAL 1 DAY) DATE_ADD(날짜, INTERVAL 1 HOUR) DATE_ADD(날짜, INTERVAL 1 MINUTE)
DATE_ADD(날짜, INTERVAL 1 SECOND)

MINUS

DATE_SUB(날짜, INTERVAL 2 YEAR)

두 날짜간 연산

DATEDIFF(날짜2, 날짜1) # 날짜1 < 날짜2 TIMESTAMPDIFF(WEEK, 날짜1, 날짜2) #DAY, MONTH, YEAR,... 변환 가능!

요일 추출

dayname('2019-01-01')

문자열dt에서 date형식으로 변환한 뒤 year 추출

date_part('year',concat_ws('-',substr(dt,1,4),substr(dt,5,2),substr(dt,7,2))) as years

한 주의 첫 일자 추출

from_timestamp(date_trunc('week',concat_ws('-',substr(dt,1,4),substr(dt,5,2),substr(dt,7,2))),'yyyy-MM-dd' ) as stdt

Rank 함수

RANK() OVER(partition by 변수명, order by)

동순위 같은 RANK, 최종 랭크는 최종 행 수가 되는 방식

Ex) RANK : 1 2 2 4

RANK() OVER (PARTITION BY user_id ORDER BY count(distinct product_id) desc) as rk #유저 id 내에서 가장 많이 구입한 product_id 의 rank 를 생성

정규식(String)

where 변수명 regexp '검사할문자1|검사할문자2'

^ 시작

$ 끝

기타 함수

cast(문자변수 as char) # 형변환 함수 cast 숫자변수 -> 문자변환 coalesce(변수명, null을 대체할 값) # if(변수명 is null, null대체값, 변수명) 과 같음. lag(변수명,1) over(partition by 나눌 변수 )

#### 3. Update
```sql
UPDATE 테이블명 SET 변수명 = '값' WHERE 조건 # 특정 조건에 해당하는 변수의 값을 변경

4. Delete

DELETE FROM 테이블명; # 테이블 전체 삭제 
DELETE FROM 테이블명 WHERE 조건 # 조건에 해당하는 row문 삭제 
jeeyeonLIM commented 3 years ago

스택/큐

jeeyeonLIM commented 3 years ago

jeeyeonLIM commented 3 years ago

탐욕법(Greedy)

jeeyeonLIM commented 3 years ago

기본 문법 싹쓰리이

정리원본

# dir(l)

# 'append',  # 하나의 요소 추가
#  'clear',  # 모든 요소를 없애기 
#  'copy',   # 리스트를 function으로 넘길 때 복사함.
#  'count',  # 갯수 세주기
#  'extend', # 요소 한번에 많이 추가할 때
#  'index',  # 요소 찾을 때 
#  'insert', # 해당되는 자리에 요소 넣을 때
#  'pop',    # 뒤에서 값을 꺼낼 때 
#  'remove', # 요소의 값을 지울 때! 속도가 O(n)이므로 del로 지우는 것이 더 좋음.
#  'reverse',# 역순
#  'sort'    # 정렬

# try: 실행할 코드 except:예외발생시(에러 발생시) 실행할 코드
# 예시 : 예를들면 

List 관련


# append + pop
l=[]
l.append(10)
l.append(20)
l.append(30)

# 큐와 스택 방식
l.pop(0) # 0번째 index 추출 ! 큐의 구조~! (10값 빼줌)
l.pop()  # 가장 늦게 들어온 애를 추출# stack의 구조
l

### 해시맵 유용한 관련한 예제~ ! ### 
#Q. 문자열로 쪼개진 것을 어떻게 숫자형으로 바꿀 수 있을까?
# method1
[int(i) for i in '1 2 3 4 5 6 7'.split() ]

# method2 - map의 function을 int로 주기!!!!
list(map(int,'1 2 3 4 5 6 7'.split() ))

[ List 관련] sorted vs sort

# sorted는 return 값을 내주는 것. 
testCase1=['abc','def','hello world', 'hello', 'python']
testCase2='Life is too short, You need python'.split()
testCase3=list(zip('anvfe',[1,3,2,4,5]))
sorted(testCase1, key=len, reverse=True) # 길이 순으로 정렬, 역순
sorted(testCase2, key=str.lower) # 대소문자 구별 없이 맨 앞 알파벳 순으로 정렬됨.
sorted(testCase3, key= lambda x: x[1]) # 두번째 원소 기준 정렬
    ### 이렇게 list 내 tuple 형태일 때 dictionary 정렬하고 싶을 때 사용하기 유용함!!! 

# 반면, sort는 list를 직접 정렬로 바꿔주는 것임.
l=[10,4,5,3,6,7]
l.sort()
print(l)

Dict(Hash) 관련

d={'one':'하나','two':'둘'}
d.keys()
d.values()
d.items() # zip에서와 같은 방식~!

### 해시맵 유용한 관련한 예제~ ! ### 
# 단톡방에 x마리의 동물이 대화를 하고 있다.
# 각각 동물들이 톡을 전송할 때마다 서버에는 아래와 같이 저장된다.
serverData='개리 라이캣 개리 개리 라이캣 자바독 자바독 파이 썬'

# 1. 단톡방에는 모두 몇마리 동물이 있나? (톡은 무조건 1회 이상 전송함)
len(set(serverData.split())) 

# 2. 단톡방에 동물들마다 몇 번의 톡을 올렸을까? 
hashmap={}
for i in set(serverData.split()):
    hashmap[i] = serverData.split().count(i)
hashmap

Set 집합


# set :중복 제거 용도로 활용할 수 있음. but 순서가 없다.
    # issue5. 참고 

s=set('111223455677')
s

# 집합연산 
#dir(s)
#  'add',
#  'clear',
#  'copy',
#  'difference',            # 차집합집합1.different(집합2번째) 
#  'difference_update',
#  'discard',
#  'intersection',
#  'intersection_update',
#  'isdisjoint',
#  'issubset',
#  'issuperset',
#  'pop',
#  'remove',
#  'symmetric_difference',
#  'symmetric_difference_update',
#  'union',                 # 합집합 
#  'update'                # 한꺼번에 많은 데이터를 추가

s.add(7)
s.discard(7)

'1' in s

판콜에이 = {'A','B','C'}
타이레놀 = {'A','B','D'}

print(판콜에이.difference(타이레놀)) # 차집합. 판콜에이-타이레놀 
print(판콜에이.intersection(타이레놀)) # 교집합
print(len(판콜에이.intersection(타이레놀))) # 같은 원소의 갯수를 구해라.
print(판콜에이.union(타이레놀))

기타

# 일반 함수 - 숫자 
abs(-3) # 절대값 
all([1,2,3]) # 모든 값이 참이면 True, 하나라도 거짓이면 False
all([0,1,2,3]) # 이건 False !
any([1,2,3]) # 하나라도 참이 있으면 True, 모두가 거짓일 경우 False
dir([1,2,3,4]) # list metod 검색할 수 있음!

# format(숫자, 원하는 형식)
format(1000000000, ',') # 원(\)표시 
format(1000000000, 'e') # 지수 표현
format(1000000000, 'x') # 소문자 표현

# filter(함수, 적용할 요소)
# Methdod1 
def jy(value):
    if value %2 ==0:
        return value
    else:
        return None
M1=list(filter(jy, range(20)))

# Method2
M2= list(filter(lambda x: x%2 ==0 , range(20)))

# zip : 묶어주기
list(zip(['a','b','c','d'],[1,2,3,4],[10,20,30,40],'ABCD'))
  # [('a', 1, 10, 'A'), ('b', 2, 20, 'B'), ('c', 3, 30, 'C'), ('d', 4, 40, 'D')]