728x90
반응형

AI와 같은 분야에서는 최신 기술이나 연구를 찾는 것이 정말 중요하다.
지금도 계속해서 새로운 SOTA(State-of-the-art, 가장 성능이 좋은) 알고리즘이 나오고 있다.
공부하는 입장에서 안정적인 architecture를 공부하는 것도 중요하지만, 열심히 사용한 알고리즘보다 성능이 뛰어난 알고리즘이 나온다면 지금 짜고 있는 코드가 무용지물 되어버리기도 한다.

1) [찾고 싶은 분야] + top conference라고 검색하면 유명 학회들의 논문들을 검색할 수 있다.

2) [찾고 싶은 학회 이름] + accepted paper list 라고 검색하면 유명 학회의 최신 논문들을 검색할 수 있다.

참고로 AI 관련 분야별 Top Conference으로는

 

 

AI 전반

- NeurIPS(=NIPS)
- ICML
- ICLR
- AAAI
- IJCAI

NLP

- ACL
-EMNLP

CV

- CVPR
- ICCV(격년, ECCV)

RS

-RecSys

Speech

-InterSpeech
-ICASSP

가 있다.

 

아래 사이트는 분야별 논문들을 모니터할 수 있는 사이트이다.

디폴트로 hot papers, freshpapers가 되어있고, keywords를 검색해서 add monitor를 누르면 자동으로 최신 논문들을 모아준다.

https://deeplearn.org

 

Deep Learning Monitor - Find new Arxiv papers, tweets and Reddit posts for you

Fresh Papers Zeju Qiu, Weiyang Liu, Haiwen Feng, Zhen Liu, Tim Z. Xiao, Katherine M. Collins, Joshua B. Tenenbaum, Adrian Weller, Michael J. Black, Bernhard Schölkopf 2024-08-15 PDF Mendeley Hongyu Li, Snehal Dikhale, Jinda Cui, Soshi Iba, Nawid Jamali 20

deeplearn.org

 

 

 

아래는 paperswithcode라는 사이트인데, 분야별로 SOTA논문들을 찾기 유용하다.
깃허브도 연동시켜주기 때문에 논문을 구현할 때도 도움을 받기 편하다.

https://paperswithcode.com

 

Papers with Code - The latest in Machine Learning

Papers With Code highlights trending Machine Learning research and the code to implement it.

paperswithcode.com

다음 글에서는 논문을 읽는 방법, 그것도 매우 잘 읽는 방법에 대해서 이야기해보겠다.

728x90
반응형
728x90
반응형

노션 캘린더가 나온지 4달정도 됐다.

새로운 앱이 나오면 또 나름 "컴퓨터 전공자"라고 한 번씩 사용해보는 편인데,

계속 사용해봐야지 하다가, 중간고사 끝난 김에 도전해봤다.

나온지 얼마 안되어서 그런가, 아직 사용법을 올린 사람이 적어서 해맨 부분들을 정리해서 공유하려고 한다.


내가 캘린더앱을 고르는 기준은 무조건 outlook이랑 연동되는지가 우선인데, 안 그러면 과제 기한을 잊는 경우가 종종 있다...

다만, 노션 캘린더는 홈페이지에서도 언급하듯이

직접적으로 outlook을 연결하는건 아직 지원하지 않는다.

그래서 우회해야하는데, 내 경우에는 다음과 같은 방법으로 연결했다.

참고로, 맥북 기준이고, 윈도우에서도 비슷하게 하면 사용할 수 있다.

한 계정에서 연결 해놓으면, 다른 계정에서는 자동으로 따라온다.


Step 1 노션 캘린더 다운받기

https://www.notion.so/product/calendar

 

Notion 캘린더

Beautifully designed and fully integrated with Notion and Google Calendar.

www.notion.so

캘린더 앱은 아직 윈도우, 맥, 아이폰에서만 다운로드가 가능하다고 한다!

 

다운로드를 누르면, 다운받을 수 있는 아래로 연결된다.

본인 OS에 맞춰서 다운로드 하면 된다

앱을 설치하고 나면(그냥 다운로드 받은 걸 실행시키면 자동으로 설치된다) 바로 실행된다.


Step 2 노션 캘린더 로그인 및 권한 선택

구글 계정만 연결할 수 있다.

Sign in with Google을 누르면 웹 브라우저로 연결되고, 다음과 같이 나오는데, 

이렇게 나오는데, 여기서 사용 권한을 다 승인해줘야 구글 캘린더와 연결될 수 있다.

우선 계속해서 Google 사용 권한으로 이동을 선택해서 로그인 창으로 넘어가고,

