알고리즘/백준 문제풀이 83

[삼성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.net # depth은 뽑은 사람의 인원수, idx는 뽑은 사람 다음부터 뽑기위해서 저장 💻 코드 : def dfs(depth, idx) : # depth는 사람의 수 global min_diff if depth == n//2 : power1, power2 = 0,0 for i in range(n) : for j in range(n) : if vis[i] and vis[j] : # i와 j가 동시에 우리팀! power1+= ..

[삼성SW역량][Python/BOJ] 백준 14888 연산자 끼워넣기(DFS)

https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, www.acmicpc.net dfs(idx,val) : val 이 기존 값 , idx는 이제 더할 값의 인덱스 다음 dfs는 val에 idx인덱스의 값을 (더하거나 ,빼거나 곱하거나 나눠주고) idx를 1 증가시킨다.) 그래서 처음에 dfs(1, numbers[0]) 를 호출해주는 것이다. numbers[0]을 가장 초기값으로 idx가 1인 값을 선택된 기호로 계산하여 ..

[삼성SW역량][Python/BOJ] 백준 14503 로봇 청소기(구현)

https://www.acmicpc.net/problem/14503 14503번: 로봇 청소기 로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어 www.acmicpc.net 문제에 나와있는 순서대로 ( 북, 동, 남, 서 )로 dx,dy를 설정해준다. 1. 왼쪽으로 회전한다. ( 왼쪽에 청소공간이 있든 말든 어쨌든 회전하기 때문이다.) 2-1. 청소할 공간이 있다면 청소하고 그곳으로 위치로 간다. [turn 횟수를 초기화] 2-2. 청소할 공간이 없다면 turn의 횟수만 증가 시킨다. 3. 만약 turn 횟수가 4라면 (주변에 모두 청소가 되어있거나 벽일 경우 ) ..

[삼성SW역량][Python/BOJ] 백준 14502 연구소(DFS+BFS)

https://www.acmicpc.net/problem/14502 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크 www.acmicpc.net wall()함수와 bfs() 함수가 있다. 1. wall 함수는 세운 벽의 개수를 인수로 받아 3이 되면 bfs함수를 실행시킨다. 아니라면 연구소를 돌면서 빈칸을 만나면 벽을 세우고 wall함수를 인수 1을 증가시켜 부른다. 2. bfs 함수는 바이러스를 퍼뜨린후 안전영역의 개수를 센다. ans 와 비교하여 가장 큰 안전영역의 개수를 저장한다. 코드 : Score와 virus를 합쳐서 bfs함수로 이름지었다...

[삼성SW역량][Python/BOJ] 백준 14501 퇴사(DFS)

https://www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net 코드 : def dfs(idx, val) : if idx == n+1 : global answer answer = max(answer,val) return else : if idx + T[idx] n : return if idx == n : global answer answer = max(answer,val) return dfs(idx+T[idx],val+P[idx]) dfs(idx+1,val) dfs(0,0) print(answer ) 0 안넣고 그냥 할 수 도 있습니다. 좀 더 간단한 코드 : def dfs(day,pay) : g..

[삼성SW역량][Python/BOJ] 백준 14500 테트로미노(DFS)

https://www.acmicpc.net/problem/14500 14500번: 테트로미노 폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변 www.acmicpc.net 주어진 mp를 돌면서 4개로 연결된 폴리오미노의 합중 가장 큰 합을 구해 출력하면 된다. 시간 초과를 막는 방법 : 가장 큰 값을 구해서 (가장 큰값 * (3-idx) ) + val 이 현재 답보다 작거나 같다면 return 한다. 'ㅗ'의 경우는 dfs로 찾을 수 없으므로 if idx ==1 : 을 따로 코드를 만들어 주어야한다. 코드 : n,m = map(int,input().split()) ..

[삼성SW역량][Python/BOJ] 백준 13458 시험 감독(수학)풀이와 수정과정

https://www.acmicpc.net/problem/13458 13458번: 시험 감독 첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000) www.acmicpc.net n = int(input()) arr = list(map(int,input().split())) b,c = map(int,input().split()) cnt = 0 max_super = max(b,c) min_super = min(b,c) for student in arr : while True : if student == 0 : brea..

[Python/BOJ] 백준 1753 최단경로(다익스트라)

https://www.acmicpc.net/problem/1753 1753번: 최단경로 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 www.acmicpc.net 복습 : 🐾 20220922 🐾 20220924 🐾 20220926 🐾 20221014 📌 어디까지 혼자 생각했나? 앞서 풀어본 bfs 문제와 비슷할거라고 생각하고 이차원 리스트와 거리를 저장할 일차원 리스트를 생각했다. 그런데 구현부분에서 어떻게 해야 최솟값을 구할지 모르겠어서 정답을 찾아보았다. 💡 새롭게 알게된것 다익스트라 문제에는 heapq가 사용된다...

[Python/BOJ] 백준 14442 벽 부수고 이동하기2(BFS)-시간초과에서 삽질하다가 AC

https://www.acmicpc.net/problem/14442 14442번: 벽 부수고 이동하기 2 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자. www.acmicpc.net 앞서 벽 부수고 이동하기 를 풀었기에 이 문제를 풀 아이디어는 쉽게 얻을 수 있었다. 💡 방법 vis 배열을 3차원으로 만드는 것이 아니라 입력되는 k에 따라서 차원을 만드는 것이다. 그후 k번 벽을 뚫을 수 있으므로 뚫을 때마다 -1 씩 줄어들도록 코드를 만들었다. 코드는 나와있는 테케의 정답대로 잘 나왔고 제출하였다. 그러나 계속해서 시간초과가 발생하였다. ..

[Python/BOJ] 백준 2206 벽 부수고 이동하기(BFS)

https://www.acmicpc.net/problem/2206 2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로 www.acmicpc.net 🐾 20221031 🖌 어떤 생각? 1. 벽을 부쉈는지 안부쉈는지를 저장한는 변수가 필요하겠구나 그래서 덱에 3개의 수가 들어있겠구나 2. 토마토와 달리 숫자가 띄어쓰기 없이 입력되는데 어떻게 리스트 형태로 잘 만들 수 있을까? 3. 그래서 bfs를 어떻게 만들어야하지?! 💡 어떻게 해결하지? 1. 방문여부를 확인하면서 거리를 저장하는 배열 vis를 만들 때 벽의 부서짐 ..