반응형

UPADE / DELETE

DROP TABLE movies;

CREATE TABLE movies(
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
	title TEXT UNIQUE NOT NULL,
  released INTEGER NOT NULL CHECK(released >= 1800),
  overview TEXT,
  rating REAL CHECK(rating BETWEEN 0 AND 10),
  director TEXT,
  adult INTEGER CHECK(adult BETWEEN 0 AND 1)
);

INSERT INTO movies
	(title, released, rating, adult)
VALUES
	('ZZANGGU', 1900, 8.1, 0),
  ('x-mans',2000,7.5,0);
  
--UPDATE

UPDATE movies SET released = 1991; --모든 영화의 개봉일 1991이 된다.
UPDATE movies SET released = 2001 WHERE title = 'x-mans' ;
UPDATE movies SET director = 'who?' WHERE director IS NULL;

--DELETE

-- DELETE FROM movies; -- 모든 영화가 삭제된다.
DELETE FROM movies WHERE id = 1;

SELECT

-- SELECT
SELECT * FROM movies; -- 모든 movies의 데이터를 불러올 수 있다.

SELECT id, title, released, rating, adult  FROM movies WHERE title = 'ZZANGGU'; 

SELECT 
	id,
  title,
  released,
  rating,
  adult
FROM
	movies WHERE id = 2;
  
SELECT 
	id,
  UPPER(title) as upper_title ,
  released * 2 AS double_rating,
  REPLACE(rating, 7.5, 44) as replace_rate,
  adult
FROM
	movies WHERE id = 2;

 

WHERE

SELECT
	*
FROM
	movies
WHERE
-- 	title <> 'star' -- <> != 은 같다;
-- release_date > 2023;
-- release_date is null; -- null을 검색하기 위해서는 * = null 아니라 * is null / is not null로 검색해야한다.movies
-- 	original_language != 'en' AND release_date >2022
-- release_date BETWEEN 2020 AND 2022
-- genres IN ('Documentray' , 'Comedy')
-- title LIKE 'star'
-- title LIKE 'THE%' -- %는 와일드카드
-- title LIKE '%Star%'
title LIKE '___ter'
;

Conditional

SELECT
	title,
  CASE WHEN rating >= 7 THEN
  	'GOOD'
  WHEN rating < 7 THEN
  	'SOSO'
  ELSE
  	'NAH~'
  END AS string_rating
FROM
	movies
;

Order

SELECT
	*
FROM
	movies
WHERE
	title LIKE 'star wars%'
ORDER BY
	rating DESC --- ASC 오름차순 DESC 내침차순
;

 

OFFSET

SELECT
	*
FROM
	movies
LIMIT
	5 -- 몇개를 보여줄지
OFFSET
  5 -- 몇개를 넘어갈지
  -- 1*5
  -- 2*5
;
SELECT
	*
FROM
	movies
WHERE
	title LIKE '%star%'
ORDER BY
	rating	DESC
LIMIT
	15 -- 몇개를 보여줄지
OFFSET
  0 * 15 -- 몇개를 넘어갈지
;

 

GROUP BY

SELECT
	director,
-- 	SUM(revenue) as total_revenue
	AVG(revenue) as avg_revenue
FROM
	movies
WHERE
	director IS NOT NULL
  AND
  	revenue IS NOT NULL
GROUP BY 
	director
ORDER BY
-- 	total_revenue DESC
	avg_revenue DESC
;

HAVING

SELECT
	director,
-- 	SUM(revenue) as total_revenue
	AVG(revenue) as avg_revenue
FROM
	movies
WHERE
	director IS NOT NULL
  AND
  	revenue IS NOT NULL
GROUP BY 
	director
HAVING
	avg_revenue > 800000000
ORDER BY
-- 	total_revenue DESC
	avg_revenue DESC
;
728x90

'CODING PRACTICE > SQL' 카테고리의 다른 글

Basic__sqlite(1)  (0) 2025.02.25
반응형

테이블 생성

CREATE TABLE movies (
	title,
    released,
    overview,
    rating,
    director
);

 

