반응형

문제

 

 

 

풀이

memo[n] = memo[n-1] + memo[n-2] *2

여기서 *2 하는 이유는
2*1 직사각형이 오는 경우와 2*2 직사각형이 오는 경우 2가지 이기 때문

 

 

 

코드

n = int(input())

if n == 1:
    print(1)
else:
    memo = [0 for i in range(n + 1)]
    memo[0] = 1
    memo[1] = 1
    for i in range(2, n + 1):
        memo[i] = memo[i - 1] + memo[i - 2] * 2
    print(memo[n] % 10007)

 

 

반응형
반응형

문제

 

풀이

2xn 사각형

n=1 이면 f(1) =1
n=2 이면 f(2) = 1 + f(1) = 2
n=3 이면 f(3) = f(2) +f(1) = 3
n=4 이면 f(4) = f(3) + f(2) = 5

점화식
f(n) = f(n-1) + f(n-2)

 

 

 

코드

n = int(input())

if n <= 2:
    print(n)
else:
    memo = [0 for i in range(n + 1)]
    memo[1] = 1
    memo[2] = 2
    for i in range(3, n + 1):
        memo[i] = memo[i - 1] + memo[i - 2]

    print(memo[n] % 10007)

이 문제도 역시 재귀로 하면 시간초과 발생

bottom up 방식으로 반복문 이용하여 풀어내기

반응형
반응형

문제

 

풀이

조건2) 크기를 쪼갤 수 있다.
조건1) 작은 문제들이 큰 문제의 답을 알려준다. == 어딘가에 메모해놓아야 효율적 (memorization)

점화식
f(1) = 0번
f(2) = 1번
f(3) = 1번
f(4) => 4/2 => 2/2 => 1 = 2번 [f(4) = 1 + f(2) = 2번]
f(5) = 5-1 => ... f(4)와 동일 [f(5) = 1 + f(4) = 3번]



정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
X가 3으로 나누어 떨어지면, 3으로 나눈다.
X가 2로 나누어 떨어지면, 2로 나눈다.
1을 뺀다.


점화식을 세워보면
f(n) = min(f(n/3)+1, f(n/2)+1, f(n-1)+1)

 

 

코드

n = int(input())
memo = [0] * (n + 1)

