구현하고싶은것)
사용자가 원하는대로 컬럼순서를 바꿀 수 있는 기능
하지만 하나 옮긴다고 전체 데이터베이스를 업데이트 할수는 없기때문에 부동소수점을 이용해 구현해보았다.
사실 부동소수점의 개념은 잘 모르겠으나 단순히 순서가 1, 2, 3 있다면 1.1234 이런식으로 소수를 이용해 1과 2사이에 배치할 수 있다는 아이디어를 사용해보았다.
처음에는 단순하게 1과 2 사이에 순서를 배치하고싶다면 나누기를 사용해서 그 사이수를 구하려 했다.
그래서 순서를 처음부터 1과 2가 아니라 1.1, 2.2 처럼 소수를 이용해 줬다.
이렇게 하면 될 줄 알았는데 나눗셈이 내 마음대로 되는게 아니었다.. ㅋㅋㅋㅋ
나누기가 아니라 1과 2사이의 수를 구하기 위해 2에서 특정 수를 빼지만 1보다는 크게 유지하도록 코드를 구현했다.
let xx: number, yy: number, decimalProcedure: number;
xx = boardList[procedure - 2].procedure;
yy = boardList[procedure - 1].procedure;
decimalProcedure = xx + 0.5;
while (decimalProcedure > yy) {
decimalProcedure -= 0.001;
}
발생한 문제
1. 사용자가 순서 1 또는 2를 넣으면 구현되지 않음 => if 문으로 첫번째나 두번째에도 넣을 수 있도록 코드를 수정했다.
2. 처음 지정해준 순서가 1, 2, 3이니 겹치는 구간이 너무 빨리옴
=> 최대한 지정순서를 멀리 늘림. 첫번째는 100 두번째는 300 세번째는 500 이런식으로..
3. while문도 제대로 동작을 안함..;;;
=> 부동소수점 이용시 발생할수있는 문제라 함. 오차를 넣어주니 어찌 해결은 됐음..
4. 항상 0.5를 더하는것보단 랜덤한 수를 더하는게 좋을거같음 => Math.random() 사용
let xx: number, yy: number, decimalProcedure: number;
const tolerance = 0.0001;
if (procedure == 1) {
xx = boardList[0].procedure;
decimalProcedure = xx - Math.random();
decimalProcedure = Math.max(decimalProcedure, 0.1);
} else if (procedure == 2) {
xx = boardList[0].procedure;
yy = boardList[1].procedure;
decimalProcedure = xx + Math.random();
while (decimalProcedure > yy && decimalProcedure - yy > tolerance) {
decimalProcedure -= 0.001;
}
} else {
xx = boardList[procedure - 2].procedure;
yy = boardList[procedure - 1].procedure;
console.log(xx, yy);
decimalProcedure = xx + Math.random();
while (decimalProcedure > yy && decimalProcedure - yy > tolerance) {
decimalProcedure -= 0.001;
}
}
개선된 코드
하지만 여전히 문제가 있었다..
동일한 순서를 여러번 입력하면 랜덤으로 수를 주게 되더라도 동일한 순서를 줬던 procedure에 같은 순서를 갖게 된다...ㅜㅜㅜㅜ 좀 더 찾아보니 내가 한게 그래스호퍼 정렬 (Grasshopper Sorting)과 비슷하다는걸 알게됐다.
이 정렬은 한번에 두개의 원소만 비교하기 때문에 안정성이 떨어지는게 특징이라한다..
단순히 한번의 순서변경으로 모든 데이터베이스를 업데이트 하는짓을 하기싫어서 이런 방법을 고려하게 됐는데
과연 이게 더 적합하고 효율적인 방법인지는 잘 모르겠다..
다른 사람들은 어떻게 구현했는지 더 알아봐야겠다
'TIL' 카테고리의 다른 글
이모지 문자 mySql에 저장하기 (0) | 2024.04.12 |
---|---|
TIL #34) Nest로 S3 이용하기 (0) | 2024.03.25 |
TIL #32) Linked List 자료구조 (0) | 2024.03.20 |
TIL #31) LLM (0) | 2024.03.18 |
TIL #30) MVCC를 알아보자 (2) | 2024.03.15 |