D+19

와 1월의 마지막 날....

너무나 금방갔지만 그래도 나름 열심히 살았던 한달..일걸..>?....ㅋㅎㅋㅎ


API란?

Application Programming Interface의 약자로 운영체제가 응용프로그램을 위해 제공하는 함수의 집합으로 응용프로그램과 디바이스를 연결해주는 역할을 한다. 다시 말해, 특정 시스템을 프로그래밍하기 위한 함수의 집합을 말한다.

SDK란?

Software Development Kit의 약자로 소프트웨어를 개발하는 도구이다. 윈도우즈용 프로그램 개발킷을 의미하지만 지금은 API와 같은 의미로 쓰인다.



<자바스크립트에서 구글 로그인으로 인증하기>

firebase 자바스크립트 SDK로 로그인 과정을 처리하는 것이 가장 쉬운 사용자 인증 방법이다.

1) google 제공업체의 객체의 인스턴스를 생성한다.

1

2

var auth = firebase.auth();

var authProvider = new firebase.auth.GoogleAuthProvider();

cs


2) 인증제공업체(구글)에 요청하고자 하는 OAuth 2.0 범위를 지정한다. 범위를 지정하기 위해서는 addScope를 사용한다.

  • 범위 = Scope(해당 resource server에서 필요한 기능들을 말한다)

1

provider.addScope('https://www.googleapis.com/auth/contacts.readonly');

cs

위와 같은 방식으로 사용하며, 여러가지 기능들이 있다.

3) OAuth과정을 현지화 하려면 OAuth 과정 전에 인증 인스턴스의 언어 코드를 업데이트 한다.

1

firebase.auth().languageCode = 'pt';

cs

브라우저를 디폴트로 선호하는 언어로 설정한다.

4) 구글 제공업체 객체를 통해서 firebase에 인증한다. 팝업창을 띄우거나 로그인 페이지로 리디렉션 하여 사용자가 구글 계정에 로그인하도록 유도한다.

  • 팝업창을 띄우려면 signInWithPopup()을 사용한다.

  • 이를 통해 구글 액세스 토큰을 얻을 수 있다.

  • 오류가 생겼을 때에도 어떻게 할 것인지 결정해 준다.

  • firebase.auth.AuthCredential 타입은 인증 공급자(구글)가 반환한 자격증명을 나타내는 인터페이스이다. 구현은각 인증 공급자가 자격 증명 요구사항에 대한 세부정보를 지정한다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

auth.signInWithPopup(authProvider).then(function(result) {

   // 구글 액세스 토큰을 얻어 구글 api에 접근이 가능하다.

   var token = result.credential.accessToken;

   // 사용자 정보로 signed-in
   var user = result.user;

   // ...

}).catch(function(error) {

   // 에러가 났을 때

   var errorCode = error.code;

   var errorMessage = error.message;

   // 이메일 계정이 이미 사용되었을 때

   var email = error.email;

   var credential = error.credential;

});



  • 리디렉션 하려면 signInWithRedirect()을 사용한다. 이를 통해 로드가 완료되면 getRedirectResult 통해 토큰을 가져온다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

auth.getRedirectResult().then(function(result) {

 if (result.credential) {

   // This gives you a Google Access Token. You can use it to access the Google API.

   var token = result.credential.accessToken;

   // ...

 }

 // The signed-in user info.

 var user = result.user;

}).catch(function(error) {

 // Handle Errors here.

 var errorCode = error.code;

 var errorMessage = error.message;

 // The email of the user's account used.

 var email = error.email;

 // The firebase.auth.AuthCredential type that was used.

 var credential = error.credential;

 // ...

});r






자바스크립트 공부도 많이 해야할 것 같다.

  • 프로토타입

  • 클릭이벤트

  • 함수


'동계현장실습' 카테고리의 다른 글