원하는 구글 계정을 선택해서 로그인을 해준다.

계속을 누르고

계속을 눌러준다.

이제는 권한을 선택해줄 시간인데,

기본적으로 눌러져있는 회색 네모박스 외에는 저렇게 3개만 눌러줘도 이용하는데는 지장이 없다.

나머지는 선택적으로 누르면 된다.

그럼 요런 화면을 만날 수 있다.

평상시에 구글 캘린더를 사용하지 않았다면, 초록색 글씨만 있을 수도 있다.


Step 3 구글캘린더와 outlook 연결하기

아까도 말했지만, 직접적으로 outlook 캘린더계정을 연결하는 것은 불가능하다.

따라서 우회해야하는데, 내가 선택한 방식은 구글 캘린더에 outlook 계정을 연결시켜놓는 것이다.

그러면 노션 캘린더에서도 보인다.

우선 학교 eclass나 outlook 계정에 들어가서 캘린더 피드 링크를 받아온다.

Eclass에서 캘린더 피드 링크 가져오기

이클래스에서 왼쪽에 캘린더 버튼을 누르면 다음과 같이 창이 뜨는데,

오른쪽 하단에 있는 캘린더 피드 버튼을 눌러준다.

그럼, 요렇게 캘린더 링크가 나온다.

구글캘린더에 outlook 캘린더 피드 연결

다음으로 구글 캘린더에 들어간다.

https://calendar.google.com/

 

Google Calendar - Easier Time Management, Appointments & Scheduling

Learn how Google Calendar helps you stay on top of your plans - at home, at work and everywhere in between.

calendar.google.com

위쪽에 톱니바퀴를 눌러서 설정에 들어간다.

왼쪽 메뉴바에 캘린더 추가-URL로 추가에 들어간다.

여기 캘린더의 URL 부분에 아까 캘린더 피드 URL을 붙여넣으면 된다.

요렇게 맨 아래 쪽에 추가된 것을 볼 수 있다.

별다른 설정을 건드릴 필요는 없다.

Step 4 노션 캘린더에서 마무리 작업

이제 마무리 작업이다.

별도의 작업은 필요하지 않지만, 바로 연동되지는 않고, 시간이 조금 지나면 연동이 된다.

728x90
반응형
728x90
반응형

내일 시험보러 가는데

일단, 준비물 내일 챙겼나 확인해보고..

더보기

준비물

1. 신분증

2. 수험표(검사함)

3. 삼색 볼펜

4. 샤프

5. 지우개

6. 알고리즘 정리한거 인쇄하기 (태블릿은 들고 있기 너무 불편함)

알고리즘 정리한거 다시 읽기

 

728x90
반응형
728x90
반응형

심각하다 심각해

일단 일요일 전까지 해야하는 모든 일들을 다 끝냈다.

2일동안 진짜 최대한 많이 외워야지

남은 2일 목표는

안 푼 기출문제 다 풀고, 다시 보기로 표시해놨던 기출은 다시 봐야지

dfs, bfs, dp, backtracking, simulation에 관한 문제들 진짜 풀이 방법을 다 외우고, 그래야지.

728x90
반응형
728x90
반응형

코테 준비하면서 까먹은 알고리즘 유형들이 너무 많아서 파이썬 코드로 다시 정리해 놓으려고 한다.


1. 입력받기

삼성 코테에서는 사용할 모든 input에 대해서 미리 정의해 놓은 답지를 제공한다. 따라서, 크게 필요는 없지만...

1.1 기본 저장

기본적으로 저장은 문자열로 저장된다.

a = input()

1.2 입력과 형 변환

입력과 동시에 정수로 형 변환

a = int(input())

1.3 split()

파라미터를 주지 않으면, 공백 문자를 기준으로 잘라주는 내장함수. 

a = input().split()

1.4 map()

map(func, x)의 형태로 사용하는 방식으로 x의 각 요소에 func을 적용시켜 주는 함수이다.

a = list(map(int, input().split()))

1.5 가변인자

n개까지는 리스트로 받고, 마지막을 정수형으로 받는 등의 형태를 할 수 있다.

*a, b = map(int, input().split())

1.6 1차원 배열

a = list()
for _ in range(10):
    a.append(0)
a = [ 0 for _ in range(10) ]
a = [ 0 ] * 10

1.7 2차원 배열

a = [[0] * m for _ in range(n) ]   # n x m 배열

1.8 반복해서 입력받기

L, A, B, C, D = [ int(input()) for _ in range(5) ]

1.9 2차원 배열 입력받기

n, m = map(int, input().split())
a = [ list(map(int, input())) for _ in range(n) ]