테이블 삭제

DROP TABLE movies;

 

테이블에 데이터 삽입

-- 데이터값의 순서와 모든 데이터값이 존재함을 지켜야함

INSERT INTO movies VALUES (
  'movie_title',
  '1999',
  'good',
  '10/10',
  'who?'
);

 

-- 해당 데이터에만 값을 넣기
INSERT INTO movies (title) VALUES ('SINGLE_MOVIE_TITLE');
INSERT INTO movies (title,rating) VALUES ('SINGLE_MOVIE_TITLE no.2','8/10');

 

테이블 데이터 값에 타입지정 (SQLITE)

CREATE TABLE movies (
  title TEXT,
  released INTEGER, -- 1,2,3,4..
  overview TEXT,
  rating REAL, -- 1.1 , 2.8 , 3.6 ...
  director TEXT,
  adult INTEGER, -- sqlite에서 boolean을 넣기 위해서는 0,1 로 넣어 동작한다.
  forster BLOB, -- 데이터베이스에 이미지같은 파일을 저장하기 위해서는 BLOB을 사용한다.
);

 

테이블 데이터 값에 제약 넣기

CREATE TABLE movies (
  title TEXT UNIQUE NOT NULL,
  released INTEGER CHECK (released > 0), -- 1,2,3,4..
  overview TEXT NOT NULL CHECK(LENGTH(overview) < 100),
  rating REAL, -- 1.1 , 2.8 , 3.6 ...
  director TEXT NOT NULL,
  adult INTEGER NOT NULL DEFAULT 0 CHECK (adult = 0 OR adult = 1)
  -- adult INTEGER NOT NULL DEFAULT 0 CHECK (adult BETWEEN 0 AND 1)
);

INSERT INTO movies VALUES (
  'movie_title',
  1999,
  'good',
  9.7,
  'who?',
  1
);

INSERT INTO movies (title, overview, director, adult) VALUES 
	('SINGLE_MOVIE_TITLE','fine','thomas',0);

 

 

기본키(Primary Key)

기본키는 유니크해야하며 수정 불가해야한다.

기본키는 두가지 유형이 있는데 이는 기본기(Natural Primary Key) 대체 기본키 (Surrogate Primary key)가 있다.

자연 기본키는 테이블의 데이터와 논리적 관계를 갖는 기본키이다.

대체 기본키를 사용하는것을 추천

CREATE TABLE movies (
-- surrogate_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, --아래 데이터와 관련이 없다. 단지 고유식별자가 필요하기 때문이다.
  title TEXT UNIQUE NOT NULL PRIMARY KEY, -- natural키는 데이터와 연관이 있다.
.
.
.
);
728x90

'CODING PRACTICE > SQL' 카테고리의 다른 글

Basic_Sqlite(2)  (0) 2025.02.26
반응형

API 사용중 같은 값을 그룹화하면 좋을 것 같다는 생각을 간혹하게 되는데 이번 날씨 API를 사용하면서 그런생각이 들었다.

단기 예보를 불러오게 되면 거의 700개 이상의 object가 나온다.  각기 다른 날씨속성 12개의 카테고리로 한 줄씩 나오며 그 12개의 카테고리는 같은 예보시간이 들어있다. 