19.02.12 화요일  (0) 2019.02.13
19.02.11 월요일  (0) 2019.02.12
19.01.30 수요일  (0) 2019.01.30
19.01.29 화요일  (0) 2019.01.30
19.01.28 월요일  (0) 2019.01.28


오늘은 좀 많이 쉬운 문제를 가지고 왔다. 정렬할 숫자 갯수(n)를 먼저 입력 받고 그 다음 숫자를 무작위로 n개 만큼 입력 받은 후 그 숫자들을 오름차순으로 정렬하는 문제이다!


n개의 숫자들은 배열에 입력 받아 저장하였다.

그 배열은 크기를 알 수 없기 때문에 동적할당을 해주었당.

malloc을 사용하는게 좋을 것 같아서 일부러 자주 사용하려고 노력하는 편이다...

내가 잘 알고 그런건 아니지만 무조건 arr[1000]이런식으로 해 주는 것 보다는 동적할당을 통해서 크기를 먼저 할당해주고 나중에 해제하는 방식이 나은 것 같아서 일부러 신경써서 더 사용해 주려고 한다(이게 맞는 건지는 잘 모르겠지만 ㅎ)


여튼 알고리즘은

0번 부터 n-2번째까지 n-1번을 반복을 하는데, 무엇을 반복하느냐하면,

1번 부터 n-1번째(배열의 맨 마지막) 저장 된 숫자를 비교한다.

아래 그림과 같이 하면 된다!

아래 그림이 0번째부터 n-2번까지 반복하는 것 중 한 번(분홍색 한 번)을 완료한 것이다.


다시 말해 0번 인덱스1번부터 n-1번까지의 인덱스와 비교 한다.

다음은 1번 인덱스2번부터 n-1번까지의 인덱스와 비교한다.

그 다음은 2번 인덱스3번부터 n-1번까지의 인덱스와 비교한다.


이렇게 반복해서 마지막으로

n-2번 인덱스n-1번 인덱스와 비교한다.


비효율적이다.

비효율적이지만 코드는 쉽다.

여튼 나는 이렇게 무식한 알고리즘으로 풀었다ㅋㅎㅋㅎ


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int n;
    scanf("%d"&n);
    int *arr=(int*)malloc(n*sizeof(int)); 
    for (int i = 0; i < n; i++)
        scanf("%d"&arr[i]);
    for (int i = 0; i < n-1; i++) {
        for (int j = i + 1; j < n; j++)
            if (arr[i] > arr[j]) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
    }
    for (int i = 0; i < n; i++)
        printf("%d\n", arr[i]);
    free(arr);
}
cs


정렬문제가 두 개가 더 있는데 다음엔 이런 무식한 방법으루다가 말구~

다른 방식으로 풀이해보겠담~!

D+18

오늘은 각잡고 firebase공부했다.

영상 보고 따라했는데 중간에 막힘 ㅠㅠ 짜증나ㅠㅠㅠㅠㅠㅠㅜㅠㅜㅠㅜ

언제 쯤 완벽하게 이해할 수 있을런지

그래서 막히기 전까지 공부한 부분 정리했다.

정리 다 하고 보니 내용이 얼마 안 된다,,, 막혀서 어버버만 몇 시간 동안 했나보다


<firebase공부>


* firebase를 사용하지 않을 경우의 구조 : 기획/설계 - 서버 구성 및 서버 개발 - 프론트 엔드 개발 - 테스트 디버그 및 릴리즈

* firebase를 도입한 후 : 기획/설계 - firebase - 프론트 엔드 개발 - 테스트 디버그 및 릴리즈

> firebase를 통해 백엔드 개발의 부담을 줄이고 시간도 줄일 수 있다.


1. firebase사용

<firebase 홈페이지 화면>

프로젝트 명과 국가 설정 후 프로젝트를 생성할 수 있다.

