자바 73

백준(BOJ) 4949 : 균형잡힌 세상 (실버4) / 자바(Java) 풀이

문제https://www.acmicpc.net/problem/49493줄 요약스택 사용 이유: 스택은 괄호의 중첩 구조를 관리하기에 적합한 자료구조로, 여는 괄호를 스택에 쌓고 닫는 괄호는 스택에서 제거하여 짝을 맞춥니다.속도 측면: 스택을 사용하면 각 연산(삽입 및 삭제)이 O(1) 시간에 이루어지므로 전체 알고리즘의 시간 복잡도는 O(n)입니다. 이는 괄호 문자열의 길이에 비례하여 효율적으로 처리할 수 있음을 의미합니다.처리 과정: 모든 괄호 문자열을 순회하며 스택을 이용해 짝을 맞추고, 닫는 괄호를 처리할 때 스택이 비어있으면 "no"를 출력하며, 모든 처리가 끝난 후에도 스택이 비어있지 않으면 "no"를 출력합니다. 모든 테스트 케이스에 대해 유효성을 검사하여 "yes" 또는 "no"를 출력합니다..

Problem_Solving 2024.05.14

백준(BOJ) 9012 : 괄호 (실버4) / 자바(Java) 풀이

문제https://www.acmicpc.net/problem/90123줄 요약스택 사용 이유: 스택은 괄호의 중첩 구조를 관리하기에 적합한 자료구조로, 여는 괄호를 스택에 쌓고 닫는 괄호는 스택에서 제거하여 짝을 맞춥니다. 이렇게 하면 괄호의 순서를 쉽게 관리할 수 있습니다.속도 측면: 스택을 사용하면 각 연산(삽입 및 삭제)이 O(1) 시간에 이루어지므로 전체 알고리즘의 시간 복잡도는 O(n)입니다. 이는 괄호 문자열의 길이에 비례하여 효율적으로 처리할 수 있음을 의미합니다.유효성 검사: 모든 괄호 문자열을 순회하며 스택을 이용해 짝을 맞추고, 닫는 괄호를 처리할 때 스택이 비어있으면 "NO"를 출력하며, 모든 처리가 끝난 후에도 스택이 비어있지 않으면 "NO"를 출력합니다. 모든 테스트 케이스에 대해..

Problem_Solving 2024.05.14

백준(BOJ) 6603 : 로또 (실버3) / 자바(Java) 풀이

문제https://www.acmicpc.net/problem/66033줄 요약이 코드는 재귀 함수 recursion을 활용하여 주어진 집합 S에서 크기가 6인 조합을 사전순으로 생성하고 출력하는 문제를 해결합니다.재귀 함수 recursion은 현재 선택한 숫자의 개수(depth)와 인덱스(idx)를 매개변수로 받아, 조합을 생성합니다.선택한 숫자의 개수가 6이 되면 선택한 숫자를 출력하고 종료합니다.현재 인덱스의 숫자를 선택하는 경우와 선택하지 않는 경우로 나누어 재귀 호출을 수행하며, 이를 통해 모든 가능한 조합을 탐색합니다.조합을 사전순으로 생성하기 위해, 현재 인덱스(idx)를 조정합니다.현재 인덱스의 숫자를 선택하는 경우, 다음 재귀 호출에서는 idx + 1을 전달하여 다음 인덱스부터 조합을 생성..

Problem_Solving 2024.05.12

백준(BOJ) 28075 : 스파이 (실버3) / 자바(Java) 풀이

문제https://www.acmicpc.net/problem/280753줄 요약이 문제는 N일 동안 A와 B 두 곳을 방문하는 모든 경우의 수를 구하는 문제로, 중복순열(Permutation with Repetition)을 활용하여 해결할 수 있습니다.중복순열은 순서를 고려하며, 같은 요소를 여러 번 선택할 수 있는 경우의 수를 의미합니다.이 문제에서는 각 일자마다 A 또는 B 중 하나를 선택하며, 이전에 선택한 장소와 같은 장소를 다시 선택할 수 있습니다.재귀 함수 recursiveSearch를 사용하여 중복순열을 생성하며, 각 경우에서 얻을 수 있는 진척도의 합을 계산합니다.재귀 함수의 매개변수로는 현재 방문 중인 일자(day), 이전에 방문한 장소(prev), 현재까지 누적된 진척도(progress..

Problem_Solving 2024.05.12

백준(BOJ) 15658 : 연산자 끼워넣기 (2) (실버2) / 자바(Java) 풀이

문제https://www.acmicpc.net/problem/156583줄 요약수의 개수 N, 수열 A, 그리고 사용 가능한 연산자의 개수를 입력받습니다.백트래킹을 활용하여 재귀 함수를 통해 연산자를 배치하는 모든 경우를 탐색하고, 각 경우에 대해 연산 결과를 계산합니다.재귀 함수에서는 현재 배치한 연산자의 개수를 저장하는 배열 visited를 사용하여 연산자를 배치하고, 배치된 연산자에 따라 연산을 수행합니다.연산자 배치가 완료되었을 때, 연산 결과를 최댓값과 최솟값과 비교하여 갱신합니다.백트래킹을 적용하여 현재 배치한 연산자로 인해 더 이상 탐색할 필요가 없는 경우, 해당 연산자를 배치하지 않고 다른 연산자를 배치하도록 합니다.모든 경우를 탐색한 후, 최댓값과 최솟값을 출력합니다. 이 문제에서는 백트..

