find_set과 union을 사용하는 문제! 각 노드마다 부모를 가리키키는 리스트를 만들어주고 union연산을 통해 두 집합을 통합시킨다. 뒤에 오는 인자(y)가 부모노드가 된다. 여기서 find_set연산을 하는데, 노드X가 부모노드값과 같으면 노드 x값이 리턴이 되고 아니라면 다시 find_set함수로 들어가서 부모노드를 찾아 리턴시켜준다. 예시로 union(1,2)을 보면 parent =[0,1,2] 이다. parent[find_set(2)] = find_set(1) find_set(2)은 if 2 == parent[2]: return 2 대입하면 union(1,2): parent[2] = find_set(1) 이 되고 find_set(1)은 리턴 1이므로 parent[2] = 1이 되어 pare..
최소 몇 번의 연산을 거쳐야 하는지 알아내는 프로그램이기 때문에 BFS로 푸는 문제이다. deque를 사용해야 시간초과가 생기지 않는 다는 점을 알게 된 문제였다. 그리고 2+1 =3 , 3-1 =2가 반복하여 생길 수 가 있는데 이러한 문제를 예방하기 위해서 연산 결과 숫자를 인덱스로하는 리스트로 visited를 사용했고 방문했다고 처리해줬다. from collections import deque # 연산: +1, -1, *2, -10 네 가지 # 큐에 숫자연산결과와 횟수 함께 넣기 def oper(): global result while Q: #큐가 비어있지 않으면 front, check = Q.popleft() if front == M: result = check return #함수 종료 for i..
1. 일단 모든 조합의 합을 구해서 B보다 같거나 큰것이 있다면 리스트에 넣어준다. 2. 리스트에서 가장 작은 값을 추출하여 B에서 뺀다. from itertools import combinations T = int(input()) #높이가 B 이상인 탑 중에서 높이가 가장 낮은 탑 #조합을 구하여 합이 B보다 큰것의 리스트를 만든다. for tc in range(1,T+1): N, B = map(int,input().split()) # N:점원 수 B:선반의 높이 H = list(map(int,input().split())) over = [] sum_o = [] for i in range(N+1): over.append(list(combinations(H,i))) for j in range(len(ov..
1. 일단 어느 곳에서 시작이 가능하기 때문에 이중for문을 사용하여 모든 원소에서 시작하게 했다.(함수) 2.함수에서 4방 탐색을 한다. 글자수는 7자이기 때문에 cnt가 8번이 되면 종료하는 것으로 짰다. 3.중복을 없애기 위해서 set()으로 받았다. def move(x,y,cnt): global num if cnt == 8: #8번 돌아가면 종료 num.add("".join(temp)) # join에서 str로 받아달라해서 MAP원소들을 int형에서 str로 바꿈 return #우 if y+1 < 4: temp[cnt-1] = MAP[x][y+1] move(x,y+1,cnt+1) #하 if x+1 < 4: temp[cnt-1] = MAP[x+1][y] move(x+1,y,cnt+1) #상 if x..
T = int(input()) for tc in range(1,T+1): two = input() three = input() n_two = [] for i in range(len(two)): if two[i] == '1': temp = '0' else: temp = '1' n_two.append(int(two[:i] + temp + two[i+1:], 2)) # print(n_two) for i in range(len(three)): for k in range(3): if three[i] != str(k): temp = str(k) n_three = int(three[:i] + temp + three[i + 1:], 3) if n_three in n_two: ans = n_three print("#{}..
많이 배정하거나 선택하는 문제를 '활동 선택 문제(Activity Selection problem)'라고 한다. 이 문제가 그리디 알고리즘(탐욕알고리즘)의 전형적인 문제라고 한다. 수식으로 그려봤을 때 겹치는 것들을 선택하면 안되는 문제이기 때문에 1. 종료되는 시간을 기준으로 정렬을 했다. sort()함수의 인자 안에 람다를 써주고 기준을 넣어주면 된다.( 리스트의 1번째가 종료시간이므로 x[1]이라고 해줬다.) 2. 다음 순서의 시작이 앞에 것의 종료시간 안에 있다면 그것을 제외시킨다.(pop(0)으로 표현) 3. 겹치지 않는다면 cnt ++해주고 end를 갱신시켜준다. #cnt =1로 초기화한 이유는 제일 빨리 끝나는 것을 선택하고 시작하기 때문 T = int(input()) for tc in ra..
T = int(input()) for tc in range(1,T+1): N, M = map(int, input().split()) weight = list(map(int,input().split())) truck = list(map(int,input().split())) ans = 0 for i in range(M): temp = [] for j in range(N): if truck[i] >= weight[j]: # 무게가 트럭 용량보다 작거나 같으면 temp.append(weight[j]) #temp에 넣어줌 if len(temp) != 0: #temp에 한개라도 들어갔을 때 ans += max(temp) # temp에 들어있는 최대값을 ans에 더해줌 for j in range(N): #최대값을 ..
T = int(input()) for tc in range(1, T+1): N, M = map(int, input().split()) b = format(M, 'b') # 2진수로 변환 ans = list(map(int, list(b))) ans.reverse() print("#{}".format(tc), end=' ') if len(ans) >= N: cnt = 0 for k in range(N): cnt += ans[k] if cnt == N: print('ON') else: print('OFF') else: print('OFF')
T = int(input()) for tc in range(1,T+1): N, H = input().split() b = format(int(H, 16), 'b') #16진수를 10진수로 바꾼것을 다시 2진수로 바꿔준다. print("#{}".format(tc), end=' ') cnt = int(N)*4 - len(b) #2진수는 4자리로 구성. 앞에 0 채워줌 for i in range(cnt): print(0,end='') print(b) 1. int(H, 16) 으로 하면 16진수가 10진수로 바뀐다. 2. b = format(10진수 숫자, 'b') 하면 2진수로 바뀐다.
- Total
- Today
- Yesterday
- 프로그래머스
- 백준
- javascript
- 트리
- 자바
- 위클리챌린지2주차
- 싸피
- vue
- Java
- django
- 알고리즘
- 세션 스토리지
- Pyhton
- DOM
- 비동기패턴
- vue.js
- SSAFY
- git
- AWS
- splide
- N과M
- SSAFY퇴소
- Python
- 독학
- SQL
- 배포
- commit되돌리기
- SWEA
- 파이썬
- 안드로이드스튜디오
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |