🔺 문제
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
🧩 해결 아이디어
• 백트래킹
1. N개 중 M개를 뽑는 가능한 모든 조합을 만든다.
2. 해당 조합에 대해 XOR 연산을 수행하고, 이 중 최댓값을 구한다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
import java.util.*;
import java.io.*;
public class Main {
static int max = Integer.MIN_VALUE;
static int N, M;
static int[] arr;
static List<Integer> comb = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arr = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < N ; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
getComb(0, 0);
System.out.println(max);
}
private static void getComb(int lastNum, int depth) {
if(depth == M) {
max = Math.max(max, XOR());
return;
}
for(int i = lastNum ; i < N ; i++) {
comb.add(arr[i]);
getComb(i + 1, depth + 1);
comb.remove(comb.size() - 1);
}
}
// XOR 비트 연산 메소드
private static int XOR() {
int tmp = comb.get(0);
for(int i = 1 ; i < comb.size() ; i++) {
tmp = tmp ^ comb.get(i); // XOR 비트 연산
}
return tmp;
}
}
|
cs |
🔺 다른 풀이들
1) N개 중 M개 뽑는 모든 조합 만들고, 각각의 조합에 대해 XOR 연산 수행
- 시간 복잡도 : O(조합(N, M) * M)
private static void solve(int currIdx, int depth) {
if(depth == M) {
max = Math.max(max, XOR());
return;
}
// currIdx에 있는 숫자 선택하지 않은 경우
solve(currIdx + 1, cnt);
// currIdx에 있는 숫자 선택한 경우
visited[currIdx] = true;
solve(currIdx + 1, cnt + 1);
visited[currIdx] = false;
}
2) 재귀 함수 인자로 currVal 값 가져가며 업데이트 ✅
- 시간 복잡도 : O(조합(N, M))
┕ currIdx 위치의 숫자 선택 시, 그 다음 재귀 함수 인자 값으로 currVal ^ arr[ currIdx ]한 값 보냄
┕ currIdx 위치의 숫자 선택 X 시, 그 다음 재귀 함수 인자 값으로 기존 currVal 그대로 보냄
private static void solve(int currIdx, int depth, int currVal) { // currVal 갖고 다니며 업데이트
if(depth == M) {
max = Math.max(max, currVal); // 🔔
return;
}
// currIdx에 있는 숫자 선택하지 않은 경우
solve(currIdx + 1, cnt, currVal);
// currIdx에 있는 숫자 선택한 경우
solve(currIdx + 1, cnt + 1, currVal ^ arr[currIdx]);
}
💬 느낀 점
XOR 연산을 배우다...
어렵지만 재미있는 백트래킹의 나라...
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 12.20 |
(참고)
✔ 비트연산, XOR 연산 참고
[알고리즘] java 비트연산 정리하기
기초개념인 java 비트연산을 정리해보도록 하겠습니다. 비트연산은 2개의 이진수에 대해서 연산하는 것을 말합니다. 컴퓨터는 이진수로 대화를 하고 있기 때문에 이 비트연산을 알아두는 것이
vmpo.tistory.com
Java - XOR 연산자
XOR 연산자는 비트 연산자로, 비트 값이 서로 다르면 1을 리턴하고 같으면 0을 리턴하는 연산자입니다. 자바에서 XOR의 연산자는 ^입니다. 만약 10과 15에 대해서 XOR 연산을 하려면 10 ^ 15로 입력하시
codechacha.com
07. [자바] 비트 연산자 &, |, ^, ~, <<, >>
비트 연산자란? 비트 연산자는 피연산자를 비트단위로 논리 연산한다. 피연산자를 이진수로 표현했을 때의 각 자리를 알아보자 |(OR연산자) 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다.
staticclass.tistory.com
'코테 > 코드트리' 카테고리의 다른 글
[코드트리/INTERMEDIATE LOW] 거꾸로 순열 (JAVA) (0) | 2023.12.05 |
---|---|
[코드트리/INTERMEDIATE LOW] 크기가 n인 순열 (JAVA) (1) | 2023.12.05 |
[코드트리/INTERMEDIATE LOW] n개 중에 m개 뽑기 (JAVA) (0) | 2023.12.04 |
[코드트리/INTERMEDIATE LOW] 사각형 채우기 2 (JAVA) (0) | 2023.11.28 |
[코드트리/INTERMEIDATE LOW] 정수 사각형 최대 합 (JAVA) (0) | 2023.11.26 |