Problem_Solving 2024.05.11

백준(BOJ) 10819 : 차이를 최대로 (실버2) / 자바(Java) 풀이

문제https://www.acmicpc.net/problem/108193줄 요약정수의 개수 N과 N개의 정수로 이루어진 배열 A를 입력받습니다.백트래킹을 활용하여 재귀 함수를 사용해 순열을 생성하고, 생성된 순열에 대해 인접한 요소의 차이의 절댓값의 합을 계산합니다.백트래킹은 모든 경우의 수를 탐색하되, 조건에 맞지 않는 경우는 더 이상 탐색하지 않고 가지치기하는 기법입니다.이 문제에서는 순열을 생성하는 과정에서 백트래킹을 적용합니다. 재귀 함수에서 현재 선택한 요소를 배열 B에 저장하고, 다음 요소를 선택할 때는 이전에 선택한 요소를 제외하고 선택합니다.만약 현재 선택한 요소로 인해 순열을 완성할 수 없는 경우, 해당 요소를 선택하지 않고 백트래킹하여 다른 요소를 선택합니다. 이를 통해 불필요한 탐색을..

Problem_Solving 2024.05.10

백준(BOJ) 1182 : 부분수열의 합 (실버2) / 자바(Java) 풀이

문제https://www.acmicpc.net/problem/11823줄 요약정수의 개수 N과 목표 값 S, 그리고 N개의 정수로 이루어진 배열 A를 입력받습니다.비트마스킹을 활용하여 모든 부분 집합(2^N)에 대해 선택된 정수의 합을 계산하고, 그 합이 목표 값 S와 일치하는 경우의 수를 구합니다.비트마스킹을 통해 각 정수의 선택 여부를 확인합니다. i & (1 선택된 정수들의 합을 계산하고, 그 합이 목표 값 S와 일치하는 경우 answer를 증가시킵니다.부분 집합의 합이 S와 일치하는 경우의 수를 출력합니다. 이 문제에서는 비트 연산을 활용하여 부분 집합을 효율적으로 생성하고 합을 계산함으로써 문제를 해결할 수 있습니다.코드// package boj1182;import java.io.*;import..

Problem_Solving 2024.05.10

백준(BOJ) 2961 : 도영이가 만든 맛있는 음식 (실버2) / 자바(Java) 풀이

문제https://www.acmicpc.net/problem/2961 3줄 요약재료의 개수 N과 각 재료의 신맛과 쓴맛 정보를 입력받아 2차원 배열에 저장합니다.비트마스킹을 활용하여 모든 부분 집합(2^N)에 대해 선택된 재료의 신맛과 쓴맛을 계산하고, 그 차이의 절댓값 중 최솟값을 구합니다.비트마스킹을 통해 각 재료의 선택 여부를 확인합니다. i & (1 선택된 재료의 신맛은 곱셈 연산을 통해 누적하고, 쓴맛은 덧셈 연산을 통해 누적합니다.신맛과 쓴맛의 차이의 절댓값 중 최솟값을 출력합니다. 이 문제에서는 비트 연산을 활용하여 부분 집합을 생성하고 계산함으로써 효율적인 알고리즘을 구현할 수 있습니다.코드// package boj2961;import java.io.*;import java.util.Arr..

Problem_Solving 2024.05.09

백준(BOJ) 11723 : 집합 (실버5) / 자바(Java) 풀이

문제https://www.acmicpc.net/problem/117233줄 요약비트마스킹을 활용하여 집합의 상태를 저장할 변수 set을 초기화하고, 주어진 연산을 순차적으로 수행합니다.각 연산에서는 비트 연산자를 사용하여 집합의 상태를 변경하거나 확인합니다."add" 연산은 비트 OR 연산(|=)을 통해 해당 비트를 1로 설정하여 원소를 추가합니다."check" 연산은 비트 AND 연산(&)을 통해 해당 비트가 1인지 확인하여 원소의 존재 여부를 판단합니다."remove" 연산은 비트 AND 연산(&=)과 비트 NOT 연산(~)을 통해 해당 비트를 0으로 설정하여 원소를 제거합니다."toggle" 연산은 비트 XOR 연산(^=)을 통해 해당 비트를 반전시켜 원소의 존재 여부를 토글합니다.비트마스킹을 활용..

Problem_Solving 2024.05.09

백준(BOJ) 1094 : 막대기 (실버5) / 자바(Java) 풀이

문제https://www.acmicpc.net/problem/10943줄 요약막대의 길이 X를 입력받고, 초기 막대의 길이를 64cm로 설정합니다.현재 막대의 길이가 X보다 작거나 같으면 막대를 사용하고 count를 증가시키고, 비트 연산자 >>=를 사용하여 막대의 길이를 반으로 줄이는 과정을 X가 0이 될 때까지 반복합니다. (비트 연산자 >>=는 오른쪽 시프트 연산으로, 비트를 오른쪽으로 이동시켜 값을 반으로 줄이는 역할을 합니다. 이는 2의 거듭제곱 형태인 막대의 길이를 효율적으로 처리할 수 있습니다.)최종적으로 사용된 막대의 개수 count를 출력합니다. 이 문제에서는 비트마스킹을 활용하여 막대의 길이를 반으로 줄이는 과정을 간단히 구현할 수 있습니다.코드package boj1094;import ..

Problem_Solving 2024.05.09