0: {baseDate: '20240922', baseTime: '2000', category: 'TMP', fcstDate: '20240922', fcstTime: '2100', …}
1: {baseDate: '20240922', baseTime: '2000', category: 'UUU', fcstDate: '20240922', fcstTime: '2100', …}
2: {baseDate: '20240922', baseTime: '2000', category: 'VVV', fcstDate: '20240922', fcstTime: '2100', …}
3: {baseDate: '20240922', baseTime: '2000', category: 'VEC', fcstDate: '20240922', fcstTime: '2100', …}
4: {baseDate: '20240922', baseTime: '2000', category: 'WSD', fcstDate: '20240922', fcstTime: '2100', …}
5: {baseDate: '20240922', baseTime: '2000', category: 'SKY', fcstDate: '20240922', fcstTime: '2100', …}
6: {baseDate: '20240922', baseTime: '2000', category: 'PTY', fcstDate: '20240922', fcstTime: '2100', …}
7: {baseDate: '20240922', baseTime: '2000', category: 'POP', fcstDate: '20240922', fcstTime: '2100', …}
8: {baseDate: '20240922', baseTime: '2000', category: 'WAV', fcstDate: '20240922', fcstTime: '2100', …}
9: {baseDate: '20240922', baseTime: '2000', category: 'PCP', fcstDate: '20240922', fcstTime: '2100', …}
10: {baseDate: '20240922', baseTime: '2000', category: 'REH', fcstDate: '20240922', fcstTime: '2100', …}
11: {baseDate: '20240922', baseTime: '2000', category: 'SNO', fcstDate: '20240922', fcstTime: '2100', …}
12: {baseDate: '20240922', baseTime: '2000', category: 'TMP', fcstDate: '20240922', fcstTime: '2200', …}
13: {baseDate: '20240922', baseTime: '2000', category: 'UUU', fcstDate: '20240922', fcstTime: '2200', …}
14: {baseDate: '20240922', baseTime: '2000', category: 'VVV', fcstDate: '20240922', fcstTime: '2200', …}
15: {baseDate: '20240922', baseTime: '2000', category: 'VEC', fcstDate: '20240922', fcstTime: '2200', …}
16: {baseDate: '20240922', baseTime: '2000', category: 'WSD', fcstDate: '20240922', fcstTime: '2200', …}
17: {baseDate: '20240922', baseTime: '2000', category: 'SKY', fcstDate: '20240922', fcstTime: '2200', …}
18: {baseDate: '20240922', baseTime: '2000', category: 'PTY', fcstDate: '20240922', fcstTime: '2200', …}
19: {baseDate: '20240922', baseTime: '2000', category: 'POP', fcstDate: '20240922', fcstTime: '2200', …}
20: {baseDate: '20240922', baseTime: '2000', category: 'WAV', fcstDate: '20240922', fcstTime: '2200', …}
21: {baseDate: '20240922', baseTime: '2000', category: 'PCP', fcstDate: '20240922', fcstTime: '2200', …}
22: {baseDate: '20240922', baseTime: '2000', category: 'REH', fcstDate: '20240922', fcstTime: '2200', …}
23: {baseDate: '20240922', baseTime: '2000', category: 'SNO', fcstDate: '20240922', fcstTime: '2200', …}
24: {baseDate: '20240922', baseTime: '2000', category: 'TMP', fcstDate: '20240922', fcstTime: '2300', …}
25: {baseDate: '20240922', baseTime: '2000', category: 'UUU', fcstDate: '20240922', fcstTime: '2300', …}
26: {baseDate: '20240922', baseTime: '2000', category: 'VVV', fcstDate: '20240922', fcstTime: '2300', …}
27: {baseDate: '20240922', baseTime: '2000', category: 'VEC', fcstDate: '20240922', fcstTime: '2300', …}
28: {baseDate: '20240922', baseTime: '2000', category: 'WSD', fcstDate: '20240922', fcstTime: '2300', …}
29: {baseDate: '20240922', baseTime: '2000', category: 'SKY', fcstDate: '20240922', fcstTime: '2300', …}
30: {baseDate: '20240922', baseTime: '2000', category: 'PTY', fcstDate: '20240922', fcstTime: '2300', …}
31: {baseDate: '20240922', baseTime: '2000', category: 'POP', fcstDate: '20240922', fcstTime: '2300', …}
32: {baseDate: '20240922', baseTime: '2000', category: 'WAV', fcstDate: '20240922', fcstTime: '2300', …}
33: {baseDate: '20240922', baseTime: '2000', category: 'PCP', fcstDate: '20240922', fcstTime: '2300', …}
34: {baseDate: '20240922', baseTime: '2000', category: 'REH', fcstDate: '20240922', fcstTime: '2300', …}
35: {baseDate: '20240922', baseTime: '2000', category: 'SNO', fcstDate: '20240922', fcstTime: '2300', …}

 

