[BOJ] 14719: 빗물 (JAVA)
·
Algorithm/시뮬레이션
문제https://www.acmicpc.net/problem/14719 여담좀 복잡하게 풀었다는 생각이 들어 다른 풀이를 참고했더니 역시 더 쉬운 방법이 있었다...^^ 시간 차이는 크게 나지 않았지만 다른 방법으로 풀어보니 확실히 내가 풀었던 방법이 더욱 복잡했다는 것을 깨달았다. 언제쯤 정석 풀이로 풀까..ㅎㅎ 그래도 풀었다는 것에 의의를 둬야지! 풀이간단한 버전이 정석으로 푸는 방법 같아서, 간단한 버전에 대해서만 설명을 진행하겠다. 빗물이 고이려면 현재 블록의 높이보다 높은 블록들로 둘러쌓여야 한다. 따라서 현재 블록의 왼쪽과 오른쪽을 탐색해야 한다. 즉, 빗물이 고이기 위해서는 다음의 조건을 모두 만족해야 한다.현재 블록의 왼쪽에 자신보다 높은 블록이 존재하는 경우현재 블록의 오른쪽에 자신보다 ..
[BOJ] 문제 풀이 모음집 - 그리디 (JAVA)
·
Algorithm/그리디
11047: 동전 0🔗 문제 링크나누어 주는 동전의 개수가 최소가 되려면 가치가 큰 동전부터 나누어 주면 됨더보기24.06.02 풀이import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int n = Integer.parseInt(st.nextToken()); ..
[BOJ] 16926: 배열 돌리기 1 (JAVA)
·
Algorithm/시뮬레이션
문제https://www.acmicpc.net/problem/16926 여담저번에 풀려다가 복잡해 보여서 넘어갔던 문제..! 어려워 보였는데 차근차근 푸니까 나름 괜찮았다. 달팽이 문제와 비슷한 느낌?! 풀이회전을 1번하는 풀이 과정은 다음과 같다.회전시켜야 하는 그룹의 수(k) 구하기k = min(N, M) / 2min(N, M) mod 2 = 0이므로 가능한 것(0, 0), (1, 1), ... (k, k)를 시작점으로 선택해서 시계 반대 방향(↓ → ↑ ←)으로 회전하기시작점으로 돌아오면 반복을 종료하기우선 하나의 방향을 고정해서 배열을 회전시키다가, 범위를 벗어나거나 이미 기록한 위치면 회전 방향을 변경하기범위를 벗어난 경우: nx = N || ny >= M이미 기록한 위치: rotateArr[n..
[BOJ] 2961: 도영이가 만든 맛있는 음식 (JAVA)
·
Algorithm/완전탐색
문제https://www.acmicpc.net/problem/2961 여담하나의 재료에 포함된 신맛과 쓴맛인 줄 모르고 각각 나눠서 생각해서 헤맸다. 다행히 반례 예제가 주어져서 틀렸습니다를 마주하지는 않았다. 나름 다 정리하고 풀었는데 또 제대로 읽지 않았나 보다.. 차근차근 고쳐나가야지😢 풀이주어지는 재료의 수가 최대 10개이므로, 완전 탐색을 통해 풀이할 수 있다. 각 재료의 신맛과 쓴맛을 배열에 저장한 뒤, 완탐을 수행하면 된다. 풀이 로직은 다음과 같다.재료를 적어도 하나 사용했다면 신맛과 쓴맛의 차이가 더 작은 값으로 갱신하기minDiff = Math.min(minDiff, Math.abs(sTaste - bTaste))모든 재료를 다 탐색했으면 탐색을 종료하기해당 재료를 선택한 경우와 선택..
[BOJ] 14620: 꽃길 (JAVA)
·
Algorithm/완전탐색
문제https://www.acmicpc.net/problem/14620 여담방문 처리가 제대로 되지 않길래 잘 작성했는데 대체 뭐지? 했는데 방문 처리하는 좌표의 값을 잘못 넣어준 것이었다.. 이런 실수가 대체 몇 번인지 진짜.. 백준 풀 때 아주 나쁜 습관만 들어서 큰일났다..ㅋㅋ 풀이화단의 한 변의 최대 길이가 10이고, 설치하는 꽃도 3개이므로 완전 탐색과 백트래킹을 사용해서 풀 수 있다. 설치한 꽃의 개수가 3이 될 때까지 완탐(=dfs 메소드)을 수행해서 최소 비용을 구하면 된다. dfs 메소드에서 중요한 부분은 방문 처리를 하는 부분이다. 꽃을 설치할 수 있을 때에만 방문 처리를 해야 하므로, 네 방향의 좌표를 저장하기 위한 배열을 하나 선언한다.Pos[] pos = new Pos[4] 그 후..
[SWEA] D2, D3 문제 풀이 (JAVA)
·
Algorithm
D21859. 백만 장자 프로젝트🔗 문제 링크백준의 11501: 주식 문제와 거의 동일한 문제매매가가 제일 높을 때 팔아야 하므로, 뒤에서부터 탐색하기 1 1 3 1 2와 같이 "1일차, 2일차 - 구매, 3일차 - 판매" & "4일차 - 구매, 5일차 - 판매"일 때가 최대 이익인 경우를 고려해야 하기 때문최대 매매가 최대 매매가 > 현재 매매가 ⇒ 구매하기더보기더보기import java.io.*;import java.util.*;class Solution{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in..
[BOJ] 1713: 후보 추천하기 (JAVA)
·
Algorithm/시뮬레이션
문제https://www.acmicpc.net/problem/1713 여담문제를 읽은 후, HashMap과 우선순위 큐를 사용해야 되겠다고 생각했다. 그치만 중복된 경우를 우선순위 큐에서 어떻게 처리할지 헷갈려서 계속 고민했다. 결국 사진을 삭제할 때만 우선순위 큐를 사용하도록 했고, 다행히 이 방법으로 문제를 풀 수 있었다! 풀이이 문제는 주어진 조건에 따라 단순하게 구현을 하면 되는 문제이다. 주어진 조건을 정리하면 다음과 같다.사진틀에 게시될 수 있는 학생의 사진은 최대 N 개비어있는 사진틀이 없는 경우, 아래의 순서에 따라 게시된 사진을 삭제하고 새로운 사진을 게시하기추천받은 횟수가 가장 적은 학생의 사진 삭제학생들 중 게시된 지 가장 오래된 사진 삭제학생 정보와 그 학생의 추천 정보(게시 순서,..
[BOJ] 5212: 지구 온난화 (JAVA)
·
Algorithm/시뮬레이션
문제https://www.acmicpc.net/problem/5212 여담두 번째 예제가 틀리게 나와서 문제를 다시 읽어보니 "지도에 없는 곳, 지도의 범위를 벗어나는 칸은 모두 바다이다"라는 문장이 있었다. 이를 사용한 예제가 있어서 다행이지 아니었으면 놓칠 뻔했다..! 왜 자꾸 끝을 안 읽냐 끝이 중요하다고.. 풀이50년이 지나면 인접한 세 칸 또는 네 칸에 바다가 있는 땅은 모두 잠긴다고 한다. 즉, BFS 탐색을 통해 땅 주변에 위치한 바다의 수를 센 후 조건에 따라 지도를 변경해야 한다. 따라서 다음과 같은 과정을 수행하면 된다.땅의 위치를 큐에 저장한다.큐에서 땅의 위치를 poll() 한다.인접한 칸(=상하좌우)에 위치한 바다의 수를 구한다.이때, 지도를 벗어나는 칸도 모두 바다이다.바다인 경..
[BOJ] 2615: 오목 (JAVA)
·
Algorithm/완전탐색
문제https://www.acmicpc.net/problem/2615 여담오랜만에 "틀렸습니다"를 많이 마주했다^^... 처음에는 육목을 고려하지 않아서, 두 번째는 "검은색 또는 흰색이 이겼을 경우에는 가장 왼쪽에 있는 바둑알의 가로줄 번호와 세로줄 번호를 순서대로 출력" 이라는 문장을 크게 신경 쓰지 않고 풀었기 때문이었다. 특히, 두 번째 반례를 찾아내지 못해서 많은 시간을 소요했다. 제발 문제를 풀기 전에 조건들을 다 정리하고 풀자... 🤦🏻 풀이N = 19이므로 이중 반복문을 사용해도 시간 초과가 발생하지 않는다. 따라서 완전탐색으로 같은 색의 바둑알이 연속해서 5개 나오는지 확인하면 된다. 이때, 2가지를 주의해서 풀어야 한다. 첫 번째는 같은 색의 바둑알이 연속해서 6개 나오는 경우이다...
[BOJ] 15787: 기차가 어둠을 헤치고 (JAVA)
·
Algorithm/시뮬레이션
문제https://www.acmicpc.net/problem/15787 여담처음에는 순수 구현으로 풀었다. 그치만 비트마스킹으로도 풀 수 있다길래 비트마스킹에 대해 간단하게 공부한 뒤 다시 풀었다. 이때까지 비트마스킹이 어려울 것 같아서 계속 미루고 있었는데, 이 문제를 통해 비트마스킹에 대해 알아볼 수 있는 기회가 되었다! 그리고 비트마스킹을 사용하면 더 빠른 시간, 더 적은 메모리를 사용하는 효과가 있다고 들었는데, 실제로 확실히 차이가 나는 것을 확인할 수 있었다. 비트마스킹을 잘 익히면 유용하게 써먹을 수 있을 것 같다!  풀이기차의 상태를 구한 뒤, HashSet을 이용해서 중복을 거른 후 저장된 수를 출력하면 된다. 기차의 상태를 구하는 방법은 구현과 비트마스킹, 총 2가지로 나눌 수 있다. ..