알고리즘 97

[삼성SW역량][Python/BOJ] 백준 17142 연구소3(BFS)

벽의 개수와 바이러스의 공간을 list로 저장한다. combinations를 이용해 활성화시킬 m개의 바이러스를 선택한다. bfs를 이용해 모든 빈곳을 감염시키는 시간을 반환하도록 한다. 0. time 변수 생성 1. vis 배열을 만든다. 2. 바이러스를 deque에 넣고 바이러스의 위치는 vis의 값을 0으로 설정한다. 3. 바이러스가 퍼진다. 3-1. 퍼지는 곳이 빈곳이라면 퍼지고, time 을 갱신 3-2. 퍼지는 곳이 비활성화된 바이러스라면 활성화시킨다. 4. 미리 구해놓은 벽의 개수화 현재 벽의 개수를 비교한다. 5. 만약 다르면 모든 빈곳을 채우지 못한것이므로 무한대를 반환, 아니라면 time 을 반환 코드 : from collections import deque f..

[삼성SW역량][Python/BOJ] 백준 17140 이차원 배열과 연산(구현)

🐾 20220927 이 문제는 정말 구현만 하면 된다. 근데 이런 생각을 대체 어떻게 하지.... 이차원 배열에서 전치된 배열을 구하고 싶다면 (*mp)를 하면 된다. 다만 배열 형태로 나오는 것이 아니기에 zip(*mp)를 해주면 된다. 해당 숫자와 개수를 구하기 위해서는 set을 이용해서 중복을 제거한다는 것이 신기했다. 그리고 0 이 아니라면 해당 숫자와 개수를 넣는다. for i in set(row) : if i : tmp.append([i, row.count(i)]) def sor(A,clen) : for idx , row in enumerate(A) : tmp = [] for i in set(row) : if i : # 0은 무시 tmp.append([i,row.count(i)]) tmp.so..

[삼성SW역량][Python/BOJ] 백준 20055 컨베이어 벨트 위의 로봇(구현)

언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다 이 부분을 코드에 넣지않아서 계속 틀렸었다. 변화가 있을 때마다 언제든지 , 즉 [n-1]자리에 로봇이 있다면 0으로 변경해준다. 코드 : from collections import deque if __name__=="__main__" : n,k = map(int,input().split()) durability = deque(map(int,input().split())) robot = deque([0]*(n*2)) ans = 0 while True : ans +=1 # 한 칸 회전 durability.rotate() robot.rotate() if robot[n-1] :# 내리는 자리에 로봇이 있다면 내림 robot[n-1] = 0 #로봇 이동 f..

백트래킹과 DFS가 무슨 관계인가요?

백트래킹은 경우의 수 중에서 유망하지 않은 것을 거르는 방법으로 이것을 구현한는 방법은 다양하며 BFS, DFS등으로 구현할 수 있다. https://what-am-i.tistory.com/286?category=966524 [삼성SW역량][Python/BOJ] 백준 14889 스타트와 링크(DFS, 백트레킹) https://www.acmicpc.net/problem/14889 14889번: 스타트와 링크 예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다. www.acmicpc.ne.. what-am-i.tistory.com 여기 이 스타트와 링크문제의 풀이는 백트래킹 구현을 위해 DFS를 ..

[Python/프로그래머스]순위_그래프

https://programmers.co.kr/learn/courses/30/lessons/49191 코딩테스트 연습 - 순위 5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2 programmers.co.kr 코드 : from collections import defaultdict def solution(n, results): answer = 0 win_graph = defaultdict(set) # 이긴 선수 lose_graph = defaultdict(set) # 진 선수 for winner, loser in results : win_graph[loser].add(winner) lose_graph[winner].add(loser) for i in range(1,n+1) ..

[Python/프로그래머스] 소수 찾기_완탐

https://programmers.co.kr/learn/courses/30/lessons/42839 코딩테스트 연습 - 소수 찾기 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 programmers.co.kr 코드 : from itertools import permutations # 소수 판별 def is_prime_number(x) : if x

[Python/프로그래머스]모의고사_완탐

https://programmers.co.kr/learn/courses/30/lessons/42840 코딩테스트 연습 - 모의고사 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 programmers.co.kr 코드 : def solution(answers): answer = [] supo1 = [1,2,3,4,5] supo2 = [2,1,2,3,2,4,2,5] supo3 = [3,3,1,1,2,2,4,4,5,5] cnt = [0,0,0] for i in range(len(answers)) : if answers[i] == supo1[i%5] : cnt[0] +=1 i..

[Python/프로그래머스]단속 카메라_Greedy(그리디)

https://programmers.co.kr/learn/courses/30/lessons/42884 코딩테스트 연습 - 단속카메라 [[-20,-15], [-14,-5], [-18,-13], [-5,-3]] 2 programmers.co.kr 1. 빨리 끝나는 순으로 정렬한다. 2. 카메라를 가장 처음에 둔다. 3. 구간 시작보다 카메라가 이전에 있다면 3-1. 끝나는 곳에 카메라를 설치한다. 코드 : def solution(routes): answer = 0 routes.sort(key = lambda x : x[1]) # 빨리 끝나는 순으로 정렬 camera = -30001 for route in routes : if camera < route[0] : # 시작위치보다 전에 카메라가 있다면 answe..

[Python/프로그래머스]섬 연결하기_Greedy(그리디)

https://programmers.co.kr/learn/courses/30/lessons/42861 코딩테스트 연습 - 섬 연결하기 4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4 programmers.co.kr Kruskal 알고리즘을 이용해 풀이하였다. 1. 비용이 작은 순으로 정렬한다. 2. connect set을 만들어 연결 여부를 확인한다. 3. while문을 통해 전부 연결될 때까지 돌린다. 3-1. cost에 이미 있으면 continue 3-2. cost에 없으면 connect 에 넣고 비용을 더한다. 4. 비용 반환 코드 : def solution(n, costs): answer = 0 costs.sort(key = lambda x : x[2]) # 비용..

[Python/프로그래머스]구명보트_Greedy(그리디)

https://programmers.co.kr/learn/courses/30/lessons/42885 코딩테스트 연습 - 구명보트 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5 programmers.co.kr 인덱스를 이용해서 풀이한다. 직접 pop해서 풀면 효율성에서 실패한다고 한다. 코드 : def solution(people, limit): answer = 0 people.sort() i ,j = 0, len(people)-1 # i : 가장 마른 사람, j : 가장 뚱뚱한 사람 while i