이것을 새로 배열을 구성하기 위해서 forEach문을 사용하였다.

일단 빈배열을 만들어주고 그 배열에 구성을 해주고 리턴해주면 된다. 

import type {
  INewForeCastType,
  IWeatherTodayTomorrowTypes,
} from "~/types/apiType";

export const createNewArr = ({
  data,
  newWeatherData,
}: {
  data: IWeatherTodayTomorrowTypes[];
  newWeatherData: globalThis.Ref<INewForeCastType[]>;
}) => {
  const newArr: INewForeCastType[] = [];
  data.forEach(({fcstTime, category, fcstValue}) => {
    let exist = newArr.find((entry) => entry.fcstTime === fcstTime);

    if (!exist) {
      exist = {
        fcstTime: fcstTime,
      };
      newArr.push(exist);
    }
    if (category === "POP") {
      exist.POP = fcstValue;
    }
    if (category === "PCP") {
      exist.PCP = fcstValue;
    }
    if (category === "PTY") {
      exist.PTY = fcstValue;
    }
    if (category === "REH") {
      exist.REH = fcstValue;
    }
    if (category === "SKY") {
      exist.SKY = fcstValue;
    }
    if (category === "SNO") {
      exist.SNO = fcstValue;
    }
    if (category === "TMP") {
      exist.TMP = fcstValue;
    }
    if (category === "UUU") {
      exist.UUU = fcstValue;
    }
    if (category === "VEC") {
      exist.VEC = fcstValue;
    }
    if (category === "VVV") {
      exist.VVV = fcstValue;
    }
    if (category === "WAV") {
      exist.WAV = fcstValue;
    }
    if (category === "WSD") {
      exist.WSD = fcstValue;
    }
  });
  return (newWeatherData.value = newArr);
};

 

 

728x90
반응형

ListView

리스트를 만들 수 있는 위젯이다. ListTile이라는 자식들을 둘수 있다. ListView.seperator로 줄로 나누어진 리스트도 만들수 있다.

ListTile

 ListTile(
            leading: Container(
              width: Sizes.size40,
              decoration: const BoxDecoration(
                  shape: BoxShape.circle, color: Colors.blue),
            ),
            title: const Text(
              "New Fallowers",
              style: TextStyle(fontWeight: FontWeight.w600),
            ),
            subtitle: const Text("Messages from followers will appear here"),
            trailing:
                const FaIcon(FontAwesomeIcons.chevronRight, size: Sizes.size16),
          ),

 

RichText

텍스트 내부에 택스트를 주기위한 방법 중 하나

RichText(
                text: const TextSpan(
                  text: "Account Updates:",
                  style: TextStyle(
                    fontWeight: FontWeight.w700,
                    color: Colors.black,
                  ),
                  children: [
                    TextSpan(
                      text: "Upload Longer Video",
                      style: TextStyle(fontWeight: FontWeight.normal),
                    ),
                  ],
                ),
              ),

 

반응형

Dismissible

리스트의 좌우 액션에 대한 내용