공백으로 구분되어 있는 경우

n, m = map(int, input().split())
a = [ list(map(int, input().split())) for _ in range(n) ]

2. 정렬

2.1 오름 차순 정렬하기

a가 오름차순으로 변경되는 방법

a = [1, 5, 7, 4, 6]
a.sort()

a는 변경시키지 않고 반환 값만 정렬해서 넘겨주는 방식

a = [1, 5, 7, 4, 6]
b = sorted(a)

2.2 내림차순 정렬하기

a = [1, 5, 7, 4, 6]
a.sort(reverse=True)

2.3 기준에 따라 정렬하기

  1. x좌표를 오름차순으로, 
  2. x좌표가 같다면 y좌표를 오름차순으로
a = [list(map(int, input().split())) for _ in range(5)]
a.sort(key = lambda x: x[1])
  1. y좌표를 오름차순으로
  2. y좌표가 같다면 x좌표를 내림차순으로
a = [list(map(int, input().split())) for _ in range(5)]
a.sort(key = lambda x: (x[1], -x[0]))

3. 큐, 스택, 덱(Queue, Stack, Deque)

3.1 Queue

Queue란, 먼저 들어온 데이터가 먼저 나가는 구조로 FIFO를 띄는 자료구조이다.

  • push: 큐의 가장 마지막에 데이터를 넣는 연산
  • pop: 큐의 가장 앞의 데이터를 제거하는 연산
  • front: 큐의 가장 앞의 값을 확인하는 연산
  • empty: 큐가 비어있는지 확인하는 연산

python에서 제공하는 함수에는

  • put(x) : x를 큐의 가장 뒤에 넣는다
  • get() : 큐의 가장 앞에 있는 정수를 빼고 그 값을 반환한다
  • qsize() : 큐에 들어있는 정수의 개수를 반환한다
  • empty() : 큐에 비어있으면 True, 아니면 False를 반환한다

이 있다.

import queue
q = queue.Queue()

3.2 Stack

Stack이란, 나중에 들어온 데이터가 먼저 나가는 구조로 LIFO를 띄는 자료구조이다.

  • push: 스택의 가장 마지막에 데이터를 넣는 연산
  • pop: 스택의 가장 마지막의 데이터를 제거하는 연산
  • top: 스택의 가장 마지막의 값을 확인하는 연산
  • empty: 스택이 비어있는지 확인하는 연산
  • size: 스택의 크기를 확인하는 연산

python에서 제공하는 함수에는 

  • append(x): 리스트의 가장 마지막에 x를 추가한다.
  • pop(): 리스트의 가장 마지막 원소를 제거한다.

이 있다.

Stack은 모듈로 존재 하지 않고, 리스트를 통해 간접 구현한다.

3.3 Deque

Deque란, 양방향 Queue라는 의미의 자료구조이다. 앞 뒤 모두 삽입 가능하고 삭제 가능하다.

  • append(x): 덱의 가장 뒤에 x를 삽입한다.
  • appendleft(x): 덱의 가장 앞에 x를 삽입한다.
  • pop(): 덱의 가장 마지막 원소를 제거하며 반환한다.
  • popleft(): 덱의 가장 처음 원소를 제거하며 반환한다.
from collections import deque
dq = deque()

4. 순열과 조합

실제 시험에서 itertools 모듈이 사용 불가능할 수 있다. 직접 구현 방법도 외워 놓자.

# 중복 없는 순열
from itertools import permutations
# 중복 없는 조합
from itertools import combinations
# 중복 있는 순열 / 각 집단에서 추출
from itertools import product
# 중복 있는 조합
from itertools import combinations_with_replacement

4.1 직접 구현 

# 순열 : n개 중에서 중복없이 r개를 뽑음, 이때 순서 상관있음(순서가 다르고 원소가 같으면 다른 걸로 침)
def permutations(arr, r):
    for i in range(len(arr)):
        if r == 1:
            return [arr[i]]
        else:
            for next in permutations(arr[:i] + arr[i+1:], r-1):
                yield [arr[i]] + next

# 조합 : n개 중에서 중복없이 r개를 뽑음, 이때 순서 상관없음(순서가 다르고 원소가 같으면 같은 걸로 침)
def combinations(arr, r):
    for i in range(len(arr)):
        if r == 1:
            return [arr[i]]
        else:
            for next in combinations(arr[i+1:], r-1):
                yield [arr[i]] + next

# 중복조합 : n개 중에서 중복 포함하여 r개를 뽑음, 이때 순서 상관없음
def combinations_with_replacement(arr, r):
    for i in range(len(arr)):
        if r == 1:
            return [arr[i]]
        else:
            for next in combinations_with_replacement(arr[i:], r-1):
                yield [arr[i]] + next