Authentication은 사용자 인증을 설정하는 메뉴이다. Authentication의 사용자 메뉴에서는 내가 만든 홈페이지에서 어떤 계정이 로그인을 할 수 있도록 승인이 되었는지 저장이 되는 곳이다. 로그인 방법 메뉴에서는 로그인 제공 업체를 선택할 수 있는데, 어떤 홈페이지(google, facebook twitter 등)로 인증해서 로그인 할 것인지를 선택할 수 있다. 여기서는 구글만 사용하도록 설정하였다. 그 아래에 있는 승인된 도메인 파트는 OAuth기능을 사용할 때 리다이렉션 되는 주소를 저장한다. 이는 승인된 도메인만 지정이 가능하다. 그 다음 템플릿 메뉴에서는 이메일과 비번을 이요해서 인증을 하는 사용자들에게 인증이 가능한 이메일을 저장할 수 있도록 하는 곳이다. 이메일 주소를 user가 기입하면 그 이메일이 유효한 이메일인지 인증메일을 보내는 템플릿을 저장할 수 있다.


firebase의 Database는 실시간 클라우드 호스팅 DB이다. 모두 json형태로 저장되며, 연결되어 있는 모든 클라우드에 실시간으로 동기화가 된다. 데이터 메뉴에서는 DB에 데이터를 저장함으로서 실시간으로 동기화를 시킨다. 규칙 메뉴에서는 해당 DB의 읽기/쓰기의 권한 규칙과 데이터 구조를 알 수 있다. 사용량 메뉴에서는 실시간 DB로 전송된 용량을 알려주며, 백업 메뉴에는 하루에 한 번 자동으로 백업해주는 기능이 있다.


2. 개발환경 구성

node.js + firebase CLI를 사용하는데, 이는 컴퓨터와 firebase를 연결하고 프로젝트에 대한 엑세스를 허용한다. 또한 npm에서 firebase모듈을 설치해야 하며 firebase login을 통해 컴퓨터와 firebase를 연결하고 프로젝트에 대한 엑세스를 허용한다. 그 후 firebase init을 통해서 firebase를 초기화 해주는데, 이 과정에서 database와 hosting을 선택하여 필요한 파일과 폴더를 생성하여 준다. 이 파일들 중에서 database.rule.json파일은 firebase의 기본 DB정책이 들어있고, firebas.json는 firebase환경설정 파일이다.

이를 다 마친상태에서 firebase sever를 통해 서버를 켜면 포트 번호 5000으로 localhost에 들어갈 수 있다.


3. 구현(메모 앱 구현하기)

* 구현할 기능 *

1) 인증 기능을 이용한 구글창 호출

2) 인증에 성공했을 경우에는 메모 리스트를 출력, 실패했을 경우에는구글창을 다시 호출

3) 메모 저장 기능

4) 메모 수정/삭제 기능

이 코드를 public폴더 안의 index.html파일에 붙여넣는다. 이 코드 아래에 아래 코드를 작성하여 주는데, 이는 팝업창을 통해서 구글로 로그인을 할 것인지의 여부를 물어본다.

1

2

3

4

var auth;

auth = firebase.auth();

var authProvider = new firebase.auth.GoogleAuthProvider();

auth.signInWithPopup(authProvider);


auth는 firebase에서 인증 객체를 담아둘 변수를 말하며 구글 계정으로 액세스할 것이기 때문에 GoogleProvider()로 써주었다. Twitter일 경우에는 TwitterAuthProvider()이 되고, facebook일 경우에는 FacebookAuthProvider()이 된다.

<팝업창>



'동계현장실습' 카테고리의 다른 글

19.02.11 월요일  (0) 2019.02.12
19.01.31 목요일  (0) 2019.01.31
19.01.29 화요일  (0) 2019.01.30
19.01.28 월요일  (0) 2019.01.28
19.01.25 금요일  (0) 2019.01.25

D+17


어제에 비해 한 게 없음

firebase사용을 도대체 어떻게 하는지 모르겠다...

오늘 다시 제대로 공부해야겠답



1. OAuth 개념 동영상 마저 보기(API부터)

