💡Problem Solving/BOJ 108

[BOJ 15683] 감시 (Java)

문제 https://www.acmicpc.net/problem/15683 15683번: 감시 스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감 www.acmicpc.net 풀이 삼성 문제의 경우 BruteForce 유형이 많은 것 같다. 해당 문제는 각 감시 카메라 타입 별로 가능한 감시 방향을 미리 정의해 놓은 후, 모든 경우의 수를 조합하여 사각 지대의 최소 개수를 구한다. 1. 감시카메라 타입 별로 가능한 방향을 미리 정의한다. 2. 방향에 따른 좌표 증/감분을 미리 정의한다. static HashMap possibleDir = new Hash..

[BOJ 17070] 파이프 옮기기 1 (Java)

문제 https://www.acmicpc.net/problem/17070 17070번: 파이프 옮기기 1 유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 www.acmicpc.net 풀이 1. 진출 방향에 따른 x, y 좌표 증가분을 미리 정의해 둔다. 2. 현재 파이프의 방향에 따라 진출 가능한 방향을 미리 정의해둔다. static HashMap dir = new HashMap(){{ put('V', new int[]{1, 0}); put('H', new int[]{0, 1}); put('D', new int[]{1, 1}); }}; stati..

[BOJ 16236] 아기 상어 (Java)

문제 https://www.acmicpc.net/problem/16236 16236번: 아기 상어 N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가 www.acmicpc.net 풀이 문제를 대충 읽고 풀다보니 여기 저기 보수 공사가 많이 필요해서 코드가 지저분해졌다. 해당 문제의 기본 접근 방법은 BFS이다. 일단, 먹을 수 있는 물고기가 있는지 체크한다. 만약 있다면 BFS를 진행한다. BFS를 진행하면서 핵심 포인트는, 먹을 수 있는 물고기가 등장했을 때 동일 depth에 있는 칸을 체크하여 먹을 수 있는 물고기 좌표를 모두 저장해 놓고 탐색을 종료하는 ..

[BOJ 2468] 안전 영역 (Java)

문제 https://www.acmicpc.net/problem/2468 2468번: 안전 영역 재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 www.acmicpc.net 풀이 DFS + BruteForce 강수량 범위가 적기 때문에 완전 탐색으로 구현하였다. 각 강수량마다 safe영역을 구하면서, max값을 갱신 소스코드 package dfs; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ2468 { pub..

[BOJ 14503] 로봇 청소기 (Java)

문제 https://www.acmicpc.net/problem/14503 14503번: 로봇 청소기 로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어 www.acmicpc.net 풀이 dfs + 구현 문제이다. 방문 체크를 하면서 로봇 청소기 작동 원리대로 코드를 구현하면 된다. 현재 방향에 따른 왼쪽 좌표와 후진 좌표, 회전 방향은 초반에 미리 정의 해두었다. (나중에 조건문으로 짜면 골치 아프당) 소스코드 package simulation; import java.io.BufferedReader; import java.io.InputStreamReader; imp..

[BOJ 14501] 퇴사 (Java)

문제 https://www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net 풀이 N의 범위가 작기 때문에 완전 탐색으로 접근하였다. 상담 건을 선택 한 후, profit을 증가하여 다음 가능한 상담을 선택한다. 상담 일수가 초과되거나 종료되었을 때의 profit의 합을 max값과 비교하여 갱신한다. 소스코드 package bruteforce; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ14501 { public static int[] T, P..

[BOJ 2636] 치즈 (Java)

문제 https://www.acmicpc.net/problem/2636 2636번: 치즈 아래 과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(에서 네모 칸에 X친 부분)에는 치즈가 놓 www.acmicpc.net 풀이 치즈 내부 구멍과 외부 공기 모두 0으로 표시되기 때문에 이를 구분해야 한다. 1. 내부 구멍과 외부 공기를 구분한다. 전체 맵의 가장 자리가 비어있기 때문에 첫 번째 좌표 0, 0에서 BFS하여 상하좌우 0인 좌표를 모두 3으로 변경해주었다. 즉, 외부 공기를 3으로 바꿔주었다. 아래 단계를 치즈가 사라질 때까지 반복한다. 2. 치즈의 공기 접촉면을 체크한다. 맵을 순회하면서 값이 3(외부 공기)일 때,..

[BOJ 4195] 친구 네트워크 (Java)

문제 https://www.acmicpc.net/problem/4195 4195번: 친구 네트워크 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진 www.acmicpc.net 민혁이는 소셜 네트워크 사이트에서 친구를 만드는 것을 좋아하는 친구이다. 우표를 모으는 취미가 있듯이, 민혁이는 소셜 네트워크 사이트에서 친구를 모으는 것이 취미이다. 어떤 사이트의 친구 관계가 생긴 순서대로 주어졌을 때, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오. 친구 네트워크란 친구 관계만으로 이동할 수 있는 사이를 말한다. 풀이 union-fin..

[BOJ 14502] 연구소 (Java, Python)

문제 https://www.acmicpc.net/problem/14502 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크 www.acmicpc.net 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크기가 N×M인 직사각형으로 나타낼 수 있으며, 직사각형은 1×1 크기의 정사각형으로 나누어져 있다. 연구소는 빈 칸, 벽으로 이루어져 있으며, 벽은 칸 하나를 가득 차지한다. 일부 칸은 바이러스가 존재하며, 이 바이러스는 상하..

[BOJ 2529] 부등호 (Java)

문제 https://www.acmicpc.net/problem/2529 풀이 완전 탐색으로 풀었다. 재귀 함수를 호출한다. 1. 반복문을 이용하여 숫자를 선택한다. 2. 선택한 숫자에 대해 방문 체크를 한다. (visited 배열 사용) 3. 부등호 연산에 부합하는지 체크한다. 4. 선택한 숫자에 대해 방문을 추가한 후, 지금까지 저장해온 문자열에 선택한 숫자를 붙여서 재귀 함수를 호출한다. 5. 재귀 함수의 호출 횟수가 부등호의 개수+1 이 되었을 때, 현재까지 선택한 숫자의 값에 따라 Min, Max를 갱신한다. 소스코드 package bruteforce; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Inpu..