# 중복 순열 : n개 중에서 중복 포함하여 r개를 뽑음, 이때 순서 상관있음
def product(arr, r):
    for i in range(len(arr)):
        if r == 1:
            return [arr[i]]
        else:
            for next in product(arr, r-1):
                yield [arr[i]] + next

4.2 중복 없는 순열

from itertools import permutations
print(list(permutations([1,2,3], 3)))

4.3 중복 없는 조합

from itertools import combinations

n, m = map(int, input().split())
c = list(combinations(range(1, n+1), m))

for x in c:
   print(*x)

4.4 중복 있는 순열 / 각 집단에서 추출 구현

product 함수를 통해 구현

from itertools import product
product([1,2,3], [4,5,6]) # 각 리스트 별로 한 개씩 추출한다.
product([1,2,3], repeat = 2)

4.5 중복 있는 조합

from itertools import combinations_with_replacement as com

n, m = map(int, input().split())
c = list(com(range(1, n+1), m))

for x in c:
    print(*x)

 

5. BFS와 DFS

여기서 무조건 한 문제가 나온다.

5.1 이론 설명

BFS는 Breadth First Search로 너비 우선 탐색이라는 뜻이다.

위키피디아

DFS는 Depth First Search로 깊이 우선 탐색이라는 뜻이다. 

위키피디아

가장 중요한 점은 그래프를 모두 탐색하는 알고리즘이다.

5.2 입력받는 방식

인접 행렬 방식

# 배열을 통한 그래프 표현 방법
n, m, v = map(int, input().split()) #정점의 개수, 간선의 개수, 시작 번호

a = [[0]*(n+1) for _ in range(n+1)]

for _ in range(m):
    x, y = map(int, input().split())
    a[x][y] = 1
    a[y][x] = 1

for x in a:
    print(x)

인접 리스트 방식

n, m, v = map(int, input().split()) #정점의 개수, 간선의 개수, 시작 번호

a = [list() for _ in range(n+1)]
for _ in range(m):
    x, y = map(int, input().split())
    a[x].append(y)
    a[y].append(x)

for x in a:
    print(x)

5.3 BFS

import queue
n, m, v = map(int, input().split()) # 정점의 개수, 간선의 개수, 시작 번호

a = [list() for _ in range(n+1)]
for _ in range(m):
    x, y = map(int, input().split())
    a[x].append(y)
    a[y].append(x)

for x in a:
    x.sort()

chk = [False]*(n+1)
q = queue.Queue()
q.put(v)
chk[v] = True
import queue
n, m, v = map(int, input().split())    # 정점의 개수, 간선의 개수, 시작 번호

a = [list() for _ in range(n+1)]
for _ in range(m):
    x, y = map(int, input().split())
    a[x].append(y)
    a[y].append(x)

for x in a:
    x.sort()

chk = [False]*(n+1)

# BFS 함수 구현 
def bfs(start):
    q = queue.Queue()
    q.put(start)
    chk[start] = True

    while not q.empty():               
        now = q.get()                 # 큐에서 가장 앞으 노드를 꺼내온다.
        print(now, end=" ")           # 해당 노드를 방문한다는 의미로 출력한다.
        for next in a[now]:           # 방문한 노드의 인접 노드들을 for문을 통해 next에 저장한다.
            if not chk[next]:         # 인접 노드가 체크가 되어있지 않다면
                chk[next] = True      # 체크를 해주고,
                q.put(next)           # 인접 노드를 큐에 넣어준다. 
    print()

bfs(v) # bfs 함수 실행

5.4 DFS

n, m, v = map(int, input().split()) #정점의 개수, 간선의 개수, 시작 번호

a = [list() for _ in range(n+1)]
for _ in range(m):
    x, y = map(int, input().split())
    a[x].append(y)
    a[y].append(x)

for x in a:
    x.sort()

chk = [False]*(n+1)
n, m, v = map(int, input().split()) #정점의 개수, 간선의 개수, 시작 번호

a = [list() for _ in range(n+1)]
for _ in range(m):
    x, y = map(int, input().split())
    a[x].append(y)
    a[y].append(x)

for x in a:
    x.sort()

chk = [False]*(n+1)

def dfs(node):
    chk[node] = True
    print(node, end=" ")

    for next in a[node]:
        if not chk[next]:
            dfs(next)

dfs(v)
print()

5.5 BFS, DFS 총 코드

import queue
n, m, v = map(int, input().split()) #정점의 개수, 간선의 개수, 시작 번호

