728x90

알고리즘/PS - SWEA 10

[SWEA 2105 - Java] 디저트카페

SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 오른 아래와 왼 아래 이동 횟수들만 고려해 전부 확인해서 문제를 해결했습니다. 각각의 횟수에 따라서 위쪽 방향에 해당하는 이동들을 하면서 디저트집이 겹치는 지를 확인해주면 되는 문제입니다. 디저트집이 겹치는지 여부는 HashSet을 사용하면 됩니다. import java.util.*; public class Solution { static int N; static int[][] map; static int answer; static int[] moveR = {1, 1, -1, -1}; static int[] moveC = {1, -1, -1, 1}; stat..

[SWEA 4008 - Java] 숫자 만들기

SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 완전 탐색을 통해서 전부 확인하여 풀이가능한 문제입니다. 저는 재귀를 이용해서 완전탐색을 구현했습니다. 연산자를 차례로 하나씩 추가하면서 재귀를 호출합니다 N-1개 모두 추가한 후엔 해당 수식을 통해 나오는 값을 계산합니다. 계산한 값을 가지고 최대 최소를 업데이트합니다. 최댓값과 최솟값의 차를 출력합니다. import java.util.Scanner; public class Solution { static int N; static int answer, minN, maxN; static int[] operator, numbers, makeSik; public..

[SWEA 5656 - Java] 벽돌 깨기

https://swexpertacademy.com/main/main.do SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 완전탐색과 BFS를 적절히 이용하면 되는 문제입니다. 적용되는 알고리즘 자체는 정말 간단하지만 그를 구현하는게 골치아팠습니다. 완전탐색을 이용하기 때문에 재귀로 구현하였습니다. 다음 재귀가 호출되는 것은 다음 구슬을 벽돌에 쏘는 경우 입니다. 구슬을 쏘는 경우에 대해선 완전 탐색을 하고 그 안에서 연쇄적으로 벽돌이 파괴될 수 있으므로 이는 BFS를 사용하였습니다. 현재 구슬이 맞추는 벽돌의 좌표를 큐에 넣고 BFS를 시작합니다. 현재 위치와 함께 깨지는 벽돌의 숫자가 1보다 큰 경우엔 ..

[SWEA 5658 - Java] 보물상자 비밀번호

SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 우선 숫자들을 입력받는 차례대로 LinkedList에 저장합니다. 회전은 0회~(N/4-1)회 까지 확인해야합니다. 그 이상의 회전은 동일한 패턴이 되기 때문입니다. 각각의 회전 상태에 대해서 N/4개 씩 (한 변에 위치하는 숫자의 개수) 끊어서 10진수 변환을 하여 HashSet에 저장합니다. (HashSet을 사용하는 이유는 중복을 피하기 위해서 입니다) 1칸 회전을 위해서 LinkedList의 맨 마지막 값을 뽑아서 LinkedList의 맨앞에 넣어줍니다. 모든 회전에 대해 완료한 후 HashSet을 LinkedList로 변환한 후 내림차순으로 정렬합니..

[SWEA 5644 - Java] 무선 충전

SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 문제에 나온대로 차례로 처리하면서 풀면되는 문제입니다. 입력을 모두 받은 후에 현위치 부터 그 위치에서 충전 가능한 A와 B의 합의 최대값을 구합니다. 그리고 입력 받은 대로 다음 위치로 이동시키면서 매 위치마다 최대 충전 값을 구해야 합니다. 최대 충전을 구하는 것은 함수를 새로 생성해서 구현했습니다. 현 위치와 각각의 충전기위 위치와의 거리를 확인하고 충전기가 커버 가능한 거리에 있으면 A와 B각각에 대해 배열을 하나 생성해 해당 충전기로 충전이 가능하다는 표시를 해줍니다. 또한 충전 가능한 충전기의 수를 A, B 각각에 대해 세줍니다. 만약 A와 B모두..

[SWEA 4012 - Java] 요리사

SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 그냥 모든 경우의 수를 확인하면 되는 간단한 문제입니다! 첫 번째 재료부터 A요리 또는 B요리에 추가하면서 재귀를 호출하여 마지막 요리까지 모두 추가한 후에 시너지의 차를 계산하여 그 시너지 차의 최소를 출력하면 되는 문제입니다. import java.util.Scanner; public class Solution { static int N; static int[][] matrix; static int[] foodA; static int[] foodB; static int answer; public static void main(String[] args) {..

[SWEA 5650 - Java] 핀볼 게임

SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 이 문제는 특별한 알고리즘을 적용하는 것이 중요하지는 않은 구현문제입니다!! 특히 블록에 부딪히거나 벽에 부딪힌 경우의 방향 전환과 웜홀에서 순간 이동에 주의해야합니다!!! 저는 위의 그림처럼 충돌 전 방향과 충돌 후 방향이 어떻게 변하는지를 미리 생각해두고 문제를 해결했습니다. 또한 웜홀의 경우는 ArrayList배열을 만들어 같은 숫자에 해당하는 위치들을 해당 인덱스에 저장해 두고 사용했습니다. 그런뒤 map상에서 빈칸 즉 0인 위치들에서 각각의 4가지 방향에 대해 모두 출발해 보며 최대 점수를 찾아내면 되는 문제입니다. import java.util.S..

[SWEA 1953 - Java] 탈주범 검거

SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 각각의 파이프의 상하좌우 이동가능 방향을 따로 저장해서 사용하였습니다. 또한 상하좌우의 이동 방향에 따라 다음에 진행하여 만날 수 있는 파이프의 방향이 달라야 합니다. 이 점을 정말 중요하게 고려해줘야 합니다!!!! BFS를 이용하여 다음 방향으로 이동시키면서 시간을 체크하면서 문제를 해결하면 됩니다. import java.util.*; public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); f..

[SWEA 1952 - Java] 수영장

SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 이 문제는 1~12월까지만 확인을 하고 이용권이 종류도 매우 적기 때문에 모든 경우를 확인해도 시간초과가 되지 않습니다! 따라서 저는 월을 기준으로 재귀를 호출하며 답을 구했습니다. answer 변수에 1년 이용권 가격을 넣어준 후 재귀 호출을 시작합니다. 1월 부터 시작하여 해당 월에 1일 이용권, 1달 이용권, 3달 이용권을 이용하는 경우들에 대해 재귀를 호출합니다. 이 때 해당 월에 수영장 출석 계획이 없다면 이용권을 결제하지 않도록 합니다. 1~12월 까지의 이용권 금액이 모두 추가된 후엔 answer의 값과 현재 까지의 요금을 비교하여 현재 요금이 ..

[SWEA 1949 - Java] 등산로 조성

SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 이 문제의 경우엔 DFS 알고리즘을 이용해서 풀이하였습니다. 가장 높은 봉우리들을 모두 큐에 저장한 뒤에 하나씩 뽑으면서 각각의 봉우리에서 시작하는 등산로들을 확인해야 합니다. 이 과정에서 재귀를 이용한 DFS 알고리즘을 사용합니다. 상하좌우의 이동을 확인합니다. 범위가 벗어나거나 이미 방문한 지점의 경우엔 다시 방문 하지 않습니다. 이동하려는 곳의 높이가 더 낮은 경우엔 road+1과 이동한 위치를 가지고 dfs함수를 재귀 호출합니다. 이동하려는 곳의 높이가 현위치 이상인 경우가 중요합니다! 이 때는 k 이하로 깎아서 현위치의 높이 이하가 되며 아직 깎은 ..

728x90
반응형