알고리즘
[백준] 숫자카드(10815)
9 views
문제 설명
백준 숫자카드 문제 풀이(https://www.acmicpc.net/problem/10815)

코드 구현
text
// 백준에서는 첫번째 조건으로 input 받게 설정
// 내 맥북, desktop 에선 두번째걸로 선택됨
const input =
process.platform === "linux"
? require("fs").readFileSync("/dev/stdin").toString().split("\n")
: require("fs").readFileSync("./input.txt").toString().split("\n");
const numberArray = input[1]
.split(" ")
.map((el) => parseInt(el))
.sort((a, b) => a - b);
const testArray = input[3].split(" ").map((el) => parseInt(el));
// 정렬된 Array 반환
const binarySearch = (arr, number) => {
let end = arr.length - 1;
let start = 0;
while (start <= end) {
const mid = parseInt((end + start) / 2);
if (start === end) {
return arr[mid] === number;
}
if (arr[mid] > number) {
end = mid;
} else if (arr[mid] < number) {
start = mid + 1;
} else {
return true;
}
}
return false;
};
let answer = "";
for (const num of testArray) {
answer += binarySearch(numberArray, parseInt(num)) ? " 1" : " 0";
}
console.log(answer.trim());
코드 해설
해당 문제는 이진탐색으로 해당 수가 배열에 있는지 찾아 풀면 되는 문제이다.
사실 해당 배열을 for 문을 통해 해쉬에 저장하고, 해당 값이 있는지 없는지를 찾아서 계산하는 것이 조금 더 효율적일 것 같으나, 문제 분류가 이진 탐색이라 이진 탐색으로 풀어 보았다.
요약 및 참고사항
- for문으로 모든 경우를 계속 돌게 된다면, timeout 이 된다.
- 탐색을 줄이기 위해, 첫 배열을 정렬시키고 이진탐색을 하였다
- 이진탐색의 경우 log(n)의 시간이 걸리므로, 탐색의 시간이 매우 줄어들게 된다.
