diff --git a/week1/group3/1662-everglow02.py b/week1/group3/1662-everglow02.py index af75f27..4032947 100644 --- a/week1/group3/1662-everglow02.py +++ b/week1/group3/1662-everglow02.py @@ -1,30 +1,48 @@ -## 33(562(71(9))) +# ## 33(562(71(9))) -from sys import stdin -input = stdin.readline +# from sys import stdin +# input = stdin.readline -def printUnzippedString(priorLeft): #재귀함수 - unzippedLength = int(S[priorLeft-1]) * sLen[-1] # K*Q 자리수 - left = S.rfind('(', 0, priorLeft) - if left == -1: - leftOver = S[0:priorLeft-1] - sLen.append(unzippedLength + len(leftOver)) - return - else: - right = S.find(')', left) - start = right if right < priorLeft else left - sLen.append(unzippedLength + len(S[start+1:priorLeft-1])) - return printUnzippedString(left) +# def printUnzippedString(priorLeft): #재귀함수 +# unzippedLength = int(S[priorLeft-1]) * sLen[-1] # K*Q 자리수 +# left = S.rfind('(', 0, priorLeft) +# if left == -1: +# leftOver = S[0:priorLeft-1] +# sLen.append(unzippedLength + len(leftOver)) +# return +# else: +# right = S.find(')', left) +# start = right if right < priorLeft else left +# sLen.append(unzippedLength + len(S[start+1:priorLeft-1])) +# return printUnzippedString(left) -# 0.입력 받기 -S = input() -sLen = [] +# # 0.입력 받기 +# S = input() +# sLen = [] -left = S.rfind('(') # leftBracketIdx -right = S.find(')', left) # rightBracketIdx -if left == -1: # 압축이 없으면 - print(len(S)) -else: - sLen.append(len(S[left+1:right])) - printUnzippedString(left) - print(sLen[-1]) +# left = S.rfind('(') # leftBracketIdx +# right = S.find(')', left) # rightBracketIdx +# if left == -1: # 압축이 없으면 +# print(len(S)) +# else: +# sLen.append(len(S[left+1:right])) +# printUnzippedString(left) +# print(sLen[-1]) + +def rec(tmp, stack): + while stack: + top = stack.pop() + if top == ')': + tmp += rec(0, stack) + elif top == '(': + r = int(stack.pop()) + tmp = tmp * r + return tmp + else: + tmp += 1 + return tmp + +str = input() +stack = list(str) +answer = rec(0, stack) +print(answer) \ No newline at end of file diff --git "a/week10/group3/27 \354\240\225\353\240\254\353\220\234 \353\260\260\354\227\264\354\227\220\354\204\234 \355\212\271\354\240\225 \354\210\230\354\235\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260.py" "b/week10/group3/27 \354\240\225\353\240\254\353\220\234 \353\260\260\354\227\264\354\227\220\354\204\234 \355\212\271\354\240\225 \354\210\230\354\235\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260.py" new file mode 100644 index 0000000..0104868 --- /dev/null +++ "b/week10/group3/27 \354\240\225\353\240\254\353\220\234 \353\260\260\354\227\264\354\227\220\354\204\234 \355\212\271\354\240\225 \354\210\230\354\235\230 \352\260\234\354\210\230 \352\265\254\355\225\230\352\270\260.py" @@ -0,0 +1,44 @@ +import sys +input = sys.stdin.readline + +N, x = map(int, input().split()) +series = list(map(int, input().split())) + +def count_with(pos,n): # x 개수 세기 + target = series[pos] + cur = pos + cnt = 0 + # 현재 위치로부터 앞 탐색 + while pos >= 0: + if series[pos] < target: # series는 오름차순 정렬이기 때문에 target이 아니면 target보다 작음 + break # 목표가 아니므로 반복문 종료 + cnt+=1 + #print('pos',pos,cnt) + pos-=1 # 개수 세기 + # 현재 위치로부터 뒤 탐색 + pos = cur+1 # 바로 다음 수부터 탐색 + while pos < n: + if series[pos] > target: # target이 아니면 target보다 큼 + break # 반복문 종료 + cnt+=1 + #print('pos',pos,cnt) + pos+=1 + return cnt # 목표 개수 반환 + +def binary_search(n,x): + cnt = 0 + left = 0 + right = n-1 + + while left <= right: + mid = (left+right)//2 + + if series[mid]>x: + right = mid - 1 + elif series[mid]std: + sum+=(rc-std) + if sum < m: + return False # 정답 후보가 될 수 없음 + elif sum > m: + candidates.append(std) # 정답 후보로 추가 + else: # sum == m + return True # 빼박 정답 후보 + +def binary_search(arr): + left = 0 # min(arr) # 이 함수에서는 인덱스가 아니라 값을 가리킴 + right = max(arr) #-1 m의 최솟값:1 + + while left<=right: + mid = (left+right)//2 + + if check(mid) == False: + right = mid-1 # mid가 너무 컸기 때문에 줄여야 함 + elif check(mid) == True: + return mid + else: # 얻은 떡이 m보다 컸음=mid가 작았기 때문에 키워야 함 + # result = mid # 어차피 갱신되므로 + left = mid+1 + # 정확히 m이 나오지 않음=> 근사값 찾아야 + return min(candidates) + #return result + +print(binary_search(rice_cake)) \ No newline at end of file diff --git "a/week10/group3/[\354\213\244\354\240\204] \353\266\200\355\222\210 \354\260\276\352\270\260.py" "b/week10/group3/[\354\213\244\354\240\204] \353\266\200\355\222\210 \354\260\276\352\270\260.py" new file mode 100644 index 0000000..fb204ca --- /dev/null +++ "b/week10/group3/[\354\213\244\354\240\204] \353\266\200\355\222\210 \354\260\276\352\270\260.py" @@ -0,0 +1,24 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +nums = list(map(int,input().split())) +M = int(input()) +req = list(map(int,input().split())) + +def binary_search(arr,left,right,x): + if left<=right: + middle = (left+right)//2 + if arr[middle]x: + return binary_search(arr,left,middle-1,x) + else: + print('yes',end=' ') + else: + print('no',end=' ') + +nums.sort() + +for num in req: + binary_search(nums,0,N-1,num) \ No newline at end of file diff --git a/week2/group3/1260_everglow02.py b/week2/group3/1260_everglow02.py new file mode 100644 index 0000000..0ac2b89 --- /dev/null +++ b/week2/group3/1260_everglow02.py @@ -0,0 +1,45 @@ +import sys +input = sys.stdin.readline + +from collections import deque + +N, M, V = map(int,input().split()) +graph = [[] for _ in range(N+1)] +visited = [False for _ in range(N+1)] + +for i in range(M): # 그래프 생성 + node1, node2 = map(int,input().split()) + graph[node1].append(node2) + graph[node2].append(node1) + +for adj in graph: # 오름차순 정렬5 + adj.sort() + +def DFS(graph, visited, start): + if visited[start]: + return + visited[start] = True + print(start, end=" ") + for dest in graph[start]: + DFS(graph, visited, dest) + +DFS(graph, visited, V) +visited = [False for _ in range(N+1)] + +next = deque() +cur = 0 +print("\n", end= "") +def BFS(graph, visited, start): + next = deque([start]) + visited[start] = True + + while(next): # 큐가 비어있지 않는 경우 (= 인접한 노드가 있을 경우) + cur = next.popleft() # 현재 보고 있는 노드 + print(cur, end=" ") # 방문순서에 적음 + for i in graph[cur]: + if not visited[i]: # 방문 했는지 검사 + visited[i] = True # 방문했다고 기록 + next.append(i) # 기록과 동시에 큐에 집어넣기 + + +BFS(graph, visited, V) \ No newline at end of file diff --git a/week2/group3/1697_everglow02.py b/week2/group3/1697_everglow02.py new file mode 100644 index 0000000..2ac5d50 --- /dev/null +++ b/week2/group3/1697_everglow02.py @@ -0,0 +1,24 @@ +import sys +from collections import deque +input = sys.stdin.readline + +N, K = map(int, input().split()) +MAX = 100001 +visited = [0] * MAX #[0 for i in range(MAX)] + +# BFS > DFS인 이유: +# 하나의 노드가 얼마나 깊이까지 가는지 모두 확인해서 최단시간 찾는 건 모든 경로 탐색이므로 비효율적 +# 동일 시간(깊이) 내에서 가장 먼저 도착하는 경우 <= 최적 시간 + +def bfs(p): + q = deque([p]) + while q: + p = q.popleft() + if p == K: + return visited[p] # 노드 깊이 = 해당 위치까지 걸린 시간 + for next in (p-1, p+1, 2*p): # 1초 후 이동 가능한 위치들 + if 0 <= next < MAX and not visited[next]: # 다음 위치가 범위 내고 방문 전이면 + visited[next] = visited[p] + 1 # 1초 추가 + q.append(next) + +print(bfs(N)) \ No newline at end of file diff --git a/week2/group3/2573_everglow02.py b/week2/group3/2573_everglow02.py new file mode 100644 index 0000000..f48fcb8 --- /dev/null +++ b/week2/group3/2573_everglow02.py @@ -0,0 +1,73 @@ +import sys +import copy +from collections import deque +input = sys.stdin.readline + +year = 0 +chunk = 0 +iceMap = [] + +N, M = map(int,input().split()) +for i in range(N): + iceMap.append(list(map(int,input().split()))) + +zeroMatrix = [[0 for col in range(M)] for row in range(N)] +oceanMap = copy.deepcopy(zeroMatrix) + +def checkSurround(): + for i in range(1,N-1): # N-1 X M-1 칸 다 검사 + for j in range(1,M-1): + if (iceMap[i][j+1] == 0): # 동 + oceanMap[i][j] += 1 + if (iceMap[i][j-1] == 0): # 서 + oceanMap[i][j] += 1 + if (iceMap[i-1][j] == 0): # 남 + oceanMap[i][j] += 1 + if (iceMap[i+1][j] == 0): # 북 + oceanMap[i][j] += 1 + +dx,dy = [-1,1,0,0], [0,0,-1,1] +def bfs_countChunk(i,j): # 덩어리가 몇 개인지 확인하기 + q = deque() + global chunk + q.append((i,j)) + chunk += 1 + while q: + x,y = q.popleft() + for t in range(4): + nx = x + dx[t] + ny = y + dy[t] + if nx<0 or ny<0 or nx>=N or ny>=M: + continue + if iceMap[nx][ny]!=0 and visited[nx][ny]==0: #주변이 chunk이고 방문하지 않았으면 + q.append((nx,ny)) + visited[nx][ny] = chunk # 덩어리 개수 체크 + +def melt(): + for i in range(1,N-1): # N-1 X M-1 칸 다 검사 + for j in range(1,M-1): + if (iceMap[i][j] - oceanMap[i][j]>=0): + iceMap[i][j] -= oceanMap[i][j] + else: + iceMap[i][j] = 0 + + +while (chunk < 2): + checkSurround() + melt() + year += 1 + chunk = 0 + + visited = copy.deepcopy(zeroMatrix) + for i in range(N): # N-1 X M-1 칸 다 검사 + for j in range(M): + if visited[i][j]==0 and iceMap[i][j]>0: #방문한 적 없는 얼음있는 곳 + bfs_countChunk(i,j) + + oceanMap = copy.deepcopy(zeroMatrix) #init ocean count + + if (iceMap == oceanMap and chunk < 2): + print(0) + sys.exit() + +print(year) \ No newline at end of file diff --git a/week2/group3/2644_everglow02.py b/week2/group3/2644_everglow02.py new file mode 100644 index 0000000..bd813e6 --- /dev/null +++ b/week2/group3/2644_everglow02.py @@ -0,0 +1,37 @@ +n = int(input()) +dad, son = map(int, input().split()) +m = int(input()) + +family = [[] for _ in range(n+1)] +visited = [False for _ in range(n+1)] + +for _ in range(m): + parent, child = map(int, input().split()) + family[parent].append(child) + family[child].append(parent) + +for i in range(len(family)-1): + family[i].sort() +print(family) + +count = 0 +found = False + +def dfs(person, son): + global count + global found + if visited[person]: + return + visited[person] = True # if not visited[person]: + count += 1 + for human in family[person]: + if human == son: + print('count', count) + found = True + exit() + else: + dfs(human,son) + +dfs(dad,son) +if not found: + print(-1) \ No newline at end of file diff --git a/week2/group3/2667_everglow02.py b/week2/group3/2667_everglow02.py new file mode 100644 index 0000000..bc212d1 --- /dev/null +++ b/week2/group3/2667_everglow02.py @@ -0,0 +1,52 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +town = [list(map(int, input().strip())) for _ in range(N)] + +#for i in range(N): +# print(town[i]) + +dx = [0,0,1,-1] +dy = [1,-1,0,0] + +def DFS(x,y): + global count + if x<0 or x>=N or y<0 or y>=N: # index of error 방지 + return #False + + if town[x][y] == 1: # 집인지 검사 + count += 1 # 집이면 수 세기 + town[x][y] = 0 + for i in range(4): + nx = x + dx[i] + ny = y + dy[i] + DFS(nx,ny) + return True + return False + +""" +for hp in houses: + x = hp[0] + y = hp[1] + for dx,dy in key: + if (town[x+dx][y+dy] == 1): + adj.append([dx,dy]) +""" + +count = 0 +cmplxNum = 0 # 단지 수 +houseCnt = [] # 단지 내 집 수 리스트 + +# 그래프의 원소가 1일 때만 DFS로 집 방문 +for i in range(N): + for j in range(N): + if DFS(i,j) == True: + houseCnt.append(count) + cmplxNum += 1 + count = 0 + +houseCnt.sort() # 오름차순 정렬 +print(cmplxNum) # 총 단지 수 출력 +for i in range(len(houseCnt)): + print(houseCnt[i]) # 단지 내 집 수 출력 diff --git a/week3/group3/11726_everglow02.py b/week3/group3/11726_everglow02.py new file mode 100644 index 0000000..39d0fc2 --- /dev/null +++ b/week3/group3/11726_everglow02.py @@ -0,0 +1,17 @@ +import sys +input = sys.stdin.readline + +n = int(input()) +dp = [0*i for i in range(1001)] + +dp[0] = 1 +dp[1] = 1 + +def solve(i): # dp[i]값 보여주는 함수 + if i == 0 or i == 1: + return dp[i] + for m in range(2,1001): + dp[m] = dp[m-2] + dp[m-1] + return dp[i] + +print(solve(n)%10007) \ No newline at end of file diff --git a/week3/group3/12865_everglow02.py b/week3/group3/12865_everglow02.py new file mode 100644 index 0000000..5867593 --- /dev/null +++ b/week3/group3/12865_everglow02.py @@ -0,0 +1,17 @@ +import sys +input = sys.stdin.readline + +N, K = map(int, input().split()) +dp = [0]*(K+1) +bag = [] + +for _ in range(N): + W, V = map(int, input().split()) + bag.append((W,V)) + +for thing in bag: + W, V = thing + for i in range(K,W-1,-1): + dp[i] = max(dp[i], dp[i-W]+V) + +print(dp[-1]) diff --git a/week3/group3/19622_everglow02.py b/week3/group3/19622_everglow02.py new file mode 100644 index 0000000..5d6c97b --- /dev/null +++ b/week3/group3/19622_everglow02.py @@ -0,0 +1,29 @@ +import sys +input = sys.stdin.readline + +meeting = [[0,0,0]] # 더미 +N = int(input()) +for _ in range(N): + meeting.append(list(map(int, input().split()))) + +DP = dp = [0*i for i in range(N+1)] # DP[i] = i번째 회의까지 회의 인원의 최대 합 +DP[1] = meeting[1][2] + +for i in range(2,N+1): + DP[i] = max(DP[i-1], meeting[i][2]+DP[i-2]) + +print(DP[N]) + +# 예시 +""" +DP[1] = meeting[1][2] +DP[2] = max(DP[1], meeting[2][2]) +DP[3] = max(DP[2], meeting[3][2]+DP[1]) # meeting[3][2] + meeting[1][2] +DP[4] = max(DP[3], meeting[4][2]+DP[2]) +DP[5] = max(DP[4], meeting[5][2]+DP[3]) +DP[6] = max(DP[5], meeting[6][2]+DP[4]) +""" +# => DP[i] = max(DP[i-1], meeting[i][2]+DP[i-2]) +# DP는 점화식... 머리에 새겨두자 흑흑 + +# k번째 회의 다음 회의는 k+2번째 회의부터 고를 수 있음 \ No newline at end of file diff --git a/week3/group3/23257_everglow02.py b/week3/group3/23257_everglow02.py new file mode 100644 index 0000000..5b74091 --- /dev/null +++ b/week3/group3/23257_everglow02.py @@ -0,0 +1,22 @@ +n,m = map(int,input().split()) +arr = list(map(int,input().split())) +this_month = [] + +# this_month 배열에 입력받은 값을 절댓값을 취해 넣어준다. +for item in arr: + this_month.append(abs(item)) + +# month라는 이름의 Set을 만든다. +# 이때 month는 1개월차의 결과(중복을 허용해 1개를 고른 경우)를 의미한다. +month = set(this_month) + +# bitwise XOR 연산을 M-1번 반복한다. +# K개월의 연산 결과 = K-1개월의 연산 결과에 이번 달 연산한 값 +# this_month = 연산하는 테이블의 0행이자 N개의 월봉 배열 +# month = 연산하는 테이블의 0열이자 N개의 월봉 중 M개 골라 bitwise XOR 연산한 값들 +for _ in range(m-1): + month = set(i^j for i in this_month for j in month) + + +# 출력 +print(max(month)) \ No newline at end of file diff --git a/week4/group3/10816_everglow02.py b/week4/group3/10816_everglow02.py new file mode 100644 index 0000000..0767f9f --- /dev/null +++ b/week4/group3/10816_everglow02.py @@ -0,0 +1,54 @@ +import sys +input = sys.stdin.readline +from collections import Counter +N = int(input()) +cards = list(map(int, input().split())) +M = int(input()) +guess = list(map(int, input().split())) + +cards.sort() +print(cards) +count = [0] * len(guess) + +def search(targetIdx, left, right): + #print('-------',guess[targetIdx],'-------') + # 가능한 모든 탐색을 마쳤을 때 + if left > right: + return + + mid = (left+right)//2 + #print(cards[left], cards[mid], cards[right]) + + # 찾았을 때 + if cards[mid] == guess[targetIdx]: + p = mid + # 중복되는 숫자의 맨 앞으로 감 + while (p>=left and cards[p]==cards[mid]): # 7 10 10 + #print(p) + if (p-1>=left and cards[p-1]==cards[mid]): + p-=1 + else: + break + # 중복된 숫자의 맨 뒤로 감 + while (p<=right and cards[p]==cards[mid]): + #print(p,cards[p]) + count[targetIdx]+=1 + p+=1 + + #print(count) + return + # 못 찾았을 때 + elif cards[mid]>guess[targetIdx]: + right = mid-1 + return search(targetIdx, left, right) + else: + left = mid+1 + return search(targetIdx, left, right) + +for t in range(len(guess)): + search(t, 0, len(cards)-1) + +[print(c, end=" ") for c in count] + +#for c in count: +# print(c,end=' ') \ No newline at end of file diff --git a/week6/group3/excape maze.py b/week6/group3/excape maze.py new file mode 100644 index 0000000..e69de29 diff --git a/week6/group3/greedy01_traveler guild.py b/week6/group3/greedy01_traveler guild.py new file mode 100644 index 0000000..d409c45 --- /dev/null +++ b/week6/group3/greedy01_traveler guild.py @@ -0,0 +1,43 @@ +import sys +input = sys.stdin.readline + +# 십만 1 1 1 그룹 수 다 보내야하는 걸로 착각 +N = int(input()) +guild = list(map(int,input().split())) + +# 그룹의 인원 수 = 해당 그룹원 중 가장 높은 공포도 +# 가장 공포도가 높은 사람 순서대로 +# 그룹의 최댓값을 구하려면 그룹이 잘게 쪼게져야한다는 뜻 +# 가장 큰 애의 수만큼 안에 포함되어있어야 +guild.sort(reverse=True) # 2 2 2 2 1 +cnt = 0 + +while len(guild) != 0: + # 빨리 끝낼 수 있는 조건 + if guild[0] == len(guild): + cnt += 1 + guild.clear() # 반복문 탈출 + # 기본 로직 + elif guild[0] <= len(guild): # if면 바로 윗줄에서 반복문 탈출 못함 + for i in range(guild[0]-1): # 최댓값만큼 가장 작은 애부터 조원 뽑기 + guild.pop() + guild.remove(guild[0]) # 대장도 삭제 + cnt += 1 +print(cnt) + +#### 아래부터 순차적으로 +N = int(input()) +guild = list(map(int, input().split())) + +guild.sort() + +cnt = 0 # 그룹의 수 +group_size = 0 # 현재 그룹에 포함된 모험가의 수 + +for fear in guild: + group_size += 1 # 현재 그룹에 모험가 추가 + if group_size >= fear: + cnt += 1 # 그룹 결성 + group_size = 0 # 새로운 그룹 시작 + +print(cnt) diff --git a/week6/group3/greedy02_multiply or add.py b/week6/group3/greedy02_multiply or add.py new file mode 100644 index 0000000..591cdab --- /dev/null +++ b/week6/group3/greedy02_multiply or add.py @@ -0,0 +1,16 @@ +import sys +input = sys.stdin.readline + +s = list(input()) +s.pop() # 개행문자 날리기 ('/n') +s.sort(reverse=True) + +result = 0 + +for i in s: + if result == 0 or int(i) <= 1: # 수정 int(i) == 0 + result += int(i) + else: + result *= int(i) + +print(result) diff --git a/week6/group3/greedy03_swap string.py b/week6/group3/greedy03_swap string.py new file mode 100644 index 0000000..182c9b2 --- /dev/null +++ b/week6/group3/greedy03_swap string.py @@ -0,0 +1,31 @@ +import sys +import copy +input = sys.stdin.readline + +S = list(input()) +S.pop() # 개행문자 날리기 +S = [int(i) for i in S] + +# <<수정 -> 기준: 연속된 구간이 더 적은 거>> +# [기존] +# 0이 많은지 1이 많은지 확인 +# 많은 쪽으로 맞추기 (기준 정하기) +# 기준이 아닌 숫자로 시작하는 연속되는 문자열 뒤집기 +# 기준이 아닌 숫자가 남아있는지 확인 +# 남아있지않을 때까지 뒤집기 반복 + +#crit = 1 if S.count(1) == min(S.count(1), S.count(0)) else 0 # 바꿀 숫자 +#cnt=0 + +def count(crit): + cnt=0 + s = copy.deepcopy(S) + while s.count(crit) != 0: + p = s.index(crit) + while p < len(s) and s[p] == crit: # 연속된 문자열 뒤집기 + s[p] = int(not crit) # 뒤집기 + p += 1 # 옆으로 이동 + cnt += 1 + return cnt + +print(min(count(0),count(1))) \ No newline at end of file diff --git a/week6/group3/greedy05_choose ball.py b/week6/group3/greedy05_choose ball.py new file mode 100644 index 0000000..1dc042f --- /dev/null +++ b/week6/group3/greedy05_choose ball.py @@ -0,0 +1,36 @@ +import sys +input = sys.stdin.readline + +n, m = map(int, input().split()) +balls = list(map(int, input().split())) + +cnt=0 +for me in range(n): + for other in range(me,n): + if balls[other] == balls[me]: + continue + else : + cnt+=1 + #print(me,other) +print(cnt) + +### +import sys +input = sys.stdin.readline + +# 입력 받기 +n, m = map(int, input().split()) +balls = list(map(int, input().split())) + +# 무게별 볼링공 개수 카운트 +weight_count = [0] * (m + 1) +for weight in balls: + weight_count[weight] += 1 + +# 가능한 모든 쌍의 수 계산 +result = 0 +for i in range(1, m + 1): + n -= weight_count[i] # i 무게의 볼링공을 제외한 나머지 볼링공의 개수 + result += weight_count[i] * n # i 무게의 볼링공과 나머지 볼링공의 쌍의 수 + +print(result) diff --git a/week6/group3/greedy06_Muzi.py b/week6/group3/greedy06_Muzi.py new file mode 100644 index 0000000..21d2308 --- /dev/null +++ b/week6/group3/greedy06_Muzi.py @@ -0,0 +1,27 @@ +def solution(food_times, k): + t, p, answer = 0, 0, 0 + #food = {i:food_times[i] for i in range(len(food_times))} + + while t < k: # 중단 시간 전 동안 이루어지는 과정 + # 일단 먹는다 + food_times[p]-=1 + t+=1 + while True: # 이동한 지점이 0이 아닐 때까지 이동하는 루프 + # 1. 일단 이동한다 + if p != len(food_times)-1: + p+=1 + else: + p=0 + # 2. 이동 지점에 음식이 존재하는지 확인한다 + if food_times[p]>0: + answer = p+1 # 다음 이동 지점인 p를 answer에 대입 + print(answer) + # 멈추기 (이동 반복문 탈출) + break + else: + continue# 더 이동한다 + return answer +#print(solution([3,1,2],5)) +print(solution([3, 1, 1, 2], 6)) + + diff --git a/week6/group3/greedy_big number.py b/week6/group3/greedy_big number.py new file mode 100644 index 0000000..761fe71 --- /dev/null +++ b/week6/group3/greedy_big number.py @@ -0,0 +1,30 @@ +import sys +import copy +input = sys.stdin.readline + +N, cnt, maxCnt= map(int,input().split()) +arr = list(map(int,input().split())) # [map()이랑 다른 이유는 뭘까] + +arr2 = copy.deepcopy(arr) +arr2.sort() +arr2.pop() + +i=0 +sum=0 + +while i != cnt: + # 최대값이 같은 게 2개 있으면 그걸로만 다 더해도 됨 + if max(arr) == max(arr2): + sum = max(arr)*cnt # 최댓값으로만 다 더한 결과 + i = cnt # 반복문 탈출 + else: # 최대값이 같은 게 있지 않을 경우 최대값을 일단 최대한 쓰고 + if i%(maxCnt+1) == 0: #0->3 4->7 + for _ in range(maxCnt): + sum += max(arr) + i += 1 + # 두번 째로 큰 값을 한 번 쓴 후 다시 최댓값 최대한 쓰기 + else: #3->4 7->8 + sum += max(arr2) + i += 1 + +print(sum) \ No newline at end of file diff --git a/week6/group3/greedy_number card.py b/week6/group3/greedy_number card.py new file mode 100644 index 0000000..1e744e9 --- /dev/null +++ b/week6/group3/greedy_number card.py @@ -0,0 +1,14 @@ +import sys +input = sys.stdin.readline + +N, M = map(int, input().split()) +matrix = [] +for _ in range(N): + matrix.append(map(int, input().split())) + # 데이터 받을 때 미리 최솟값 비교 가능 +mins = [] +for i in range(N): + mins.append(min(matrix[i])) + +max(mins) + diff --git a/week6/group3/greedy_until One.py b/week6/group3/greedy_until One.py new file mode 100644 index 0000000..8d328d8 --- /dev/null +++ b/week6/group3/greedy_until One.py @@ -0,0 +1,14 @@ +import sys +input = sys.stdin.readline + +N, K = map(int, input().split()) +cnt=0 +while N != 1: + if N%K == 0: + N /= K + cnt+=1 + else: + N -= 1 + cnt+=1 +# 또는 처음부터 나눠야할 횟수만 기억하고 실제로 연산하진 않기 +print(cnt) \ No newline at end of file diff --git "a/week7/group3/15 \355\212\271\354\240\225 \352\261\260\353\246\254\354\235\230 \353\217\204\354\213\234 \354\260\276\352\270\260.py" "b/week7/group3/15 \355\212\271\354\240\225 \352\261\260\353\246\254\354\235\230 \353\217\204\354\213\234 \354\260\276\352\270\260.py" new file mode 100644 index 0000000..4ad790b --- /dev/null +++ "b/week7/group3/15 \355\212\271\354\240\225 \352\261\260\353\246\254\354\235\230 \353\217\204\354\213\234 \354\260\276\352\270\260.py" @@ -0,0 +1,60 @@ +import sys +from collections import deque + +# N,M,K,X = 4,4,1,1 # 도시 수, 도로 수, 목표 최단거리, 출발점 +# adj = [[], [2,3],[3,4],[1,2],[2]] + +input = sys.stdin.readline +q = deque() + +N,M,K,X = map(int,input().split()) +adj = [[] for _ in range(N+1)] +for _ in range(M): + A, B = map(int,input().split()) + adj[A].append(B) + adj[B].append(A) + +def bfs(start): + visited = [False] * (N+1) + result = [] + tmp = [] + # 초기화 + dist = 0 + q.append([start,dist]) + visited[start] = True + + while q: + V = q[0][0] # 확인하고자 하는 정점의 번호 + + if dist == K: # 탈출 조건: 최단거리가 K인 걸 발견해야할 때 + for city in q: # 큐에 있는 도시 중 최단거리가 K인 걸 모두 결과 리스트에 추가 + if city[1] == K: + result.append(city[0]) + + if result == []: # 큐가 비었거나 최단거리가 K인 도시가 존재하지 않을 경우 + print(-1) + break + + result.sort() # 오름차순 정렬 + for v in result: # 출력 + print(v) + break + + # 최단거리 계산 + for v in adj[V]: + tmp.append(visited[v]) + if tmp != [True]*(len(adj[V])): # 정점 v의 인접 도시들이 전부 방문하지 않았을 때만 거리+1 + dist+=1 + tmp.clear() # 초기화 + + # 방문 안 한 도시들 큐에 최단거리와 함께 집어넣고 방문 처리 + for v in adj[V]: + if not visited[v]: + q.append([v,dist]) + visited[v] = True + q.popleft() + + if q == deque(): # 큐가 비면 탈출 + print(-1) + break +bfs(X) \ No newline at end of file diff --git "a/week7/group3/18 \352\264\204\355\230\270 \353\263\200\355\231\230.py" "b/week7/group3/18 \352\264\204\355\230\270 \353\263\200\355\231\230.py" new file mode 100644 index 0000000..de3a83e --- /dev/null +++ "b/week7/group3/18 \352\264\204\355\230\270 \353\263\200\355\231\230.py" @@ -0,0 +1,42 @@ +def solution(p): + def dfs(x,s,cntL,cntR): # [2단계] "균형잡힌 괄호 문자열" u의 인덱스 추출 + checked[x] = True + if s[x] == '(': + cntL+=1 + if s[x] == ')': + cntR+=1 + + if (cntL or cntR) != 0 and cntL == cntR: + return x #return u[0:x+1] + + for i in range(x,len(s)): + if not checked[i]: + return dfs(i,s,cntL,cntR) + # solution 기능 1: bfs로 문자열에서 u,v 분리 + if p == '': + return p + checked = [False] * len(p) + # u, v 분리 + x = dfs(0,p,0,0) + u = p[0:x+1] + v = p[x+1:] + + # solution 기능 2: u가 "올바른 괄호 문자열"인지 아닌지에 따라 문자열 처리 + if u == "올바른 괄호 문자열" : + # v(나머지)에 대해 수행해서 u,v 분리 + return u + solution(v) + # x = dfs(0,v,0,0) + # u = v[0:x+1] + # v = v[x+1:] + else: + # 다시 재귀적으로 수행한 문자열 v + u로 만든 새 문자열 반환 + # x = dfs(0,v,0,0) + # v = v[0:x+1] + u_ = u[1:-1] + table = u_.maketrans('()', ')(') #new_u = u.replace('(',')').replace(')','(') + new_u = u_.translate(table) + return '('+solution(v)+')'+new_u + +# (()())() +# )( +# ()))((() diff --git "a/week7/group3/21 \354\235\270\352\265\254\354\235\264\353\217\231.py" "b/week7/group3/21 \354\235\270\352\265\254\354\235\264\353\217\231.py" new file mode 100644 index 0000000..20e7e18 --- /dev/null +++ "b/week7/group3/21 \354\235\270\352\265\254\354\235\264\353\217\231.py" @@ -0,0 +1,67 @@ +import sys +from collections import deque +input = sys.stdin.readline + +N, L, R = map(int, input().split()) +countries = [] +for _ in range(N): + countries.append(list(map(int, input().split()))) + +dx = [0,0,1,-1] +dy = [1,-1,0,0] + +# 문제) 내가 탐색했을 땐 조건에 안 맞더라도 쟤가 탐색할 땐 조건에 맞을 수 있음 +def BFS(sx,sy): + next = deque([(sx,sy)]) + visited = [[False]*N for _ in range(N)] + allied = [[False]*N for _ in range(N)] + visited[sx][sy] = True + friend = [] # 첫 시작점이 연합 불가한 점일 수 있으므로 비어두기 + + while(next): # 큐가 비어있지 않는 경우 (= 인접한 노드가 있을 경우) + x,y = next.popleft() # 현재 보고 있는 노드 + + for i in range(4): + nx = x + dx[i] + ny = y + dy[i] + if nx<0 or nx>=N or ny<0 or ny>=N: # index of error 방지 + continue + if not visited[nx][ny]: + visited[nx][ny] = True + next.append((nx,ny)) + if not allied[nx][ny]: # 연합 안 했다면 연합 가능한지 검토 + if (abs(countries[x][y] - countries[nx][ny]))>=L and abs(countries[x][y] - countries[nx][ny])<=R: + allied[nx][ny] = True + if not allied[x][y]: + allied[x][y] = True + friend.append((x,y)) + friend.append((nx,ny)) # 연합에 추가 + + return friend + +day=0 +while(True): + friends = BFS(0,0) + #print(day,friends) + + if len(friends) == 0: # 혼자면 + print(day) + break + + day+=1 + sum=0 + for f in friends: + sum+=countries[f[0]][f[1]] + result = sum//len(friends) + for f in friends: + countries[f[0]][f[1]]=result + + # for i in range(N): + # print(countries[i]) + + +# 1. 국가 행렬을 순차적으로 돌면서 상하좌우 탐색 (인덱스 범위 넘어나지 않게 조심) +# 1.0 방문 시 기록, 방문 안 했으면 패스 v +# 1.1 탐색 시 연합 가능한지(인구 차이가 L명 이상 R명 이하인지) 확인 +# 1.2 연합 가능하면 연합 리스트에 추가 +# 1.2.1 연합 불가능한 지점을 만나면 멈추고 인구 이동 횟수 추가?? diff --git "a/week7/group3/[\352\267\270\353\246\254\353\224\224 \353\217\204\354\240\204] 1946 \354\213\240\354\236\205\354\202\254\354\233\220.py" "b/week7/group3/[\352\267\270\353\246\254\353\224\224 \353\217\204\354\240\204] 1946 \354\213\240\354\236\205\354\202\254\354\233\220.py" new file mode 100644 index 0000000..4c95bf0 --- /dev/null +++ "b/week7/group3/[\352\267\270\353\246\254\353\224\224 \353\217\204\354\240\204] 1946 \354\213\240\354\236\205\354\202\254\354\233\220.py" @@ -0,0 +1,29 @@ +import sys +input = sys.stdin.readline + +T = int(input()) # 테스트 케이스 개수 +grade = [[] for _ in range(T)] + +N = [] +for i in range(T): + N.append(int(input())) # 지원자 숫자 + for _ in range(N[i]): + grade[i].append(list(map(int,input().split()))) + + +for i in range(T): + paper = sorted(grade[i]) + interview= sorted(grade[i],key=lambda x:x[1]) + + next = interview + winner = [] + + for j in range(N[i]): + std = paper[j] + if next.count(std)>0: + winner.append(std) + next = interview[0:interview.index(std)+1] + print(next, winner) + + print(len(winner)) + diff --git "a/week7/group3/[\354\213\244\354\240\204] \353\257\270\353\241\234 \355\203\210\354\266\234.py" "b/week7/group3/[\354\213\244\354\240\204] \353\257\270\353\241\234 \355\203\210\354\266\234.py" new file mode 100644 index 0000000..3d63c27 --- /dev/null +++ "b/week7/group3/[\354\213\244\354\240\204] \353\257\270\353\241\234 \355\203\210\354\266\234.py" @@ -0,0 +1,68 @@ +#import sys +#input = sys.stdin.readline +from collections import deque + +# maze = [ +# [1,0,1,0,1,0], +# [1,1,1,1,1,1], +# [0,0,0,0,0,1], +# [1,1,1,1,1,1], +# [1,1,1,1,1,1] +# ] +# N,M = 5,6 +N, M = map(int,input().split()) +maze = [] +for i in range(N): + maze.append(list(map(int,input()))) + +visited = [[False] * M for _ in range(N)] +# 방향키 +dx = [0,1,0,-1] +dy = [-1,0,1,0] + +start = [0,0,0] # 시작 좌표, 거리 +exit = [N-1,M-1] # 출구 좌표 + +def bfs(start): + # 1. 현재 처리 중인 노드 확인 + # 2. 해당 노드와 인접한 노드들 큐에 집어넣고 방문 표시 + # 3. 가장 아래에 깔린 노드 탈출 + # 큐에서 다음 노드 처리 반복 + q = deque() + # 초기화 + q.append(start) + visited[0][0] = True + depth = 0 + + while q: + # [처리 과정] + # 1단계 + x,y = q[0][0],q[0][1] # 현재 처리 중인 노드 위치 + depth=q[0][2]+1 # 주시 중인 노드와 인접한 노드들은 해당 노드의 거리+1이므로 미리 초기화 + + if [x,y] == exit: + print(depth) + break + #maze[x][y]=q[0][2] # 결과 그래프 출력용 + #print('watching:',x,y) + + # 2단계 + for i in range(4): #주변부 탐색 + nx = x+dx[i] + ny = y+dy[i] + if nx<0 or nx>=N or ny<0 or ny>=M: # 범위 제한 + continue + if visited[nx][ny]: # 방문 했던 곳이면 스킵 + continue + if maze[nx][ny] != 0: # 괴물이 없으면 + visited[nx][ny] = True + q.append([nx,ny,depth]) # 그 주변 길을 계속 탐색할 가치가 있으므로 큐에 집어넣기 + #print(nx,ny,q) # 탐색할 때마다 큐 상황 확인 용 + # 3단계 + #print() + q.popleft() + +bfs(start) + +# for i in range(N): +# print(maze[i]) \ No newline at end of file diff --git "a/week7/group3/[\354\213\244\354\240\204] \354\235\214\353\243\214\354\210\230 \354\226\274\353\240\244\353\250\271\352\270\260.py" "b/week7/group3/[\354\213\244\354\240\204] \354\235\214\353\243\214\354\210\230 \354\226\274\353\240\244\353\250\271\352\270\260.py" new file mode 100644 index 0000000..ed74d0b --- /dev/null +++ "b/week7/group3/[\354\213\244\354\240\204] \354\235\214\353\243\214\354\210\230 \354\226\274\353\240\244\353\250\271\352\270\260.py" @@ -0,0 +1,45 @@ +import sys +input = sys.stdin.readline + +N, M = map(int,input().split()) + +ice = [] +for i in range(N): + ice.append(list(input())) #list(map(int,input())) # sys.stdin.readline으로 안 했을 때 + ice[i].pop() # 개행 문자 날리기 안 그러면 ['1','0','1','1','\n'] 이런 식 + +visited = [[False]*M for _ in range(N)] # 2차원 방문 배열 + +dx = [0,1,0,-1] +dy = [-1,0,1,0] + +# 연결된 0인 노드만 방문하는 함수 dfs +def dfs(x, y): + global cnt0 + # 구멍 뚫린 부분(0인 부분)만 방문 + if ice[x][y] == '1': + return + visited[x][y] = True + #print('here',x,y, visited[x][y]) + cnt0+=1 # 방문한 0개수(서로 연결된 부분만) 더하기 + # 주변부 탐색 + for i in range(len(dx)): + nx = x+dx[i] + ny = y+dy[i] + if nx<0 or nx>=N or ny<0 or ny>=M: #탐색 범위 제한 + continue + if not visited[nx][ny]: #방문 안한 곳만 탐색 + dfs(nx,ny) + +icecream = 0 +# ahems +for i in range(N): + for j in range(M): + if not visited[i][j]: + cnt0=0 #초기화 + dfs(i,j) + + if cnt0>0: #dfs로는 연결된 0만 탐색하므로 dfs내에서 센 0개수가 하나 이상 존재하면 덩어리가 존재한단 뜻 + icecream+=1 + +print(icecream) diff --git "a/week8/group3/07 \353\237\255\355\202\244 \354\212\244\355\212\270\353\240\210\354\235\264\355\212\270.py" "b/week8/group3/07 \353\237\255\355\202\244 \354\212\244\355\212\270\353\240\210\354\235\264\355\212\270.py" new file mode 100644 index 0000000..363a891 --- /dev/null +++ "b/week8/group3/07 \353\237\255\355\202\244 \354\212\244\355\212\270\353\240\210\354\235\264\355\212\270.py" @@ -0,0 +1,14 @@ +N = input() +length = len(N) + +sum1,sum2 = 0,0 +for i in range(length): + if i < length/2: + sum1 += int(N[i]) + else: + sum2 += int(N[i]) + +if sum1 == sum2: + print('LUCKY') +else: + print('READY') \ No newline at end of file diff --git "a/week8/group3/08 \353\254\270\354\236\220\354\227\264 \354\236\254\354\240\225\353\240\254.py" "b/week8/group3/08 \353\254\270\354\236\220\354\227\264 \354\236\254\354\240\225\353\240\254.py" new file mode 100644 index 0000000..4a56c46 --- /dev/null +++ "b/week8/group3/08 \353\254\270\354\236\220\354\227\264 \354\236\254\354\240\225\353\240\254.py" @@ -0,0 +1,16 @@ +# 0~9: 48~57 +# 'A': 65 +S = list(input()) + +sum=0 +for i in range(len(S)): + S[i]=ord(S[i]) # 아스키코드로 변환 + if S[i]<65: + sum+=int(chr(S[i])) # 변환되었던 숫자 문자를 정수형으로 변환 + +S.sort() + +for i in range(len(S)): + if S[i]>=65: + print(chr(S[i]),end='') # 알파벳만 숫자(아스키코드)에서 다시 본래 문자로 변환 +print(sum,end='') \ No newline at end of file diff --git "a/week8/group3/09 \353\254\270\354\236\220\354\227\264 \354\225\225\354\266\225.py" "b/week8/group3/09 \353\254\270\354\236\220\354\227\264 \354\225\225\354\266\225.py" new file mode 100644 index 0000000..c65ec55 --- /dev/null +++ "b/week8/group3/09 \353\254\270\354\236\220\354\227\264 \354\225\225\354\266\225.py" @@ -0,0 +1,95 @@ +""" +1. 연속되는지 검사 +1.1 연속된다 => 카운트,인덱스 1씩 올리기 +1.2 연속x=>글자 수 계산 및 초기화 +2. (연속과 상관없이) 문자열 맨 끝에 도달 시 +최종 글자수 계산 +#문제: 계산은 초기화 전에 해야함 +# 계산 시점 +1. 연속되지 않으면서 cnt>1 +2. 맨 끝 인덱스일 때 +=> 연속ㅇ 맨끝 ㅇ /연속x +""" + +#s='aabbaccc' +#s='ababcdcdababcdcd' +#s='abcabcdede' +s='abcabcabcabcdededededede' +#s='xababcdcdababcdcd' +#57.1점 +def solution(s): + # 완전 탐색으로 단위 1부터 1000까지 가능 + length = len(s) + result = [length]*(length//2) # 단위별 결과 담는 리스트 + + for unit in range(1,length//2+1): # 단위가 절반 이후는 의미가 없음 (같은 패턴이 2개 이상 나올 수 없어서) + # 초기화 + prior = s[0:0+unit] # 현재 문자와 비교할 이전 문자열 + cnt=1 # 특정 패턴 수 + i=unit # 위치(인덱스)를 나타내는 변수 + #print('unit:',unit) + while i3ab (6->3) + #print('끝',cnt) + i+=unit + continue + if cnt > 1: # cnt=1은 문자열 변화 없음 + result[unit-1] -= cnt*unit-(1+unit) + #print(cnt) + prior = s[i:i+unit] # 새 패턴 생성 + cnt=0 + + #print(result) + return min(result) + +print(solution(s)) + + + +# 문제: 인덱스 0일 때 자기자신 당연히 됨 그래서 안 되면 [1]부터 다시 진행해야하는데 i+unit으로 뜀 +# 단위가 2이상일 때 시작하고 바로 연속하지 않으면 인덱스 1부터 시작해야하는데 그다음 단위로 루프를 시작함 +""" +def solution(s): + # 완전 탐색으로 단위 1부터 1000까지 가능 + unit = 0 # 단위 + length = len(s) + result = [length]*(length//2) # 단위별 결과 담는 리스트 + for u in range(length//2): # 단위가 절반 이후는 의미가 없음 (같은 패턴이 2개 이상 나올 수 없어서) + unit += 1 + # 초기화 + prior = s[0:0+unit] # 현재 문자와 비교할 이전 문자열 + cnt=1 # 특정 패턴 수 + i=unit # 위치(인덱스)를 나타내는 변수 + print('unit',unit,s) + while i3ab (6->3) + print(cnt) + i+=unit + continue + # 연속 X + if cnt > 1: # cnt=1은 문자열 변화 없음 + print(cnt) + result[u] -= cnt*unit-(1+unit) + print(u+1,':',result[u]) + # init + cnt=0 + if i==unit: + prior = s[1:1+unit] + i=1 + prior = s[i:i+unit] # 새 패턴 생성 + + + answer = min(result) + print(result) + return answer +""" \ No newline at end of file diff --git "a/week8/group3/12 \352\270\260\353\221\245\352\263\274 \353\263\264 \354\204\244\354\271\230.py" "b/week8/group3/12 \352\270\260\353\221\245\352\263\274 \353\263\264 \354\204\244\354\271\230.py" new file mode 100644 index 0000000..87fe0e9 --- /dev/null +++ "b/week8/group3/12 \352\270\260\353\221\245\352\263\274 \353\263\264 \354\204\244\354\271\230.py" @@ -0,0 +1,90 @@ +def solution(n, build_frame): + pole = [[False]*(n+1) for _ in range(n+1)] # 정점은 n+1개 + bow = [[False]*(n+1) for _ in range(n+1)] + + def checkRule1(i,j): + # 1)바닥 혹은 다른 기둥 위에 있는지 확인 + if i == 0 or pole[i-1][j]: + return True + # 2)또는 어느 한쪽 보 위에 있는지 확인 + elif bow[i][j] or (i>0 and bow[i][j-1]): # 범위 추가 + return True + return False + def checkRule2(i,j): + if pole[i-1][j] or pole[i-1][j+1]: # 한쪽 끝에 기둥과 닿아있는지 + return True + elif i>0 and bow[i][j-1] and bow[i][j+1]: # 양쪽 끝에 보가 있는지 + return True + return False + + # 1. 공사 + for i in range(len(build_frame)): + y,x,a,b = build_frame[i] # 문제의 x,y는 열좌표, 행좌표를 나타냄. 따라서 바꿔서 넣어줌. + if a == 0: # 기둥 + # 생성할 경우 + if b == 1: + # 조건 만족할 경우 생성 + pole[x][y]=checkRule1(x,y) + # 삭제할 경우 + else: + cond1,cond2=False,False + # 1)위에 기둥이 없을 경우 + if not pole[x+1][y]: + cond1=True # 삭제 + # 2)위에 기둥이 있는데 해당 기둥의 양쪽에 보가 있을 경우 + elif pole[x+1][y] and checkRule1(x+1,y): + cond1=True + # 3)삭제할 기둥 위에 있는 보의 오른쪽 아래에 다른 기둥이 있거나 해당 보의 양쪽에 다른 보가 있을 경우 + # if not bow[x+1][y] or (bow[x+1][y] and checkRule2(x+1,y)): + # cond2=True + if not bow[x+1][y]: + cond2=True + else: + pole[x][y] = False # 임시로 삭제 + if not checkRule2(x+1,y): # 삭제했는데 안 괜찮으면 (삭제하면 안됨) + pole[x][y]=True # 원상복구 + else: + cond2=True + + if cond1 and cond2: + pole[x][y]=False + continue + # 보 + # 생성할 경우 + if b==1: + # 해당 점 아래에 기둥이 있거나 양 끝이 다른 보와 동시에 연결되어있는 경우 + bow[x][y]=checkRule2(x,y) + continue + # 삭제할 경우 + # 양쪽 보가 없으면 상관 없음 + if not bow[x][y-1] and not bow[x][y+1]: + bow[x][y]=False + # 양쪽 보 있으면 삭제할 경우 둘 다 잘 연결되어있는지 확인 + else: + bow[x][y]=False # 임시로 삭제 + if not(checkRule2(x,y-1) and checkRule2(x,y+1)): # 잘 연결되어있지 않으면 원상복귀 + bow[x][y]=True + + + # 2. 공사 결과 + answer = [] + for i in range(n+1): + for j in range(n+1): + if pole[i][j]: + answer.append([j,i,0]) + if bow[i][j]: + answer.append([j,i,1]) + answer.sort() + + return answer + +build_frame=[ + [1,0,0,1],[1,1,1,1],[2,1,0,1],[2,2,1,1], + [5,0,0,1],[5,1,0,1],[4,2,1,1],[3,2,1,1] +] +# build_frame=[ +# [0,0,0,1],[2,0,0,1],[4,0,0,1],[0,1,1,1], +# [1,1,1,1],[2,1,1,1],[3,1,1,1],[2,0,0,0], +# [1,1,1,0],[2,2,0,1] +# ] +print(solution(5,build_frame)) \ No newline at end of file diff --git "a/week8/group3/[\354\213\244\354\240\204] \352\262\214\354\236\204 \352\260\234\353\260\234.py" "b/week8/group3/[\354\213\244\354\240\204] \352\262\214\354\236\204 \352\260\234\353\260\234.py" new file mode 100644 index 0000000..4b8f3e5 --- /dev/null +++ "b/week8/group3/[\354\213\244\354\240\204] \352\262\214\354\236\204 \352\260\234\353\260\234.py" @@ -0,0 +1,72 @@ +# 게임 개발 + +# 1. 현재 방향 기준으로 왼쪽 방향 (반시계 방향으로 90도 회전한 방향)부터 차례때로 갈 곳 정한다 +# 2. 캐릭터의 바로 왼쪽 방향에 아직 가보지 않은 칸이 존재한다면, 왼쪽 방향으로 회전한 다음 +# 왼쪽으로 한 칸을 전진한다. 왼쪽 방향에 가보지 않은 칸이 없다면, 왼쪽 방향으로 회전만 수행하고 1단계로 돌아간다 +# 3. 만약 네 방향 다 가본 칸이거나 바다로 되어있는 칸인 경우, 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아간다. +# 단, 이때 뒤쪽 방향이 바다인 칸이라 뒤로 갈 수 없는 경우에는 움직임을 멈춘다 +# 캐릭터가 이동한 칸 수 출력 + +import sys +from collections import deque +input = sys.stdin.readline + +n,m = map(int,input().split()) +A,B,d = map(int,input().split()) #(A,B)는 항상 육지 +matrix = [] +for _ in range(n): + matrix.append(list(map(int,input().split()))) # 0: 육지, 1: 바다, 맵의 외곽은 항상 바다 + +dir = [(-1,0),(0,1),(1,0),(0,-1)] # 북,동,남,서 + +def rotate(curDir): + # if curDir == 0: #북 + # return 3 #서 + # return curDir-1 + return (curDir - 1) % 4 + +visited = [[False]*m for _ in range(n)] +visited[A][B] = True +def bfs(start): + q = deque([start]) + # 초기화 + cnt=1 # 시작 지점도 방문한 칸 수에 포함 + + while q: + x,y,cur= q.popleft() + #prevQ = q # 탐색 전 큐 상태 저장 + found_new_place = False + for _ in range(4): + newDir = rotate(cur) # 1. 임시 회전 + nx = dir[newDir][0]+x + ny = dir[newDir][1]+y + #2.1 안 가본 칸 있으면 왼쪽 방향으로 회전/전진 + if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and matrix[nx][ny]==0: # 범위 제한 추가 + q.append((nx,ny,newDir)) + visited[nx][ny] = True + cnt+=1 + found_new_place = True + break + # 2.2 (else) 회전만 수행 + cur = newDir #수정) rotate(newDir) + #if q == prevQ: # 3. 네 방향 다 돌았는데도 큐에 추가된 게 없으면 + if not found_new_place: + nx = x-dir[cur][0] # 방향 유지한 채 한 칸 뒤로 + ny = y-dir[cur][1] # 수정) x,y 추가 + if 0 <= nx < n and 0 <= ny < m and matrix[nx][ny] == 0: # 수정) 범위제한 추가 + #x=nx + #y=ny + q.append((nx, ny, cur)) + else: # 바다로 막힌 경우 + break + + print(cnt) + +bfs((A,B,d)) + +# 4 4 +# 1 1 0 +# 1 1 1 1 +# 1 0 0 1 +# 1 1 0 1 +# 1 1 1 1 \ No newline at end of file diff --git "a/week8/group3/[\354\213\244\354\240\204] \354\231\225\354\213\244\354\235\230 \353\202\230\354\235\264\355\212\270.py" "b/week8/group3/[\354\213\244\354\240\204] \354\231\225\354\213\244\354\235\230 \353\202\230\354\235\264\355\212\270.py" new file mode 100644 index 0000000..aece7c2 --- /dev/null +++ "b/week8/group3/[\354\213\244\354\240\204] \354\231\225\354\213\244\354\235\230 \353\202\230\354\235\264\355\212\270.py" @@ -0,0 +1,26 @@ +# 왕실의 나이트 +# 입력: 나이트의 현재 좌표 +# 출력: 이동 가능한 위치 경우의 수 +import sys +input = sys.stdin.readline + +pos = list(input()) +table = ['a','b','c','d','e','f','g','h'] + +x = int(pos[1]) # 2 +y = table.index(pos[0])+1 #c +# y = int(ord(pos[0])) - int(ord('a')) + 1 + +dx = [2,2,1,-1,-2,-2,1,-1] +dy = [1,-1,2,2,1,-1,-2,-2] +# step = [(2,1),(2,-1),(-2,1),(-2,-1)(1,2),(-1,2),(1,-2),(-1,-2)] +count=0 +for i in range(8): +# for step in steps: + nx = x+dx[i] + ny = y+dy[i] + #ny = x+step[1] + if nx<1 or ny<1 or nx>8 or ny>8: # 1,1 ~ 8,8 + continue + count += 1 +print(count) \ No newline at end of file diff --git "a/week8/group3/\354\230\210\354\240\234 4-1 \354\203\201\355\225\230\354\242\214\354\232\260.py" "b/week8/group3/\354\230\210\354\240\234 4-1 \354\203\201\355\225\230\354\242\214\354\232\260.py" new file mode 100644 index 0000000..580149f --- /dev/null +++ "b/week8/group3/\354\230\210\354\240\234 4-1 \354\203\201\355\225\230\354\242\214\354\232\260.py" @@ -0,0 +1,37 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +cmd = list(input().split()) + +def move(dir): + x, y = 0,0 + if dir == 'L': + y-=1 + elif dir == 'R': + y+=1 + elif dir == 'U': + x-=1 + elif dir == 'D': + x+=1 + return (x,y) + +posX,posY = 0,0 + +for i in range(len(cmd)): + col = move(cmd[i])[0] + row = move(cmd[i])[1] + if col<0 or row<0 or col>=N or row>=N: + continue + posX+=col + posY+=row + +print(posX+1,posY+1) + +# dx = [0,0,-1,1] +# dy = [-1,1,0,0] +# cmd = ['L','R','U','D'] + +# for plan == cmd[i]: +# nx = x+dx[i] +# ny = y+dy[i] \ No newline at end of file diff --git "a/week8/group3/\354\230\210\354\240\234 4-2 \354\213\234\352\260\201.py" "b/week8/group3/\354\230\210\354\240\234 4-2 \354\213\234\352\260\201.py" new file mode 100644 index 0000000..289152c --- /dev/null +++ "b/week8/group3/\354\230\210\354\240\234 4-2 \354\213\234\352\260\201.py" @@ -0,0 +1,32 @@ +import sys +input = sys.stdin.readline + +#n = int(input()) +n=5 +# 정수 n이 입력되면 00시 00분 00초부터 N시 59분 59초까지 모든 시각 중에서 3이 하나라도 포함되는 모든 경우의 수 구하기 +# ab분 cd초 +# a,c <= 5 +# b,d <= 9 +# 진짜 시계를 만든다..? +a,b,c,d=0,0,0,0 +cnt = 0 + +for hour in range(n+1): + for a in range(6): + for b in range(10): + for c in range(6): + for d in range(10): + if hour == 3 or a == 3 or b == 3 or c == 3 or d==3: + cnt += 1 + +print(cnt) + +# 답안 예시 : 문자열로 바꿔서 검사 +""" +for i in range(h+1): + for j in range(60): + for k in range(60): + if '3' in str(i)+str(j)+str(k): + cnt+=1 +print(cnt) +""" \ No newline at end of file diff --git "a/week9/group3/31 \352\270\210\352\264\221.py" "b/week9/group3/31 \352\270\210\352\264\221.py" new file mode 100644 index 0000000..36f5839 --- /dev/null +++ "b/week9/group3/31 \352\270\210\352\264\221.py" @@ -0,0 +1,89 @@ +import sys +input = sys.stdin.readline + +""" +2 +3 4 +1 3 3 2 2 1 4 1 0 6 4 7 +4 4 +1 3 1 5 2 2 4 1 5 0 2 3 0 6 1 2 +""" +T = int(input()) +for _ in range(T): + n,m = map(int,input().split()) + mine=list(map(int,input().split())) + # 1. 2차원 리스트로 입력값 정리 + row = [[] for _ in range(m)] + + for i in range(m): #0,1,2,3/4 + for k in range(n): # 0,1,2/3 + row[i].insert(k,mine[m*k+i]) + #print(row) + # 2. 테스트케이스마다 계산 + # => 갈 수 있는 다음 열 수 중에서 가장 큰 것만 더하다 보면 최대 값이 나옴 <= 아님!!!! + # 수정) dp[0]: 갈 수 있는 위치 / dp[0][0]: dp[i], 전 단계에서 가서 얻은 금의 최대 가치/ 값: 갈 수 있는 위치(에 따른 금의 가치) + # dp[0][0]을 계속 갱신한다 + key = [-1,0,1] + dp = [[0]*len(key) for _ in range(n)] + path = [[] for _ in range(m)] # 차수마다 길(인덱스) 추적 기존의 dp[0] () m+1 <= Index of Error 방지 + # 0열 초기화 + for i in range(n): + path[0].append((i,row[0][i])) + + # 시작 + for t in range(m-1): # 차수 (광산 행렬 열) + #print(t,"차") # 차수 0열 갱신 + #print('path',path) + # 차수 별로 dp 행렬 채우기 + for i in range(n): # dp 행 + for j in range(3): # dp 열 + pos = path[t][i][0]+key[j] # 다음에 가능한 포지션 + if pos<0 or pos>=n: # 범위 넘어갈 시 + dp[i][j]=(-1,-1) # X처리 + continue + value = row[t+1][pos] + dp[i][j]=(pos,value) + # 다음 위치 찾기 + # value가 max인 열의 pos값 찾기 + _max = 0 + max_pos = 0 + #print(dp[i]) #행렬 점검용 + for pos, value in dp[i]: + if(_max < value): + _max = value + max_pos = pos + path[t+1].append((max_pos,_max)) + # 다음 행 + #print(path) # 최종 루트 + + sum = [0]*m + #sum = [[] for _ in range(m)] + for i in range(n): + for k in range(m): + #sum[i].append(path[k][i][1]) + sum[i]+=path[k][i][1] + print(sum[i]) # 시작 행 별로 얻을 수 있는 최대 가치 + print(max(sum)) + + + +""" + dp[0] = row[0].index(max(row[0])) # dp[i]=가야할 i번째 열 위치 + key = [-1,0,1] + for i in range(1,m): + cur = dp[i-1] + next = [] + for k in key: + cur+=k + if cur>=0 and cur<=2: + next.append(cur) + cur-=k + dp[i] = max(next) + + print(dp) + sum=0 + for i in range(m): + print(row[i][dp[i]]) + sum+=row[i][dp[i]] + print(sum) +""" diff --git "a/week9/group3/32 \354\240\225\354\210\230 \354\202\274\352\260\201\355\230\225(\354\210\230\354\240\225).py" "b/week9/group3/32 \354\240\225\354\210\230 \354\202\274\352\260\201\355\230\225(\354\210\230\354\240\225).py" new file mode 100644 index 0000000..c075fb5 --- /dev/null +++ "b/week9/group3/32 \354\240\225\354\210\230 \354\202\274\352\260\201\355\230\225(\354\210\230\354\240\225).py" @@ -0,0 +1,38 @@ +import sys +input = sys.stdin.readline + +n = int(input()) # 1~500 +triangle = [] +for _ in range(n): + triangle.append(list(map(int,input().split()))) + +path=[[] for _ in range(n)] # 모든 층의 각 정수까지의 최대값 모음 +path[0] = triangle[0] +#print(path) +#[[7],[10(3+7),15(8+7)],[18(10+8),16(15+1),15(15+0)]],[20(18+2),25(18+7),20(16+4),19(15+4)],[24, 30, 27, 25, 24]] +for stair in range(1,n): # 꼭대기 아래층부터 1층까지 + for i in range(len(triangle[stair])): # 현재 층 + cur = triangle[stair][i] + # 최댓값 위치 찾기 + _max,max_pos=-1,-1 + for pos in [i,i-1]: + if pos<0 or pos >= len(triangle[stair-1]): + continue + # 최대값 찾는 방법으로 이용 + if triangle[stair-1][pos]>_max: + _max = triangle[stair-1][pos] + max_pos = pos + path[stair].append(cur+path[stair-1][max_pos]) # 새로 갱신 + +for i in range(n): + print(path[i]) + +print(max(path[n-1])) +""" +5 +7 +3 8 +8 1 0 +2 7 4 4 +4 5 2 6 5 +""" \ No newline at end of file diff --git "a/week9/group3/35 \353\252\273\354\203\235\352\270\264 \354\210\230.py" "b/week9/group3/35 \353\252\273\354\203\235\352\270\264 \354\210\230.py" new file mode 100644 index 0000000..ecb1738 --- /dev/null +++ "b/week9/group3/35 \353\252\273\354\203\235\352\270\264 \354\210\230.py" @@ -0,0 +1,24 @@ +# 35 못생긴 수 +# 2,3,5만을 약수로 갖는 합성수 +# 1,2,3,4,5,6,8,9,10,12,15 ... +# n번째 못생긴 수 찾기 + +#1 1*2 1*3 2*2 1*5 2*3 4*2 3*3 2*5 +#[0] [0]*2 [0]*3 [1]*2 [0]*5 [1]*3 [3]*2 [2]*3 [1]*5 + +n = int(input()) +ugly = [1] #1~1000 +key = [2,3,5] +#cnt=0 +i=0 +while(len(ugly)<1000): + for u in key: + result =ugly[i]*u + if ugly.count(result)==0: # 없을 때만 추가 + #cnt+=1 + ugly.append(result) + i+=1 +ugly.sort() +print(ugly[n-1]) +#print(ugly) +#print(cnt,len(ugly),) \ No newline at end of file diff --git "a/week9/group3/[\354\213\244\354\240\204] 1\353\241\234 \353\247\214\353\223\244\352\270\260.py" "b/week9/group3/[\354\213\244\354\240\204] 1\353\241\234 \353\247\214\353\223\244\352\270\260.py" new file mode 100644 index 0000000..80b9adc --- /dev/null +++ "b/week9/group3/[\354\213\244\354\240\204] 1\353\241\234 \353\247\214\353\223\244\352\270\260.py" @@ -0,0 +1,23 @@ +X = int(input()) +END = 30001 +dp = [0]*END +dp[1]=0 +# 1부터 5배수,3배수,2배수, 1더한 값 계산(거꾸로 계산)해서 DP테이블 채워나가기 +# dp[n]이 0이 아니면 계산이 이루어졌단 소리이므로 값을 갱신할 필요가 없음 << 아님! +# e.g. 26 +# 1 4 12 13 26 / 1 5 25 26 => 2가지 방법으로 도달 가능. 따라서 더 연산 작은 쪽으로 ㄱㄱ +# 초기엔 dp[n]이 다 0 +def oper(x): + if 5*x 문제 연산대로 해서 범위제한을 할 필요가 없었음. n=min함수 쓰는 건 같음 +for i in range(1,END): + oper(i) +print(dp[X]) \ No newline at end of file diff --git "a/week9/group3/[\354\213\244\354\240\204] \352\260\234\353\257\270\354\240\204\354\202\254.py" "b/week9/group3/[\354\213\244\354\240\204] \352\260\234\353\257\270\354\240\204\354\202\254.py" new file mode 100644 index 0000000..1d8da77 --- /dev/null +++ "b/week9/group3/[\354\213\244\354\240\204] \352\260\234\353\257\270\354\240\204\354\202\254.py" @@ -0,0 +1,22 @@ +N = int(input()) # 3~100 +storage = list(map(int,input().split())) # 값의 총합 최대 1000 + +# i번째 칸을 택했으면 i+2이후의 칸을 선택 가능 +# 근데 최댓값을 얻으려면 최대한 많은 칸을 택하는게 좋을 듯 +# e.g. 1 2 1 3 1 <- 그런데 이런 경우는 +# 1 3칸을 택한 것보다 2,3 이렇게 2칸이 더 높음 +# e.g. 2 3 2 3 2 3 2 +# 최대 4칸 선택할 수 있단 말야 +# 그럼 네 칸해서 더한 거랑 3칸해서 더한 것 중에 최대를 선택하면 될 듯 +# 아니면 i번째 칸을 더했으면 그 다음은 i+2 또는 i+3만 택할 수 있음 +# = i번째 칸이 택해졌으면 i-2또는 i-3칸이 택해졌을 것 +# 아니면 i번째 칸까지 가능한 최대의 값 이후 +# e.g. 1 1 1 1 1 1 10 3 +# 결론=> 인덱스 i의 칸까지의 최대 식량값은 (1칸 꺼 or 2칸 전+i칸 중 최댓값) +dp = [0]*N +dp[0] = storage[0] +dp[1] = max(dp[0],storage[1]) +for i in range(2,N): + dp[i] = max(dp[i-1],dp[i-2]+storage[i]) +#print(dp) +print(dp[N-1]) \ No newline at end of file diff --git "a/week9/group3/[\354\213\244\354\240\204] \353\260\224\353\213\245 \352\263\265\354\202\254.py" "b/week9/group3/[\354\213\244\354\240\204] \353\260\224\353\213\245 \352\263\265\354\202\254.py" new file mode 100644 index 0000000..75f9782 --- /dev/null +++ "b/week9/group3/[\354\213\244\354\240\204] \353\260\224\353\213\245 \352\263\265\354\202\254.py" @@ -0,0 +1,11 @@ +n = int(input()) +# i번째 칸의 경우 구하는 방법 +# 1) i-2번째 칸까지 덮은 경우 수 + 1x2 2개 또는 2x2로 덮는 경우 총 2개 +# 2) i-1번쨰 칸까지 덮은 경우 수 + 2x1 1개로 덮는 경우 1개 + +dp = [0]*n +dp[0] = 1 +dp[1] = dp[0]+2 +for i in range(2,n): + dp[i] = dp[i-2]*2+dp[i-1] +print(dp[n-1]%796796) \ No newline at end of file diff --git "a/week9/group3/[\354\213\244\354\240\204] \355\232\250\354\234\250\354\240\201\354\235\270 \355\231\224\355\217\220 \352\265\254\354\204\261.py" "b/week9/group3/[\354\213\244\354\240\204] \355\232\250\354\234\250\354\240\201\354\235\270 \355\231\224\355\217\220 \352\265\254\354\204\261.py" new file mode 100644 index 0000000..5f45a63 --- /dev/null +++ "b/week9/group3/[\354\213\244\354\240\204] \355\232\250\354\234\250\354\240\201\354\235\270 \355\231\224\355\217\220 \352\265\254\354\204\261.py" @@ -0,0 +1,25 @@ +import sys +input = sys.stdin.readline + +# 최소한의 화폐 개수로 특정 값의 돈 만들기 +n,goal = map(int,input().split()) +wallet = [] #길이 1~100 +for _ in range(n): + wallet.append(int(input())) +wallet.sort() +# 1원부터 goal원까지 만들 수 있는 최소 화폐 개수 테이블 dp +END = goal+1 +#dp=[0]*END # 1~10000 +dp=[END]*END # 1~10000 +for money in wallet: # 초기화 + if money0 else dp[i]+1 + dp[i+money] = min(dp[i+money],dp[i]+1) + +print(dp[goal] if dp[goal]!=END else -1) \ No newline at end of file