- 문제
- 부분 오름차순 정렬된 배열을 받아, target의 인덱스를 리턴
- 없는 경우는 -1 리턴
- 시도
- 부분 정렬이 무작위로 포인트가 잡혔다고 생각하였음
- 가장 작은 수를 찾아 포인트로 잡고, 0번 인덱스부터 포인트-1까지를 전반부
- 포인트부터 끝까지를 후반부로 나눠 타겟의 범위를 줄이고 시작하였음
- 타겟이 전반부 또는 후반부의 범위에 따라, 따로 while문으로 BinarySearch를 하였음
- 부분 정렬이 내 생각대로 무작위였다면 가장 효율적이였겠으나, 문제에 주어진 포인트는 중간점의 +-1 범위 내에 포인트가 있었음
- 결국 효율성 문제로 마지막 문제를 해결하지 못했음
- 수도코드
const rotatedArraySearch = function (rotated, target) {
let mid = rotated.indexOf(Math.min(...rotated))
let start = 1;
let end = rotated.length - 1;
if (target === rotated[0]) {return 0;}
else if (target > rotated[0]) {
end = mid - 1;
while (start <= end) {
let cur = parseInt((start + end) / 2);
if (target > rotated[cur]) {
start = cur + 1;
}
else if (target < rotated[cur]) {
end = cur - 1;
}
else if (target === rotated[cur]) {
return cur;
}
}
return -1;
}
else if (target < rotated[0]) {
start = mid;
while (start <= end) {
let cur = parseInt((start + end) / 2);
if (target > rotated[cur]) {
start = cur + 1;
}
else if (target < rotated[cur]) {
end = cur - 1;
}
else if (target === rotated[cur]) {
return cur;
}
}
return -1;
}
return -1;
};
- 레퍼런스
const rotatedArraySearch = function (rotated, target) {
let start = 0;
let end = rotated.length - 1;
while (start <= end) {
let mid = parseInt((start + end) / 2);
if (target === rotated[mid]) return mid;
else if (rotated[start] < rotated[mid]) {
if (target < rotated[mid] && target >= rotated[start]) {
end = mid - 1;
} else {
start = mid + 1;
}
}
else {
if (target > rotated[mid] && target <= rotated[end]) {
start = mid + 1;
} else {
end = mid - 1;
}
}
}
return -1;
};