memo[1] = 0
for i in range(2, n + 1):
    memo[i] = memo[i - 1] + 1

    if (i % 2 == 0) and (memo[i] > memo[i // 2] + 1):
        memo[i] = memo[i // 2] + 1
    if (i % 3 == 0) and (memo[i] > memo[i // 3] + 1):
        memo[i] = memo[i // 3] + 1

print(memo[n])

재귀로 풀면 시간초과 발생

memorization 이용하여 배열에 작은 문제의 값들을 다 저장하고 큰 문제를 풀때 가져다 쓰기

반응형
반응형

 

 

평일

하루 1문제씩 풀기

 

주말

하루 2문제씩 풀기

 

순서는 정하지 않고 풀되, 같은 알고리즘은 연속으로 풀기

 

 

수학

문제 깃 링크 블로그 날짜
     
     
     
     
     
     
     
     
     

 

브루트포스

문제 링크 블로그 날짜
     
     
     
     
     
     
     
     
       
N과 M      
     
     
     
     
     
     
     
     
     
       
재귀      
     
     
     
     
     
     
     
       
순열      
     
     
     
     
     
     
       
비트마스크      
     
     
     
     

 

 

다이나믹 프로그래밍

문제 링크 블로그 날짜
https://github.com/yj0903/python_CodingTest/commit/4330a3e0060abfd62e537d5863f512a411f63ab5 https://develop-new.tistory.com/250 22.11.15
https://github.com/yj0903/python_CodingTest/commit/e0be7d7b13476fed7c681629258082100442a28c https://develop-new.tistory.com/251 22.11.15
https://github.com/yj0903/python_CodingTest/commit/4867f7969fefcfe103a74cb771e98bab1a3e9f38 https://develop-new.tistory.com/252 22.11.15
     
     
     
     
     
     
     
     
     
     
     
     

 

 

 

다이나믹프로그래밍 2

문제 링크 블로그 날짜
     
     
     
     
     
     
     
     
     
     
     

 

 

큐와 그래프

문제 링크 블로그 날짜
     
     
     
     
     
     
     
     
     
     

 

 

BFS

문제 링크 블로그 날짜
     
     
     
     
     

 

 

시뮬레이션과 구현

문제 링크 블로그 날짜
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
반응형
반응형

이벤트

웹 브라우저가 알려주는 HTML요소에 대한 사건 발생

사용자의 행동에 의해 발생하거나, 개발자가 의도한 로직에 의해 발생한다.

 

 

DOM 이벤트 종류

onClick - element 클릭을 감지

onChange - element 내용(input의 텍스트 변경, 파일선택 등) 변경 감지

onKeyDown, onKeyUp, onKeyPress - 키보드 입력을 감지

onDoubleClick - element를 더블클릭 했을 때

onFocus - element에 마우스가 포커스 됐을 때

onBlur - element가 포커스를 잃었을 때

onSubmit - 폼 element에서 제출했을 때

 

 

이벤트 핸들러 함수

발생된 이벤트를 자바스크립트를 이용해 대응할 수 있다. 

이벤트 핸들러 함수안에 다양한 로직을 처리하고, 그 결과를 사용자에게 출력하여 알릴 수도 있다.

 

 

이벤트 처리 방법

(1) 핸들링 함수를 선언

import React from 'react';

function App() {
	
  const handleChange = event => {		// 핸들링 함수를 선언
    console.log(event);
  };
  
  return (
    <div className="App">
      <input onChange={handleChange} />		// input element와 핸들링 함수를 연결
    </div>
  );
}

export default App;

 

(2) 익명함수를 선언

import React from 'react';

function App() {
  return (
    <div className="App">
        <input onChange={(event) => {			// 이벤트 익명함수로 작성
            console.log(event.target.value)
        }}/>
    </div>
  );
}

export default App;

 

 


 

컴포넌트 내 이벤트 처리

 

(1) DOM 버튼 클릭

DOM element의 클릭 이벤트를 전달받아 처리

// src/App.js 파일

import React from 'react';
import Greeting from './components/Greeting';
function App() {
  return (
    <div className="App">
      <Greeting />			// 컴포넌트 삽입
    </div>
  );
}

export default App;
// src/components/Greeting.js

import React from 'react';

const Greeting = () => {
  const handleClick = () => {						// 컴포넌트 내에 이벤트 정의
    alert('안녕하세요');
  };
  return <button onClick={handleClick}>클릭</button>;			// 컴포넌트 내 이벤트 처리
};

export default Greeting;

 

 

(2) event와 state 연동하기

React로 애플리케이션을 개발하다보면

실시간으로 사용자로부터 값을 전달받아 컴포넌트에 반영할 일이 많기 때문에

이벤트와 State는 뗄래야 뗄 수 없는 관계라고 할 수 있다.

import React, { useState } from 'react'; 		// state를 쓰기 위해 useState 추가

function App() {
  const [inputValue, setInputValue] = useState('');	// state는 반드시 한쌍으로 정의됨
  return (
    <div className="App">
      <input
        onChange={event => {
          setInputValue(event.target.value);		// state는 반드시 set으로 저장되어야 함.
        }}
      ></input>
      <span>{inputValue}</span>				// stat는 변수처럼 가져다 사용 가능
    </div>
  );
}

export default App;

event.target.value : event object의 target은 이벤트의 원인이 되는 element를 가리킨다.

 

 

(3) 한개의 이벤트 핸들러를 이용해 여러 element에 재사용하기

state를 여러 개 선언할 수도 있지만 object를 활용하여 여러개의 input을 state로 관리하는 방법이 있다.

 

import React, { useState } from 'react';
function App() {

  // state를 object로 선언
  const [person, setPerson] = useState({
    name: '김민수',
    school: '엘리스대학교',
  });

  // 이벤트 핸들러 선언
  const handleChange = event => {
    const { name, value } = event.target;
    setPerson(current => {
      const newPerson = { ...current };
      newPerson[name] = value;
      return newPerson;
    });
  };
  
  
  return (
    <div className="App">
      // element 2개(input name, input school)에서 같은 핸들러함수 호출 가능
      <input name="name" value={person.name} onChange={handleChange}></input>
      <input name="school" value={person.school} onChange={handleChange}></input>
      
      <button
        onClick={() =>
          alert(`${person.name}님은 ${person.school}에 재학 중입니다.`)
        }
      >
        클릭
      </button>
    </div>
  );
}

export default App;

 

 


컴포넌트 외부로부터 이벤트를 전달받아 처리하기

 

(1) 컴포넌트 간 이벤트 전달하기

부모 컴포넌트에서 생성된 이벤트 핸들링 함수를 자식 컴포넌트로 전달하여 처리할 수 있다

 

src/components 디렉토리를 생성하고 MyForm.js 파일을 생성합니다.
MyForm 컴포넌트를 선언합니다. 
이 컴포넌트는 onChange 라는 함수를 Props로부터 전달받습니다.
MyForm 컴포넌트에서 <input> element를 반환. 
생성한 input element에 Props로부터 전달받은 onChange 함수를 전달
App.js로 돌아와 MyForm 컴포넌트를 import합니다.
username state를 선언합니다. 초기값은 ""입니다.
className이 "App"인 div 안에 <h1> element를 생성하고 내용은 OOO님 환영합니다.가 출력되도록 합니다.
(OOO에는 username state가 대입돼야 합니다.)
<h1> element 아래에
// app.js 파일

import React, { useState } from 'react';
import MyForm from './components/MyForm.js';

function App() {
  const [username, setUsername] = useState('');
  return (
    <div className="App">
      <h1>{username}님 환영합니다.</h1>
      <MyForm
        onChange={event => {
          setUsername(event.target.value);
        }}
      />
    </div>
  );
} 

export default App;
// components/MyForm.js

import React from 'react';

const MyForm = ({ onChange }) => {
  return <input onChange={onChange} />;
};

export default MyForm;

 

(2) 커스텀 이벤트

단순히 DOM 이벤트를 활용하는 것을 넘어서 나만의 이벤트를 만들 수도 있다.

 

 

이벤트 명명법

직접 이벤트를 만들 때에는 이름을 자유롭게 설정할 수 있다.

보톤은 on+동사 또는 on+명사+동사 형태로 작성한다.

 

 

 

 

반응형

'프론트엔드 > react.js' 카테고리의 다른 글

[React.js] Form, State, CSS 이용한 To-Do-List  (0) 2022.11.21
[React.js] Hooks  (0) 2022.11.21
[React.js] State  (0) 2022.11.14
[React.js] Prop  (0) 2022.11.14
[React.js] JSX와 컴포넌트  (0) 2022.11.14
반응형

State란

State는 컴포넌트 내에서 유동적으로 변할 수 있는 값을 저장한다.

즉, State는 컴포넌트 내에서 지속적으로 변경이 일어나는 값을 관리하기 위해 사용

개발자가 의도한 동작에 의해 변할 수도 있고, 사용자 입력에 따라 변할 수 있다.

State값이 변경되어 재렌더링이 필요한 경우, 

React가 자동으로 계산하여 변경된 부분만을 렌더링한다.

 

- State값은 직접 변경해서는 안된다. setState로 변경하지 않는다면, 리액트가 변화를 인지하지 못한다.

- Object를 갖는 State를 만들 때, Object의 값을 변경하려면 새로운 객체를 만들어 수정해야 한다.

 

 

State 선언방법

(1) useState

import { useState } from "react";		// useState를 import 해야함

const App = () => {
    const [value, setValue] = useState(초기값);	// [stateName, setStateName]으로 선언
    return ...
}

 

(2) setState : 값 변경

const [value, setValue] = useState("");

setValue("안녕하세요");

 

 

지시사항

  1. React 패키지로부터 useState를 import 하세요.
  2. App 컴포넌트 내에 count state를 선언합니다. 초기값은 0입니다.
    const [count, setCount] = useState(0);
  3. className이 App인 div 안에 <span>과 <button>을 각각 작성하세요.
  4. 작성한 span element에 X회 클릭하였습니다. 라는 문구를 작성합니다. X에는 선언한 count가 들어가야합니다.
  5. 작성한 button에 onClick 이벤트 처리 함수를 작성합니다. click 시 setCount를 이용해 count가 1씩 증가할 수 있도록 합니다. 이벤트 처리 함수는 다음과 같이 작성합니다.
import React, { useState } from 'react';

function App() {
  //  [stateName, setStateName]으로 선언
  const [count, setCount] = useState(0);

  return (
    <div className="App">
      <span>{count}회 클릭하였습니다.</span>
      <button
        onClick={() => {
          setCount((current) => {
            return current + 1;
          });
        }}
      >
        클릭
      </button>
    </div>
  );
}

export default App;

 

 


 

Object를 갖는 State

State는 string과 number 뿐만 아니라 object나 array도 값으로 할당할 수 있습니다.
그러나 object나 array의 값을 변경하기 위해서는 주의해야할 점이 있습니다.
바로 object나 array 내부의 값만 변경할 경우 React가 새로운 값으로 변경된 것을 인지하지 못한다는 것인데요.
object나 array를 값으로 갖는 state를 다룰 때 어떻게 코드를 작성해야하는 지 알아봅시다.

 

잘못된 예

const App = () => {
    const [person, setPerson] = useState({
        name: "민수",
        age: 23
    });
    .
    .
    .
    setPerson((current) => {
        current.age = 24;
        return current;
    })
}

위 예시의 코드를 실행할 경우 state가 변경되더라도 컴포넌트가 다시 렌더링되지 않습니다. 이유는 person 내부의 값은 변경되었지만 person 자체가 변경된 것은 아니기 때문이죠.
예를 들어 박스 안에 사과가 있는데 이 사과를 꺼내고 배를 넣었다고 해서 박스는 바뀌지 않는 것 처럼요. React는 박스 자체가 바뀔 경우에만 변경을 인지하고 다시 렌더링을 하게 됩니다.

 

올바른 예

const App = () => {
    const [person, setPerson] = useState({
        name: "민수",
        age: 23
    });
    .
    .
    .
    setPerson((current) => {
        const newPerson = {...current}; // Spread syntax(전개구문)를 이용해 object를 복사했습니다.
        newPerson.age = 24;
        return newPerson;
    })
}

 

 

 


import React, { useState } from 'react';

function App() {
  const [person, setPerson] = useState({
    name: '김민수',
    count: 0,
  });
  return (
    <div className="App">
      <button
        onClick={() => {
          setPerson(current => {
            const newPerson = { ...current };
            newPerson.count = newPerson.count + 1;
            return newPerson;
          });
        }}
      >
        클릭
      </button>
      <span>{person.name}님이 버튼을 {person.count}회 클릭하였습니다.</span>
    </div>
  );
}

export default App;
반응형

'프론트엔드 > react.js' 카테고리의 다른 글

[React.js] Hooks  (0) 2022.11.21
[React.js] 이벤트 처리  (0) 2022.11.15
[React.js] Prop  (0) 2022.11.14
[React.js] JSX와 컴포넌트  (0) 2022.11.14
[React.js] 리액트 프로젝트 생성  (0) 2022.11.14
반응형

Props

컴포넌트에 원하는 값을 넘겨줄 때 사용.

컴포넌트를 활용할 때 부모 Element로부터 자식 Element로 데이터를 전달해 주기 위해서 사용된다.

변수, 함수, 객체, 배열 등 자바스크립트의 요소라면 제한이 없다.

주로 컴포넌트의 재사용을 위해 사용한다.

Props가 변경되면 컴포넌트가 다시 렌더링된다.

부모 컴포넌트로부터 전달받은 Props를 임의로 재할당해서 사용할 경우 컴포넌트를 렌더링할 때 문제가 발생할 수 있다.

<input> element의 기본값은 defaultValue, defaultChecked로 설정합니다.

 

* Props는 읽기 전용

 

 

Prop 활용한 component

// App.js

import React from 'react';
import Greeting from './components/Greeting';
function App() {
  return (
    <div className="App">
      <Greeting username="김민수" />		// 컴포넌스 사용. props 함께 전달
    </div>
  );
}

export default App;
// component/Greeting.js

import React from 'react';

const Greeting = (props) => {			// props 전달받음
  const { username } = props;			// Destructuring assignment(구조 분해 할당)
  return <h1>{username}님 안녕하세요.</h1>;
};

export default Greeting;

 

 


Object를 전달받는 component

Props를 객체로 전달받을 수 있음.

 

// src/components/Student.js

import React from 'react';

const Student = ({ student }) => {
  const strPass = student.score >= 80 ? 'PASS' : 'FAIL';		//삼항연산자
  return (
    <div>
      {student.name} 학생은 {student.subject} 수업을 수강중입니다.
      <br />
      현재 점수는 {student.score}점으로 {strPass}입니다.
    </div>
  );
};

export default Student;

 

// App.js

import React from 'react';
import './App.css';
import Student from './components/Student.js';

function App() {
  const student1 = {
    name: '김민수',
    subject: '수학',
    score: 88,
  };
  const student2 = {
    name: '홍길동',
    subject: '영어',
    score: 72,
  };

  return (
    <div className="App">
      <Student student={student1} />		// props가 객체인 경우 중괄호 필수
      <Student student={student2} />
    </div>
  );
}

export default App;
반응형

'프론트엔드 > react.js' 카테고리의 다른 글

[React.js] 이벤트 처리  (0) 2022.11.15
[React.js] State  (0) 2022.11.14
[React.js] JSX와 컴포넌트  (0) 2022.11.14
[React.js] 리액트 프로젝트 생성  (0) 2022.11.14
[React.js] SPA, 리액트란 무엇인가  (0) 2022.11.14
반응형

 


JSX

 

JSX (Javascipt XML)

함수 호출과 객체 생성을 위한 문법적 편의를 제공하는 Javascript의 확장 개념

HTML과 비슷하게 생겼지만 Javascript의 속하며, HTML과 다른 부분도 있음.

JSX는 컴포넌트를 구성하기 위해 사용한다.

실제로 배포할 때에는 Trans compile이 되어 JavaScript로 변환된다.

  

JSX 장점

1. 개발자 편의성 향상

2. 협업에 용이, 생산성 향상

3. 문법 오류 감소, 코드량 감소

4. HTML 태그 내에서 Javascript 연산이 가능함

 

 

JSX와 HTML의 차이점

1. class 대신 className

- <p className="p tag"> ... </p>

 

2. 스타일은 Object로 넣어야 해서 < ... style = {{ padding: 10 }}>

- 첫번째 중괄호 : 자바스크립트 시작과 끝을 의미

- 두번째 중괄호: 자바스크립트 object의 시작과 끝을 의미

 

3. 닫는 태그가 필수 (br, img, input까지도)

- <input type = "text" />

 - <br />

 

4. 최상단 element는 반드시 하나여야 함

 

 

 

예제 코드

import React from 'react';
import './App.css';

function App() {
  return (
    <div className="App">		//최상단 element는 1개, class 대신 className
      <div
        style={{			// 스타일은 {{ }} 안에
          padding: '48px',		// ; 세미콜론 아님, 콤마
          backgroundColor: 'blue', 	// background-color 아님 backgroundColor 맞음
          color: 'red',
        }}
      >
        안녕하세요.
      </div>
    </div>
  );
}

export default App;

 

 

 

 


컴포넌트

 

컴포넌트

1. react에서 페이지를 구성하는 최소 단위

2. component의 이름은 대문자로 시작

3. Class component, Function component(함수형태의 컴포넌트)로 나뉜다.

4. Controlled Component:데이터를 state로 관리 

    Uncontrolled Component : 필요한 데이터를 elemenet에서 가져옴

5. props: 자식element는 상위 부모 element에서 데이터를 받아 사용

 

즉,

컴포넌트 끼리 데이터를 주고 받을 때 Props

컴포넌트 내에서 데이터를 관리할 때 State

데이터는 부모에서 자식으로 전달된다.

 

예제 코드

./components/Welcome.js


import React from "react";

const Welcome = () => {
    const username= "철수"
    return <h1>{username}님 안녕하세요.</h1>
}

export default Welcome;
src/App.jsx


import React from 'react';
import './App.css';
import Welcome from './components/Welcome';

function App() {
  return (
    <div className="App">
      <Welcome />
    </div>
  );
}

export default App;

 

 

 


CDN

 

Contents Delivery Network

지리적, 물리적으로 떨어져 있는 사용자에게 컨텐츠 제공자의 컨텐츠를 빠르게 제공할 수 있는 기술

- 온라인 콘텐츠 빠르게 전송 가능

- 시스템을 정상적으로 사용 가능한 정도가 높다.

- 외부의 다양한 공격을 방지한다.

 

index.html 파일 내 head 태그 내에 아래 React와 ReactDom에 대한 CDN을 연결하는 코드

    <!-- CDN 연결을 통해 React를 사용할 수도 있습니다. -->
    <script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>

 

 

 

 

반응형

'프론트엔드 > react.js' 카테고리의 다른 글

[React.js] 이벤트 처리  (0) 2022.11.15
[React.js] State  (0) 2022.11.14
[React.js] Prop  (0) 2022.11.14
[React.js] 리액트 프로젝트 생성  (0) 2022.11.14
[React.js] SPA, 리액트란 무엇인가  (0) 2022.11.14

+ Recent posts