2. Firebase란 무엇인가 공부하기

3. OAuth기능 사용해보기(예시 찾기)


1. OAuth 이어서 정리

    • refresh token : access token은 수명이 존재한다. 따라서 수명이 끝날 때마다 다시 발급 받아야 하는데, 그 때마다 손쉽게 발급 받을 수 있도록 하는 것이 refresh token이다. 여러가지 방식이 존재하지만, 간단히 설명하자면 refresh token은 보통 access token이 발급될 때 같이 발급이 되는데, access token의 수명이 끝나면 그 때에 refresh token을 통해 resource server에 접근할 수 있다. 사용하는 서버마다 refreshing하는 방법은 다르기 때문에 refresh token을 발급하는 방법, 사용하는 방법 등은 다 다를 수 있다.


2. OAuth+firebase

    • resource server에 접근 권한 인증을 요청하거나 발급 받은 access token을 보관하고 쉽게 개발할 수 있으며, 관리자 콘솔까지 제공하는 것이 firebase이다.

    • const auth = firebase.auth();

- firebase인증과 자바스크립트 sdk로 작업을 할 때 auth 네임 스페이스를 이용하여 작업을 한다. 이는 사용자들이 로그인하는데 필요한 모든 권한 메소드를 반환한다.

    • auth.signInWithEmailAndPassword(email, pass);

- 사용자가 이메일과 비밀번호로 로그인하도록 하기 위한 메소드이다. 이것이 하는 일은 기존의 사용자가 로그인하고 개발자가 처리할 수 있도록 프로미스를 제공한다.

    • auth.createUserWithEmailAndPassword(email, pass);

- 회원가입이 안 되어 있을 때에는 회원가입을 하도록 해야한다.

    • 위 두 메소드는 비동기로 사용자의 데이터를 처리하도록 허용한다.

    • 인증상태가 감시되도록 하기 위해서는 auth.onAuthStateChange(firebaseUser => { });를 사용한다. 이는 콜백함수를 포함한다. 이는 매번 인증상태가 변경될때마다 적용된다. (로그인/로그 아웃 상태일 경우) 로그인 상태일 경우 firebaseUser은 현재의 사용자 정보로 이동될 것이다. 로그아웃상태일때에는 firebaseUser매개변수는 NULL이 될 것이다.

    • 앱을 배포하기 위해서는 npm에 firebase-tools를 설치해야 한다(firebase login도 해야함)



'동계현장실습' 카테고리의 다른 글

19.01.31 목요일  (0) 2019.01.31
19.01.30 수요일  (0) 2019.01.30
19.01.28 월요일  (0) 2019.01.28
19.01.25 금요일  (0) 2019.01.25
19.01.24 목요일  (0) 2019.01.24

D + 15

