๐ Problem Solving/๐ซ Programmers
[JAVA] Programmers ํํ ๊ฐ๋ฅํ ์ด์งํธ๋ฆฌ
snowball๐ฐ
2023. 5. 9. 10:22
ํ์ด ๋ฐฉ๋ฒ
- Queue๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๊ฐ์ ์์ parent์ node ๊ฐ์ ์ ์ฅํด์ค๋ค.
- convert ํจ์๋ฅผ ํตํด num์ ์ด์ง์๋ก ๋ณํํ๋ค.
- ์ด๋ ์์์ 63์ ์๊ฐํด๋ณด๋ฉด ์๋์ ์ด์ง์๋ 1๋ถํฐ ์์ํด์ผ ํ๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ์์ ์ด์งํธ๋ฆฌ๋ฅผ ์๊ฐํ์ ๋ ์ด์ง์์ ๊ธธ์ด์ ๊ฐ์ ๋ง์ถ๊ธฐ์ํด ์์ 0์ ์ถ๊ฐํด์ผ ํจ์ ์๊ฐํ์.
- ๊ฐ๋ฅํ ์ด์ง์์ ๊ธธ์ด๋ nums ๋ฐฐ์ด์ ์ ์ฅํด๋์๋ค.
- ๊ฐ๋ฅํ ์ด์ง์์ ๊ธธ์ด๊ฐ ๋๊ฒ ํ๊ธฐ ์ํด ๊ทธ๋งํผ ์์ 0์ ์ถ๊ฐํด์ฃผ์
- check ํจ์๋ฅผ ํตํด ์ด์งํธ๋ฆฌ๊ฐ ๋๋์ง ํ์ธํ๋ค.
- ์ง์์ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ์ ์ฅํด๋ roots๋ฐฐ์ด์ ํ์ธํ๋ค.
- ํ์์ ๊ฒฝ์ฐ 4๋ก ๋๋ ๋๋จธ์ง๊ฐ 1์ธ ์น๊ตฌ๋ค๊ณผ 2์ธ ์น๊ตฌ๋ค์ ๋ฐ๋ผ parent๊ฐ ๋ค๋ฅด๋ค.
- ๊ฐ๋ฅํ ์ด์งํธ๋ฆฌ๊ฐ ๋๋ ค๋ฉด ์์์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ๋ถ๋ชจ๊ฐ ์กด์ฌํด์ผ ํ๋ค.
import java.util.*;
class Solution {
static int[] nums = {1, 3, 7, 15, 31, 63};
static int[] roots;
public int[] solution(long[] numbers) {
int N = numbers.length;
int[] answer = new int[N];
roots = new int[64];
// Queue ์ฌ์ฉํ๊ธฐ
ArrayDeque<int[]> q = new ArrayDeque<>();
q.offer(new int[]{32, 16});
while(!q.isEmpty()){
int[] now = q.poll();
if(now[1] == 1) break;
roots[now[0]-now[1]] = now[0];
roots[now[0]+now[1]] = now[0];
q.offer(new int[]{now[0]-now[1], now[1]/2});
q.offer(new int[]{now[0]+now[1], now[1]/2});
}
for(int i=0; i<N; i++){
String c = convert(numbers[i]);
answer[i] = check(c);
}
return answer;
}
static int check(String s){
int root = s.length()/2+1;
for(int i=1; i<=s.length(); i++){
if(i == root) continue;
if(i % 4 == 1 && s.charAt(i-1) == '1'){
if(s.charAt(i) == '0') return 0;
}
else if(i % 4 == 3 && s.charAt(i-1) == '1'){
if(s.charAt(i-2) == '0') return 0;
}
else if(i % 2 == 0 && s.charAt(i-1) == '1'){
if(s.charAt(roots[i]-1) == '0') return 0;
}
}
return 1;
}
static String convert(long num){
String r = "";
while(true){
r = (num % 2) +r;
if(num == 0 || num == 1) break;
num /= 2;
}
for(int i=0; i<6; i++){
if(r.length() == nums[i]) return r;
if(r.length() < nums[i]){
int N = nums[i]-r.length();
for(int j=0; j<N; j++)
r = "0"+r;
return r;
}
}
return r;
}
}