a = [list() for _ in range(n+1)]
for _ in range(m):
    x, y = map(int, input().split())
    a[x].append(y)
    a[y].append(x)

for x in a:
    x.sort()

def bfs(start):
    q = queue.Queue()
    q.put(start)
    chk[start] = True

    while not q.empty():
        now = q.get()
        print(now, end=" ")
        for next in a[now]:
            if not chk[next]:
                chk[next] = True
                q.put(next)
    print()

def dfs(node):
    chk[node] = True
    print(node, end=" ")

    for next in a[node]:
        if not chk[next]:
            dfs(next)

chk = [False]*(n+1)
dfs(v)
print()
chk = [False]*(n+1)
bfs(v)

6. 백트래킹 (Backtracking)

6.1 백트래킹 VS DFS 비교

  • 백트래킹
    • 어떤 노드에서 출발하는 경로가 그 해결책으로 이어질 것 같지 않으면 더 이상 경로를 탐색하지 않음으로써 시도 횟수 감소
    • 불필요한 경로의 조기 차단
    • N! 가지의 경우의 수를 가진 문제에 대해 백트레킹에 가하면 일반적으로 경우의 수가 줄어들지만 최악의 경우는 처리 불가능
    • 모든 후보를 검사하지 않음
  • DFS
    • 모든 경로를 추적
    • N! 가지의 경우의 수를 가진 문제에 대해 깊이 우선 탐색을 이용하면 처리 불가능
    • 모든 후보를 검사

6.2 백트래킹 구현

기본 구현

def 재귀함수(n):
	if 정답이면 :
		출력 or 저장
	else : 정답이 아니면 :
		for 모든 자식 노드에 대해서:
			if 답의 가능성이 있으면:
				자식노드로이동
				재귀함수(n+1)
				부모노드로 이동

답 조건 확인하면서 구현

def 백트래킹(n):
	if 정답이면 :
		출력 or 저장
	else :
		for 모든 자식 노드에 대해 :
			if 유망한지확인(m) :
				자식노드로 이동
				백트래킹(n+1)
				부모노드로 이동

def 답에 가까운지 확인(m):
	if 조건에 안맞으면 :
		return False
	return True

 

0. 참고자료

https://m.blog.naver.com/PostList.naver?blogId=wpghks7&categoryName=삼성% 20SW역량테스트&categoryNo=4&logCode=0

 

알파카고수 : 네이버 블로그

당신의 모든 기록을 담는 공간

m.blog.naver.com

https://velog.io/@dust_potato/python-itertools-algorithm-직접-구현하기

 

[python] itertools algorithm 직접 구현하기

 

velog.io

https://edder773.tistory.com/75

 

[파이썬] 탐색 알고리즘 정리 - 백트래킹

백트래킹 (*Notion AI의 설명) 백트래킹(Backtracking)은 해결책을 구하기 위해 모든 가능성을 시도해보는 것이 아니라, 해결책에 대한 후보군을 구성하고 그 후보군이 문제의 조건을 만족하는지 여부

edder773.tistory.com

 

728x90
반응형
728x90
반응형

문제보기 (난이도 : 브론즈 2, Greedy)

https://www.codetree.ai/training-field/frequent-problems/problems/virus-detector/description?page=1&pageSize=20&order=tier

풀이 전략 (걸린 시간 : 12분)

흔히 볼 수 있는 문제다. 별다른 풀이가 필요하지 않았다.

더보기

변수

n = 식당 수

headT = 팀장 수

memT = 팀원 수

min_headT = n 최소 팀장 수 (사용 X)

min_memT = 최소 팀원 수

minT = min_headT + min_memT 검사자 수의 최소

코드

Runtime: 335ms Memory: 122MB

n= int(input()) #식당 수

restaurant = list(map(int,input().split())) #식당별 고객 수

headTmax, memTmax = map(int,input().split()) #팀장 max 수, 팀원 max 수

minT = n
for i in range(len(restaurant)):
    restaurant[i] -= headTmax
    if restaurant[i] <= 0: #팀장 만으로 충분할 때
        continue
    else:
        minT += restaurant[i] // memTmax
        if restaurant[i] % memTmax != 0:
            minT += 1
print(minT)

다른 사람 풀이

 

복습

  • 문제 경우의 수 제대로 나누기
  • map 함수 자동완성 기능 없이 사용할 수 있어야 한다.
    • map(int, input(), split())
  • for문에서 continue 사용법 확인하기

python 반복문 제어하기 - break, continue, pass

python 반복문 제어하기 - break, continue, pass

728x90
반응형

+ Recent posts