알고리즘 384

[백준, 자바, 14500번] 테트로미노

풀이해당 문제는 어떻게 푸는 방법이 좋을지 고민했을 때각 도형에 따른 변형을 최소화하면서, 기준 좌표로부터이동가능한 좌표 탐색을 4방향을 우선적으로 작성 후 값을 도출하는 것이 좋을 것 같다고 판단.다만, 이러한 노가다가 과연 적절한지 고민해봤는데 나쁘지 않을 듯해서 아래와 같이 작성그리고 무슨 5중 for문으로 해결한 문제는 이번이 처음인듯...그래도 최대한 코드를 가독성 좋으며, 구조적으로 작성하려고 노력하여 아래와 같이 작성.문제 자체는 크게 어려운 건 아니지만, 번거로웠다? 정도였음. import java.io.*;import java.util.Arrays;import java.util.StringTokenizer;public class _14500 { static BufferedReader..

알고리즘 2024.12.16

[백준, 자바, 1551번] 수열의 변화

풀이오늘은 간단하게 하나 풀기로 함우선 해당 문제는 단순히 수열이 주어질 때특정 인덱스를 앞 인덱스 값에서 뺀 값을 구하는 수를 구하는 문제이며M번 반복하게 되면 결과로 나오는 값의 개수는기존 N의 길이에서 N-M개로 줄어들기에 그것을 유념하여 풀어야 함또한 결과를 출력 시 ,를 기준으로 출력을 하는 것으로 해결하는 것으로다음과 같이 해결. import java.io.*;import java.util.*;import java.util.stream.Collectors;public class _1551 { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; ..

알고리즘 2024.12.13

[백준, 자바, 6064번] 카잉 달력

풀이해당 문제는 처음에 무슨 말인가 하고 쭉 보다보니 x,y가 서로 독립적으로 변하는 문제인 것을 확인이후 우선 단순히 1씩 증가하고 M과N위를 벗어날 경우나머지를 활용하여 해결하고자 함.다만 이렇게 하니 시간 초과가 발생...역시나 정답 비율이 낮은 이유는 있다는 것을 느낌그래서 어떻게 해결할 수 있을지 고민하다가뭔가 규칙을 발견하게 됨.우선 아래 코드를 보면입력 값이 10 12 3 9의 경우엔 x를 기준으로 y를 변경 후M만큼 계속 y에 더하고 초과 시 나머지로 변경한다면간단히 해결이 됨입력 값이 10 12 7 2의 경우엔출력이 -1로 나오는 것으로 해결 방법에 대해 고민해 본 결과우선 공통적으로 x가 y보다 작은 값이 들어가도록 조건 처리하기이후 마찬가지로 10 12 3 9 입력 값처럼 연산을 하지..

알고리즘 2024.12.10

[백준, 자바, 5525번] IOIOI

풀이해당 문제를 처음 봤을 때는 substring으로 특정 문자열을 찾으면 되겠구나 했지만이렇게 쉬운데 정답 비율이 낮다는 건, 무슨 의도가 있겠구나 싶었음그래도 우선 시도해보고 그에 따라 변화를 주는 것이 좋을 것 같다고 판단하여그대로 실행했지만 역시나... 50%까지만 정답이후 어떻게 해볼까 고민하다가단순히 I와O의 반복되는 길이를 찾고해당 구간에서 N길이에 따른 문자열의 길이를 카운팅하면 되지 않을까하고알고리즘을 작성한 결과 무난히 통과! // 성공 코드import java.io.*;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new Buffered..

알고리즘 2024.12.10

[백준, 자바, 1389번] 케빈 베이컨의 6단계 법칙

풀이해당 문제는 단순히 데이터 추가 후결과를 찾고자는 곳에 가장 마지막 유저를 제외하고BFS로 찾으며, 조건에 따라 mtx에 단계를 변경하는 것으로 해결내가 작성한 풀이에서 아쉬운 점은 예를 들어 N=5의 경우1번은 모든 사람에 대한 조사를 하기에2,3,4,5번의 모든 1번 mtx가 채워져 있기에2번은 2번은 같으니 제외하고3번부터 5번까지만 찾도록 하고 싶은데이를 어떻게 해결할 수 있을지를 고민해도잘 떠오르지 않아 그냥 마지막 사람을 제외한 모든 사람을 BFS로 탐색하는 것으로 해결...import java.io.*;import java.util.*;public class _1389 { static BufferedReader br = new BufferedReader(new InputStreamR..

알고리즘 2024.12.09

[백준, 자바, 30804번] 과일 탕후루

풀이해당 문제는 뭔가 어려웠다.우선 처음에는 어떻게 해결할 수 있을지 고민하다가누적합으로 해결 할 수 있지 않을까 했는데생각하다보니 20만 배열의 경우엔 너무 반복이 심할 것 같아서고민을 했지만 우선 진행하지만 역시나 시간초과...그래서 아래에 태그를 확인해보니 투 포인터물론 두 개의 인덱스로 어찌어찌 한다는 정도는 알지만어떤 경우에 사용하면 좋은지 이해하고자, 우선 개념을 이해하기로 함.주요 개념 포인터: 배열이나 리스트에서 특정 위치를 가리키는 인덱스입니다. 두 포인터: 왼쪽 포인터와 오른쪽 포인터를 초기화하고, 조건에 따라 이동시키면서 필요한 값을 찾습니다. 시간 복잡도: 보통 **O(N)**으로 동작하며, 완전 탐색(O(N²))에 비해 효율적입니다.투 포인터의 활용 구간 합 문제: 연속된 부분..

알고리즘 2024.12.06

[백준, 자바, 21736번] 헌내기는 친구가 필요해

풀이해당 문제는 간단히 BFS로 해결했으며따로 특별하거나 그런 문제는 아니였음다만 벽이 아닌 사람이 있는 경우에도 해당 위치에 방문할 수 있는지한 번 읽었을 때는 이해가 가지 않아 두 번 읽으니 벽이 아니면 갈 수 있다는 것을 확인하여 간단히 해결. import java.io.*;import java.util.*;public class _21736 { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static String[][] mtx; static boolean[][] visit; static Deque dq = new ArrayDeque(); public static void ..

알고리즘 2024.12.06

[백준, 자바, 17626번] Four Squares

풀이해당 문제는 최소 개수의 제곱수로 임의의 값을 찾는 문제로어떻게 해결해야할지 고민을 한 결과, 임의의 값의 sqrt까지 모든 제곱수를 구한 다음재귀로 모든 경우를 찾아보자라고 결정함.다만 0.5초라는 시간 제한이 있었기에, 뭔가 뭔가 했지만 그냥 해봄그런데 처음에 그냥 무의식적으로 visit 체크를 해서중복하여 같은 것을 더하지 못하도록 함.그래서 계속 87퍼쯤에서 멈추길래이후엔 방문체크를 하지 않고 해결하게 됨.그리고 중간에는 계속 끝에서부터 처음까지 탐색하도록 했어서시간초과가 발생하길래, 현재 위치부터 조회하도록 하여시간 효율을 줄여 해결할 수 있었음. import java.io.*;import java.util.*;public class _17626 { static List li = new..

알고리즘 2024.12.05

[백준, 자바, 9375번] 패션왕 신해빈

풀이해당 문제는 물론 재귀로 해서 문제를 해결할 수는 있지만수학적 규칙이 보여서 고민해보다가예전 수학 규칙이 생각남우선 예를 들어 3개의 의상 종류가 있을 경우모자 3개, 상의 2개, 바지 2개라고 할 경우각각 1개씩 착용한 것, 2개씩, 3개씩 착용한 경우에 대한모든 경우의 수를 더해야 하기에착용하지 않은 수를 각 의상 별로 하나씩 추가따라서 모자 4개, 상의 3개, 바지 3개로 생각 후모든 경우의 수를 구해야 하므로 4*3*3을 하면 36개단, 여기서 모든 것을 착용하지 않은 하나의 경우를 뺀다면 35개 식으로 구하기로 함그래서 다음과 같이 코드를 작성그리고 같은 이름의 의상은 없다고 했는데 체크 못해서... Set로 받은것... import java.io.*;import java.util.*;pub..

알고리즘 2024.12.05

[백준, 자바, 1094번] 막대기

풀이해당 문제는 막대를 가지고 장난치는 문제인데계속해서 남은 막대 중짧은 막대를 절반으로 자르는  문제이기에간단히 우선순위 큐를 사용해서 문제를 풀고자 했음그리고 계속해서 배열의 모든 값을 더하는 건비효율 적이라 판단하여 조기 길이인 64에서조건에 따라 계속해서 차감하는 것으로 현재 길이를 간단히 파악하고자 함이에 따라 길이가 맞춰졌다면 while문을 탈출하고현재 배열의 개수를 출력 후 해결 import java.util.*;public class _1094 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int X = sc.nextInt(); int hap = 64;..

알고리즘 2024.11.27