for (var notification in _notifications)
            Dismissible(
              key: Key(notification),
              onDismissed: (direction) => _onDismissed(notification),
              background: Container(
                alignment: Alignment.centerLeft,
                color: Colors.green,
                child: const Padding(
                  padding: EdgeInsets.symmetric(horizontal: 10),
                  child: FaIcon(
                    FontAwesomeIcons.checkDouble,
                    color: Colors.white,
                    size: Sizes.size32,
                  ),
                ),
              ),
              secondaryBackground: Container(
                alignment: Alignment.centerRight,
                color: Colors.red,
                child: const Padding(
                  padding: EdgeInsets.symmetric(horizontal: 10),
                  child: FaIcon(
                    FontAwesomeIcons.hammer,
                    color: Colors.white,
                    size: Sizes.size32,
                  ),
                ),
              ),
              child: ListTile(

 

RotationTrainsition & SlideTransition

animation을 주기 위해 animationController를 변수에 담아 init해주는데 보통 init을 하기위해 inintState(){}를 사용하는데 late를 사용하면 initState 내부에서 하지 않아도 된다.

Tween은 애니메이션의 정도를 담당한다. begin과 end값을 주고 animate를 해주면된다.

 

AnimatedModalBarrier

modal을 만들고 그에 따른 배경에 장막같은 것을 만들 수 있다.

if (_showBarrier)
            AnimatedModalBarrier(
              color: _barrierAnimation,
              dismissible: true,
              onDismiss: _toggleAnimation,
            ),

 

728x90

'Dart & Flutter' 카테고리의 다른 글

Flutter__008  (0) 2024.08.26
Flutter__007  (0) 2024.08.21
Flutter__006  (0) 2024.08.20
Flutter__005  (0) 2024.08.20
Flutter__004  (0) 2024.08.18
반응형

16진수

컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수로 표현하는 경우가 많다. 컴퓨터에서 데이터를 처리하기 우해 16진수를 사용할 때 장점이 있기 때문이다. 16진수와 일상생활에서 우리가 사용하느 10진수와 비교하면 차이를 알수있는데 16진수를 사요하면 10진수보다 2진수를 간단하게 나타낼수 있다. 16진수로 값을 표현하는 방법을 이해하고 나면 16진수,2진수 ,10진수를 변환하는 프로그램을 만들어볼 수 있다. 

 

10진수를 16진수로 바꾸어보기

JPG이미지 파일은 항상 255 216 255로 시작되고 이것은 10진수이다. 하지만 실제 컴퓨터에서는 10진수를 사용하지 않는다. 컴퓨터는 0과 1만 이해할 수 있기 때문이다.

10진수 255 216 255
2진수  1111 1111
= f   =  f  
1101 1000
=. d  =.  8
1111 1111
16진수 0xff 0xd8 0xff

 

4bit씩 16진수로 변환 후 맨 앞에 0x를 붙어주면 그 문자는 16진수가 된다.

 

16진수의 유용성

ASCII코드에 의해 'A,B,C'는 10진수로 65, 66, 67에 해당이 된다. 컴퓨터는 10진수를 이해할 수 없으므로 2진수로 표현해보면 "01000001 010000010 01000011' 이된다. 하지만 16진루로 표현하면 2진수로 표현해 냈을때보다 더간단해진다. 또한 컴퓨터는 8개의 비트가 모인 바이트단위로 정보를 표현한다. 2개의 16진수는 결국 1byte의 2진수로 변환되기 때문에 매우 유용하다

  A B C
10진수 65 66 67
2진수  0100 0001 0100 0010 0100 0011
16진수 0x41 0x42 0x43

 

메모리 주소

정수형 변수 n에 50이라는 값을 저장하고 출력한다했을 때 n이라는 값은 int이므로 4바이트 만큼 메모리에 자리를 차지하고 있을 것이다.

C언어에서는 메모리상 주소를 받기 우해 & 연산자를 사용하는데 이를 출력해보면 '0x7ffe00b3adbc' 따위의 값을 얻을 수 있고 이는 16진법으로 표기된 메모리주소이다. *&을 함께 사용하면 실제 값을 얻게 된다. c나 c++ 과 같은 저수준 프로그래밍 언어만 메모리 주소를 얻을 수 있다.

#include <stdio.h>

int main(void)
{
    int n = 50;
    printf("%i\n", *&n);
}

포인터

포인터 역할을 변수를 만들 수 있는데 

#include <stdio.h>

int main(void)
{
   int n = 50;
   int *p = &n;
   printf("%p\n", p);
   printf("%i\n", *p);
}

 

n에는 50이라는 값을 저장하고 이를 &연산자를 통해 메모리 주소값을 얻을 수 있으며 이를 다시 *p라는 실제값으로 변환 시킬수있는 포인터를 만들 수 있다.

728x90
반응형

선택정렬

배열이 정렬되어있으면 정렬되지 않은 배열보다 더 쉽게 탐색할 수 있다. 정렬을 위한 알고리즘 중 선택정렬을 배열 안의 자료 중 가장 작은 수 (혹은 가장 작은 수)를 찾아 첫번째 위치(혹은 가장 마지막 위치)의 수와 교환해주는 방식의 정렬이다.

 

선택정렬은 교환회수를 최소화하는 바면 각 자료를 비교하는 횟수는 증가한다.

 

정렬 알고리즘 실행시간

실행시간의 상한

  • O(n^2) == 선택정렬, 버블정렬
  • O(n log n)
  • O(n) == 선형검색
  • O(log n) == 이진검색
  • O(1)

실행시간의 하한

  • Omega(n^2) == 선택정렬
  • Omega(n log n)
  • Omega(n) ==  버블정렬
  • Omega(log n)
  • Omega(1) == 선형검색, 이진검색

재귀

함수가 본인 스스로를 호출해서 사용할 수 있는지에 대해 의문을 가진다면 그 대답은 할 수 있으며 이를 재귀라고 부르며 재귀함수라 한다.

자바스크립트로 이해하기 쉽게 보자면 다음과 같다.

5의 #의 탑을  쌓는다 가정했을때

draw에 5를 기입하면 draw는 계속해서 스스로를 불러내며 5를 1씩 뺀며 0부터 5까지 #을 차례대로 쌓는데 5를 1씩 뺄때 음수가 되지 않게 0이되면 멈추게만들면 무한루프에도 빠지지 않게 된다.

function main() {
  const h = prompt("height");
  draw(h);
}
function draw(h) {
  if (h === 0) {
    return;
  }
  draw(h - 1);
  for (let i = 0; i < h; i++) {
    console.log("#");
  }
}
main();

 

병합정렬

병합정렬은 버블정렬이나 선택정렬 보다도 뛰어난 알고리즘이다.

원소가 하나가 될때까지 계속 반으로 나누다가 다시 합쳐나가며 정렬하는 방식이다. 계속 반으로 나눠야하기 때문에 재귀함수 또한 필요하다.

const arr = [5, 3, 2, 6, 1, 4, 7, 8, 9];

function merge(left, right) {
  const sortArr = [];
  let l = 0;
  let r = 0;
  while (l < left.length && r < right.length) {
    if (left[l] < right[r]) {
      sortArr.push(left[l]);
      l++;
    } else {
      sortArr.push(right[r]);
      r++;
    }
  }
  while (l < left.length) {
    sortArr.push(left[l]);
    l++;
  }
  while (r < right.length) {
    sortArr.push(right[r]);
    r++;
  }
  return sortArr;
}
function mergeSort(arr) {
  if (arr.length <= 1) return arr;

  const boundary = Math.floor(arr.length / 2);
  const leftArr = mergeSort(arr.slice(0, boundary));
  const rightArr = mergeSort(arr.slice(boundary));

  return merge(leftArr, rightArr);
}

console.log(mergeSort(arr));
7 | 4 | 5 | 2 | 6 | 3 | 8 | 1 → 가장 작은 부분 (숫자 1개)으로 나눠진 결과입니다.

4   7 | 2   5 | 3   6 | 1   8 → 숫자 1개씩을 정렬하여 병합한 결과입니다.

2   4   5   7 | 1   3   6   8 → 숫자 2개씩을 정렬하여 병합한 결과입니다.

1   2   3   4   5   6   7   8 → 마지막으로 숫자 4개씩을 정렬하여 병합한 결과입니다.

 

 

알고리즘을 설계할때 목표는 정확하게 만든것뿐만아니라 잘 설계하는 것이다.

728x90
반응형

showModalBottomSheet

모달을 보여주게 한다.

await와 함께 사용하면 모달이 닫힌경우 의 후의 동작을 구성할 수 있다.

 

TabBar

AppBar에는 bottom이라는 preferredSizeWidget라는 위젯을 사용할 수있다. preferredSize를 사용할 수 있지만 이미 preferredSize인 TabBar를 사용하면된다.

Scaffold(
        appBar: AppBar(
          title: const Text("SEARCH"),
          bottom: TabBar(
            splashFactory: NoSplash.splashFactory,
            tabAlignment: TabAlignment.start,
            padding: const EdgeInsets.symmetric(horizontal: Sizes.size10),
            isScrollable: true,
            labelColor: Colors.black,
            labelStyle: const TextStyle(fontWeight: FontWeight.w700),
            unselectedLabelColor: Colors.grey,
            indicatorColor: Colors.black,
            indicatorSize: TabBarIndicatorSize.tab,
            tabs: [
              for (var tab in tabs)
                Tab(
                  text: tab,
                ),
            ],
          ),
        ),
        body: TabBarView(children: [
          for (var tab in tabs)
            Center(
              child: Text(tab),
            )
        ]),
      ),

GridView & AspectRatio

TabBarView(children: [
          GridView.builder(
            itemCount: 22,
            gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2,
              crossAxisSpacing: Sizes.size10,
              mainAxisSpacing: Sizes.size10,
              childAspectRatio: 0.6,
            ),
            itemBuilder: (context, index) => Container(
              color: Colors.teal,
              child: Center(
                child: Text("$index"),
              ),
            ),
          ),

FadeInImage

.assetNetwork 

placeholder로 보여줄 이미지가 우리의 asset 폴더에 있을거라는것

itemBuilder: (context, index) => FractionallySizedBox(
                widthFactor: 1,
                heightFactor: 1,
                child: Column(
                  children: [
                    AspectRatio(
                      aspectRatio: 9 / 16,
                      child: FadeInImage.assetNetwork(
                          fit: BoxFit.cover,
                          placeholder: "assets/images/zzoo.jpg",
                          image:
                              ""),
                    ),
                    Gaps.v4,
                    const Text(
                      "",
                      maxLines: 2,
                      overflow: TextOverflow.ellipsis,
                    ),

 

DefaultTextStyle

같은 textStyle 자식들을 동일화하게 만들어준다.

 

728x90

'Dart & Flutter' 카테고리의 다른 글

Flutter__009  (0) 2024.08.29
Flutter__007  (0) 2024.08.21
Flutter__006  (0) 2024.08.20
Flutter__005  (0) 2024.08.20
Flutter__004  (0) 2024.08.18
반응형

알고리즘

배열은 한 자료형의 여러값들이 메모리상에 모여있는 구조이다.

컴퓨터는 이 값에 접근할 때 배열의 인덱스 하나하나 직접 접근한다. 

만약 원하는 값을 찾기 위해서 배열이 정렬되어있는지 여부에 따라 아래와 같은 방법을 사용할 수 있다.

 

알고리즘 표기법

Big O

위와 같은 그림을 고식으로 표기한 것이 Big O표기법이다. 여기서 O는 'on the order of' 의 약자로 쉽게 생각한다면, '~만큼의 정도로 커지는' 것이다.

Big O는 실행 시간의 상한을 나타낸다.

 

Big Ω

Big O의 반대의 개념이며 실행 시간의 하한을 나타낸다. 예를 들어 선형 검색는 n개의 항목이 있을 때, 최대 n번 검색을 해야 하므로 상한이 O(n)이 되지만 운이 좋다면 한번만에 검색을 끝낼수 있으므로 하한은 (1)가 됨.

 

 

선형 검색

배열의 인덱스를 처음부터 끝까지 하나씩 증가 시키면서 확인해 검사한다. 정확하긴하지만 매우 오래걸려 아주 효율적이지 못한 방법이다.

이진 검색

만약 배열이 검색되어 있다면 배열의 중간부터 찾고 계속 분할하여 반복해서 찾아낸다.

버블정렬

정렬 알고리즘 중 하나는 버블정렬이다. 버블정렬은 두 개의 인접한 자료값을 비교하면서 위치를 교환하는 방식으로 정렬하는 방법을 말한다. 버블 정렬은 단 두개의 요소만 정렬해주는 좁은 범위의 정렬에 집중한다. 

간단하지만 하나의 요소를 정렬하는데 너무 많은 교환이 생긴다.

728x90

+ Recent posts