음 오늘 드디어 일을 받았당
새로운거 공부하기,,,
다이나모디비 공부,,, 하다가 갑자기
firebase에서 OAuth 쓰는 법 공부하래소,, 중간에 OAuth 겁나 열심히 공부함ㅋㅋㅋ


      1. NoSQL이 뭔지 조사&공부하기

      2. dynamoDB 공부하기

      3. docker 사용법 공부하기

      4. dynamoDB 튜토리얼 하기

      5. firebase이 뭔지 조사&공부하기

      6. Oauth 조사&공부하기

      7. firebase-oauth 구현 예제


      1. NoSQL

      1. SQL과 NoSQL의 차이

        1. SQL은 관계형 DB라고 부르기도하며, NoSQL은 Not Only SQL이라는 의미로, 관계형 테이블인 SQL과는 저장을 위한 매커니즘이 다르다.

        2. 관계형DB는 Scale-up의 형태로 DB를 만들고, NoSQL은 Scale-out의 형태로 DB를 만든다. 즉, 관계형DB는 추가적인 내용이 있을 때 기존의 DB에 덧붙여 DB의 덩치가 커지는 형식이고, NoSQL은 추가적인 내용이 있을 때 새로운 DB 시스템을 추가하는 형식이다. 그렇기 때문에 데이터의 양이 급격하게 늘어나거나, 시스템이 자주 바뀌는 구조일 때에는 NoSQL을 사용하는 것이, 시스템이 정적일 때에는 관계형 DB를 사용하는 것이 효율적이라고 볼 수 있다.


      <https://brunch.co.kr/@kooslab/181>보면서 공부한 내용을 바탕으로 정리 하였습니다.


      1. 비관계형 분산 저장 시스템이다.

      2. NoSQL은 단순 검색 및 추가 작업에 있어서 최적화 된 키 값 저장 기법을 사용하기 때문에 응답 속도나 처리 효율이 뛰어나다.

      3. 대량 데이터를 동시에 처리가 가능하다.

      4. MongoDB는 Document Store 방식을 사용하고 DynamoDB는 Key-Value Store 방식을 사용한다.

      2. DynamoDB

      1. 데이터베이스 적용하기까지 시간이 적게 걸려서 배포와 확장이 단순하고 빠르다.

      2. 데이터가 자동으로 복제된다.

      3. 보조 인덱스를 통해 조회가 빠르며 응답시간이 빠르다.

      4. 구조

        1. Table

          1. item들을 저장하는 곳을 말한다.

          2. 테이블 크기에 제한이 없다.

          3. 기본키를 반드시 지정해야 한다.

        2. Item

          1. attribute들의 모임을 말한다.

          2. 기본키는 필수로 포함되어 있어야 한다.

        3. Attribute

          1. name과 value를 가진다.

          2. key-value 방식이며 key는 문자열이다.

          3. 스칼라 데이터 형식(String, Number, Binary)과 다중 값 형식(스칼라 데이터 형식의 배열Set)을 지원한다.

      5. 로직

        1. 기본키 형식

          1. 기본키는 테이블이 생성될 때 무조건 지정 되어야하고, 이를 통해 DB에서 검색이 가능하다.

            1. Hash 형식 기본키 : attribute하나를 기본 키로 사용하는 것을 말한다. 일치 방식의 검색만 지원한다.

            2. Hash와 범위 형식 기본키 : attribute 2개를 기본키(복합키)로 사용한다. 일치, 부등호, 포함, ~로 시작하는 범위를 지정하여 검색이 가능하다.

        2. 보조 인덱스

          1. 성능을 위해 사용하며, read/write 용량 유닛을 따로 설정이 가능하다. 둘 다 테이블 당 5개까지 생성이 가능하며 테이블이 생성된 이후에는 추가, 수정, 삭제가 되지 않는다.

          2. local secondary index

      • 테이블에서 해시 기본키와 범위 기본키를 사용할 때만 사용 가능하다.

          1. global secondary index

      • 해쉬 키와 범위 키 모두 테이블 인덱스와 다르게 설정한 것을 말하며 범위키는 생략이 가능하다.

      3. Docker

      1. 도커란?

      • 오픈 소스 컨테이너 가상화 플랫폼이라고 한다. 계층화된 파일시스템을 사용해서 가상화된 컨테이너의 변경사항을 모두 관리한다. 어느 플랫폼에서나 재현 가능한 어플리케이션 컨테이너를 만들어 주는 것을 목표로 한다. 도커는 하나의 어플리케이션을 격리된 공간(컨테이너)에서 독립적으로 실행할 수 있도록 해준다.

      1. 도커 이미지 : 컨테이너에 넣을 프로그램 이미지를 말하는데, 도커 이미지는 읽기 전용의 템플릿이다. 이 이미지를 기반으로 도커 컨테이너를 동작시킨다.

      2. 도커 컨테이너 : 도커 컨테이너는 디렉토리와 비슷한데, 실제로 실행되는 가상머신을 말한다. 격리된 공간에서 최초의 명령어를 실행하며, 미리 규정된 명령어를 실행하면 이미지가 동작하는데, 각 컨테이너는 도커 이미지에 의해 만들어지고 실행, 시작, 정지, 이동, 삭제할 수 있다.

      3. 도커 파일 : 이미지를 생성하기 위한 배치 파일을 말한다.

      4. 도커 인덱스 : 이미 만들어진 다양한 이미지들이 존재한다.

      4. Firebase

      1. Firebase란?

        1. 웹/앱 개발에 필요한 기능을 제공하는 BaaS(Backend as a Service)이다.

        2. 클라우드 서비스 제공자이며 백엔드의 기능까지 가지고 있다. 즉, 백엔드 기능을 클라우드 서비스 형태로 제공한다.

      *  클라우드 서비스란? 인터넷 기반 컴퓨팅의 일종으로 정보를 자신의 컴퓨터가 아닌 인터넷에 연결된 다른 컴퓨터로 처리하는 기술을 말한다. 공유 컴퓨터 처리 자원과 데이터를 컴퓨터와 다른 장치들에 요청시에 제공해준다. 클라우드는  자원의 활용성과 효율성을 증가시킨다.

        1. 프로젝트를 만들어서 어플리케이션 서버와 연결해서 사용하는 형태이다.

      5. OAuth

      * 생활코딩 보면서 공부한 것을 정리하였습니다(https://opentutorials.org/course/3405/22004)

      1. OAuth란?

      <id/pw 요청>

      • user가 ‘나의 서비스’에 가입하려고 할 때 구글이나 페이스북과 같은 ‘다른 서비스’의 아이디와 비밀번호를 이용하여 가입이 가능하도록 구현을 한다면, 보안상에도 문제가 있을 것이고 신뢰성도 떨어질 것이다. 이를 구현하기 위해서는 OAuth를 이용하면 가능하다.

      <토큰 발급>

      • 아이디와 비밀번호를 직접적으로 제공하기보다 ‘다른 서비스’에서 일종의 토큰을 발급하여주면 ‘내 서비스’에서는 OAuth를 이용하여 회원가입이 가능하도록 구현할 수 있다.

      • OAuth에서는 ‘다른 서비스’를 Resource Server라고 하며, user는 Resource Owner라고하며, ‘내 서비스’는 Client라고 한다. 이에 Authorization Server까지 OAuth를 구성하고 있는 주요 4가지 객체이다. 여기서는 Resource Server와 Authorization Server 이 두 서버를 하나의 Server로만 표현하겠다.

      <OAuth 주요 객체>

      1. 등록&인증(access token 발급 받기)

        1. 클라이언트가 리소스 서버를 이용하기 위해서는 리소스 서버로부터 사전에 승인을 받아놓아야 하는데, 이를 register라고 한다.

        2. 서비스마다 공통적으로 가지고 있는 요소

          1. client id : 만들고있는 어플리케이션을 식별하는 식별자

          2. client Secret : id에 대한 비밀번호

          3. Authorized redirect URIs : Resource Server가 권한을 부여하는 과정에서 권한 코드를 부여해줄 때, 그 코드를 Resource Server가 이 URL로 전달한다.

        3. Resource Server에서의 아이디와 패스워드, 그리고 어떠한 기능(B,C)을 가져와야 하는 것에 대한 정보를 Resource Owner에게 알려주고, Resource Server로 요청을 보내도록 하는 버튼의 링크는 다음과 같이 지정해 준다.

      > https://resource.server/?client_id=1&scope=B,C&redirect_uri=http://client/callback

      redirect_uri : 이동할 페이지(resource server 페이지)

      scope : 해당 resource server에서 필요한 기능들

      client_id : Owner의 id

        1. Resource Owner가 위 그림과 같은 버튼을 눌러 Resource Server에 접근을 하면, 로그인 화면을 띄워주고 Owner가 로그인에 성공하게 되면 Resource Server는 버튼을 누르고 들어온 주소(https://resource.server/~)에서 클라이언트 아이디와 자신이 자신(리소스 서버)이 가지고 있는 클라이언트 아이디와 비교하고, uri값과 Authorized redirect URL값을 비교한다. 같다면 Resource Owner에게 scope에 해당되는 권한을 클라이언트에게 부여할 것인지 확인하는 메시지를 전송하고 owner로부터 승인을 받는다.

        1. server가 authorization code(임시 비밀번호)를 헤더에 포함시켜 owner에게 전송함으로서 owner는 그 주소로 이동하게 된다. 그러면 client가 authorization code를 받게 된다.

        1. authorization code를 통해 client는 resource server로 직접 접근할 수 있게 된다. 이때 resource server로 접근하는 url안에는 client id, client secret, authorization code, redirect URL이 있는데, 이 모든 것이 resource server의 해당 authorization code에 저장된 정보들과 일치하면 Access token을 발급해준다.

        1. access token을 발급하여 주면, client와 server에 있는 authorization code는 삭제해 준다. 이제는 Owner의 회원 인증을 할 필요가 없기 때문이다.

        1. server로부터 access token을 발급 받으면, client는 access token을 저장한다. 이때 이 access token이 역할을 정리하자면, Client가 저장된 access Token으로 접근을 하게 되면 Server에서 access token값을 확인하여 그에 맞는 정보를 가진 유저에게 정보를 제공한다.




      ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

      <<19.01.29 화요일 할 일>>

      1. OAuth 개념 동영상 마저 보기(API부터)

      2. Firebase란 무엇인가 공부하기

      3. OAuth기능 사용해보기(예시 찾기)



'동계현장실습' 카테고리의 다른 글

19.01.30 수요일  (0) 2019.01.30
19.01.29 화요일  (0) 2019.01.30
19.01.25 금요일  (0) 2019.01.25
19.01.24 목요일  (0) 2019.01.24
19.01.23 수요일  (0) 2019.01.23

이번에는 정답률 높은 입니당



책으로 공부 꼼꼼하게 한 다음에 풀어봤던 문제여서 그런지 그때 당시에는 막힘없이 술술 코드를 썼었눈데,,,

지금 다시 해보라카믄 잘 할 수 있을런즤

사실 스택 큐는 당연히 기본적으로 술술 해야하는곤데,,, ^^(쥬륵)


<함수 설명>

* 내가 생각하기에 구조체 짜는것(?)이 중요한 것 같다. 그러면 함수는 술술 만들어지는 것 같당,,,(아님말공)

* 맨날 헷갈림 : pop는 front에서 push는 rear로


1. Queue 구조체 : max부터 차례대로 큐의 크기, 큐에 들어있는 데이터 갯수, rear, front, 큐에 저장될 데이터 배열을 말한다.

2. Initialize : 큐를 초기화 해주는 함수이다. 큐를 빈 상태로, 크기만 할당해 줍니당.

3. Enque : 이름 그대로 큐에 데이터를 삽입하는 함수이다. 큐에 들어있는 데이터 갯수(num)와 큐의 크기(max)가 같으면 큐가 가득 찼다는 의미이므로 enqueue가 불가능하기 때문에 -1을 반환해서 가득 찼음을 알린다.  스택코드에서도 그랬던 것처럼, q->num >= p->max 에서 >=라고 해 준 이유는, =만 써주어도 되지만 오류를 방지하기 위함이다. 큐가 가득차지 않았을 경우에는 큐 배열에 데이터가 추가 되었기 때문에 갯수(q->num)를 ++해 주고 큐는 push될 때 rear로 추가 되기 때문에 q->que[q->rear]에 데이터를 대입하고 rear를 ++해준다.

또한 else문 안의 if는 마지막 데이터(x)를 대입함으로서 큐가 가득찼을 때를 의미한다.

4. Deque : 마찬가지로 큐에서 데이터를 pop하는 함수이다. 큐에 아무것도 들어있지 않을 경우(que->num<=0)에는 pop할 수 없기 때문에 -1을 반환해준다(이 함수에서는 -1을 출력해 줌). 큐가 비어있지 않을 경우에는 데이터를 없애야하기 때문에 q->num을 --해준당. 또한 pop될때에는 front에서 데이터가 빠져나가기 때문에 q->front는 ++해준다! (헷갈리지 말자)

5. back : 맨 마지막 데이터 즉, 가장 나중에 들어온 데이터 출력하는 함수이다. rear-1을 해 주는 이유는 rear는 맨 마지막 데이터 다음을 가리키기 때문이다.

6. front : 맨 앞의 데이터 즉, 가장 먼저 들어온 데이터 출력하는 함수이다.

7. size : 데이터가 저장 된 큐의 크기 구하는 함수이다.

8. IsEmpty : 큐가 비어있는지의 여부를 알 수 있는 함수이다. 비어있으면 1, 아니면 0을 출력한다.

9. Isfull : 큐가 가득 차있는지의 여부를 알 수 있는 함수이다. 가득차 있으면 1, 아니면 0을 출력한다.

10. main : push, pop등 문자열 명령(?)들을 입력받아서 배열 ans1[]에 저장하여 strcmp함수로 비교하여 맞는 명령의 조건문(if)에서 함수를 사용하여 명령을 실행한다. 처음에 입력 받은 숫자만큼 명령을 입력 받고 실행해야하기 때문에 while문을 이용하였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10000
 
typedef struct {
    int max;
    int num;
    int rear;
    int front;
    int *que;
}Queue;
 
int Initialize(Queue *q, int max) {
    q->num = q->front = q->rear = 0;
    if ((q->que = (int*)calloc(max, sizeof(int))) == NULL) {
        q->max = 0;
        return -1;
    }
    q->max = max;
    return 0;
}
 
int Enque(Queue *q, int x) {
    if (q->num >= q->max)
        return -1;
    else {
        q->num++;
        q->que[q->rear++= x;
        if (q->rear == q->max)
            q->rear = 0;
        return 0;
    }
}
 
void Deque(Queue *q, int *x) {
    if (q->num <= 0)
        printf("%d\n"-1);
    else {
        q->num--;
        *= q->que[q->front++];
        if (q->front == q->max)
            q->front = 0;
        printf("%d\n"*x);
    }
}
 
void back(Queue *q) {
    if (q->num <= 0)
        printf("%d\n"-1);
    else
        printf("%d\n", q->que[q->rear-1]);
}
 
void front(Queue *q) {
    if (q->num <= 0)
        printf("%d\n"-1);
    else
        printf("%d\n", q->que[q->front]);
}
 
void size(Queue *q) {
    printf("%d\n", q->num);
}
 
void IsEmpty(Queue *q) {
    if (q->num <= 0)
        printf("%d\n"1);
    else
        printf("%d\n"0);
}
 
int IsFull(Queue *q) {
    return q->num >= q->max;
}
 
int main() {
    Queue q;
    int ans = 0, input = 0;
    char ans1[] = "empty";
    ans1[0= '\0';
 
    Initialize(&q, MAX);
    scanf("%d"&ans);
 
    while (ans > 0) {
        scanf("%s", ans1);
 
        if (strcmp(ans1, "push"== 0) {
            scanf("%d"&input);
            Enque(&q, input);
        }
        else if (strcmp(ans1, "pop"== 0)
            Deque(&q, &input);
 
        else if (strcmp(ans1, "size"== 0)
            size(&q);
 
        else if (strcmp(ans1, "empty"== 0)
            IsEmpty(&q);
 
        else if (strcmp(ans1, "front"== 0)
            front(&q);
 
        else if (strcmp(ans1, "back"== 0)
            back(&q);
 
        ans--;
    }
    return 0;
}
cs


+ Recent posts