
양의 정수 x에 대한 함수 f(x)를 다음과 같이 정의합니다.
x보다 크고 x와 비트가 1~2개 다른 수들 중에서 제일 작은 수
예를 들어,
f(2) = 3 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다.
| 수 | 비트 | 다른 비트의 개수 |
|---|---|---|
| 2 | 000...0010 | |
| 3 | 000...0011 | 1 |
f(7) = 11 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다.
| 수 | 비트 | 다른 비트의 개수 |
|---|---|---|
| 7 | 000...0111 | |
| 8 | 000...1000 | 4 |
| 9 | 000...1001 | 3 |
| 10 | 000...1010 | 3 |
| 11 | 000...1011 | 2 |
정수들이 담긴 배열 numbers가 매개변수로 주어집니다. numbers의 모든 수들에 대하여 각 수의 f 값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.
1 ≤ numbers의 길이 ≤ 100,000
0 ≤ numbers의 모든 수 ≤ 1015
function solution(numbers) {
var answer = [];
for (i = 0; i < numbers.length; i++) {
var current = numbers[i];
if (current % 2 === 0) {
answer.push(current + 1);
} else {
current = "0" + current.toString(2);
var totalLength = current.length;
for (j = totalLength - 1; j >= 0; j--) {
if (+current[j] === 0) {
answer.push(parseInt(current.substring(0, j) + "10" + current.substring(j + 2, totalLength), 2 )
);
break;
}
}
}
}
return answer;
}
동기 : 한 작업이 끝나야 다음 작업이 시작되는 순차적인 처리 방식. => 작업이 완료되기 전에 다른 작업을 수행할 수 없음.
비동기 : 한 작업이 끝나기를 기다리지 않고 다음 작업을 실행할 수 있음. => 작업 완료 여부와 상관없이 다른 작업을 동시에 진행할 수 있음.
블락킹 : I/O 작업(파일 읽기, 네트워크 요청)을 요청할 때 해당 작업의 완료 전까지 프로그램의 실행이 멈춤. => I/O작업의 완료 전까지 다른 어떤 작업도 수행할 수 없음.
논블락킹 : I/O 작업 요청 후에도 프로그램의 실행이 멈추지 않고 즉시 다음 작업으로 넘어감. => I/O 작업의 완료 여부와 상관없이 프로그램이 계속 실행 가능.
비동기와 논블락킹의 차이 : 비동기의 경우 작업을 어떠한 흐름으로 처리하는지에 대한 내용이고 논블락킹의 경우 처리하는 작업이전체의 흐름을 어떻게 처리하는가(막는다, 막지않는다)에 대한 내용이다.