풀면서 뜬금없이 scanf에서 애 먹었던 문제이다 ㅡㅡ



코드에 대한 세부적인 설명은 코드에 주석으로 달아놨습니당~!

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
#include <stdio.h>
#include <stdlib.h>
 
typedef struct Node {
    char data;
    struct Node *left;
    struct Node *right;
}node;
 
//노드생성 함수
node* Create(char x) {
    node* newNode = (node*)malloc(sizeof(node));
 
    newNode->left = NULL;
    newNode->right = NULL;
    newNode->data = x;
 
    return newNode;
}
 
void preorder(node* t) {
    if (t == NULL)
        return;
    
    printf("%c", t->data);
    preorder(t->left);
    preorder(t->right);
}
 
void inorder(node* t) {
    if (t == NULL)
        return;
    
    inorder(t->left);
    printf("%c", t->data);
    inorder(t->right);
}
 
void postorder(node* t) {
    if (t == NULL)
        return;
    
    postorder(t->left);
    postorder(t->right);
    printf("%c", t->data);
}
 
int main() {
    node * root[27];
    int num;
    char a, b, c, arr[81][2];
 
    scanf("%d"&num);
    
    for (int i = 0; i < num; i++) {
        //노드갯수와 각 노드의 자식노드를 입력받아 arr배열에 저장
        scanf(" %c %c %c"&a, &b, &c);
        arr[i][0= b;    arr[i][1= c;
        //num개의 노드 각각 생성
        root[i] = Create(a);
    }
 
    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num; j++) {
            //arr배열의 0번째 열에 저장된 값은 노드의 왼쪽 자식 노드가 된다.
            //배열에 저장된 값과 노드의 데이터(root->data)가 같을 때 그 노드를 왼쪽 자식노드로 저장 
            if (arr[i][0== root[j]->data)
                root[i]->left = root[j];
            //arr배열의 1번째 열에 저장된 값은 노드의 오른쪽 자식 노드가 된다.
            //배열에 저장된 값과 노드의 데이터(root->data)가 같을 때 그 노드를 오른쪽 자식노드로 저장 
            if (arr[i][1== root[j]->data)
                root[i]->right = root[j];
        }
    }
 
    preorder(root[0]);
    printf("\n");
    inorder(root[0]);
    printf("\n");
    postorder(root[0]);
 
    return 0;
}
cs


문제를 풀 때 57번째 줄인 scanf(" %c %c %c", &a, &b, &c);를 첫번째 %c앞에 공백 없이 scanf("%c %c %c", &a, &b, &c); 와 같은 방식으로 써주었더니 에러가 났다. 

이유를 찾아보았다. 컴퓨터는 Enter값도 입력값으로 받아들여서 버퍼에 Enter값이 추가된다고 한다. 그렇기 때문에 내가 사용한 코드는 scanf를 for문으로 반복했기 때문에 Enter값이 다음 scanf의 %c에 입력이 되는 것이다. 그런데 %c앞에 공백을 주면 구분자로 간주하여 오류가 생기지 않는다고 한다. 


문제 푸는 당시에 도저히 해결이 안돼서 게시판에 질문까지 올렸당 ㅠㅠ 나중에라도 또 이런식으로 갈팡질팡할 상황이 올 것 같아서 정리해 보았다... 아래는 내가 올렸던 질문에 대해 받았던 답변이다.



<<줄 바꿈 정의>>

carriage return(\r) : 현재의 위치를 나타내는 커서의 위치를 앞으로 이동한다.

line feed(\n) : 현재 위치에서 바로 아래로 이동한다.

윈도우에서 사용하는 Enter은 CR+LF가 된다.


D +2


어제 조사(?ㅋㅋ)해 본 결과 i18n을 사용하는 것이 보편적인 방법인 것 같다. i18n을 이용하여 다국화 처리된 웹페이지를 구현하려고 한다. 일단 오늘 찾아봐야 할 것들을 간단하게 정리하고 시작해 보았다.


① i18n과 i18next의 차이

② jquery.i18n.properties는?

③ express란?

④ node.js+express로 적용하는 법 집중적으로 찾아보기

⑤ 간단한 코드 같은 것들 따라해 보기(할 수 있다묜...★)


1) i18n과 i18next의 차이

* i18n(Internationalization)이란 지역의 언어들과 문화 설정에 맞도록 지정하기 위해 소프트웨어를 준비하는 과정이다.

* i18next는 자바스크립트에서 쓰여진 internationalization-framework이다. i18next는 보간(interpolation), 형식 지정, 컨텍스트 처리에 대한 표준 i18n기능(이상)을 제공한다.


-> 여기서 그럼 framework란? 프로그램의 기본 구조 즉, 뼈대라는 의미로, 소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것을 말한다. 원하는 기능 구현에만 집중하면 되기 때문에 기본 기능만 갖추도록 구현하여 빠르게 개발 할 수 있다. 그렇기 때문에 프레임 워크만으로는 실행이 불가능하며, 기능을 추가해야 하는데 이때에는 프레임 워크가 정의한 규칙을 준수하여 만들어야 한다. (php는 라라벨, java는 spring, nodejs는 express를 주로 사용함)

-> i18n과 i18next는 그냥 같은 건데 i18next가 프레임 워크라 더 적용이 쉬운 방법인 것 같으다... 일단 나으ㅣ 생각...


2) jquery.i18n.properties는?

3) express란?

* node.js는 JavaScript 기반으로 구성된 서버 사이드 서비스를 JavaScript로 구현할 수 있게 만든 것이며, npm은 node.js 기반의 모듈을 모아둔 저장소이다.

* Express.js는 node.js를 위한 빠르고 간편한 웹 프레임 워크이다.


<<Express.js 시작해보기>>

node.js를 설치하고 패키지를 초기화해 주었다. (프로젝트 관리를 보다 쉽게 하기 위함이다)

위 과정을 마치면 작업 디렉토리에 package.json이 생성되어 있다. package.json은 앱에 적용된 모듈에 대한 관리를 위한 파일이다.


그 다음 Express JS를 사용하기 위해 npm명령어를 실행하여 express 모듈을 설치해 주었다. 

여기서 --save의 의미는 npm install명령어의 옵션이며, 설치되는 모듈은 json파일 내에 dependencies 목록에 자동으로 추가된다.

->설치 완료 : express 웹프레임워크를 사용할 수 있다!


app.js(express에서 권장하는 명칭이다) 파일 저장 후 node 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//모듈 import : express를 파일에 include하고, require함수의 리턴값을 받음
var express = require('express');
var app = express();
 
//라우트 지정(url 구성)
//클라이언트가 서버에 주소를 요청할 때 어떠한 문서를 응답하겠다는 것을 연결하는 작업을 함(라우팅)
app.get('/'function(req,res){
    //send는 res객체의 메소드로 사용자 요청에 대한 응답을 보내는 메소드
    res.send('Hello world')
});
 
//서버가 클라이언트로부터의 요청받을 준비가 되었을 때 콜백함수 동작
app.listen(3000function(){
    console.log("Connected 3000port~!~!")
});

cs

<app.js 파일>


아래와 같이 노드를 생성해주고 localhost:3000으로 들어가보면 Hello world가 뜨는 것을 볼 수 있다!

 

 

4) node.js +express로 적용하는 법 집중적으로 찾아보기

* ejs 파일은 무엇? npm을 이용하여 외부 모듈을 설치하는데, 이 모듈이 ejs모듈이다. ejs는 템플릿 엔진으로, 템플릿을 읽어 엔진의 문법과 설정에 따라서 파일을 HTML 형식으로 변환시키는 모듈이다. HTML에서 <% %>를 사용하여 서버의 데이터를 주고받으며 사용하거나 코드를 실행할 수 있다.


태그

설명 

<%= 값 %> 

작성한 데이터를 그 자리에 쓰는 태그이다.

 그 값 그대로 화면에 출력된다.

<%- 값 %> 

 위 태그와 같지만 HTML관련 태그는 이스케이프 처리되지 않고 그대로 쓰인다. 

 코드 전체(파일)가 구현된다.



* 미들웨어란 무엇? 작은 단위 모듈로 요청과 응답을 처리하는 함수 형태를 말하는데 이 함수의 주기는 request-response 주기로 종료된다. 응답을 완수하기 전까지 중간에 다른 일 처리가 가능하다. express는 여러 개의 미들웨어로 구성되어 있으며 express 프레임워크에서 사용할 수 있는 중간 처리 목적의 소프트웨어이다.


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


[node.js 관련 용어 정리]

* 모듈이란 외부에 영향을 받지 않는 독립된, 재사용이 가능한 코드들의 묶음 즉 라이브러리이다. JAVA에서는 class가, javaScript에서는 function이 모듈 기능을 담당하고 있다. node.js에서는 파일로 구분되어, 코드가 다른 파일과 같은지에 따라 모듈이 나눠지게 된다. 즉, 코드 내용이 다르면 모듈도 다르다.

* require() 함수 : require 메소드를 통해 외부 모듈을 가져올 수 있다. require()함수는 module.exports를 리턴한다. exports는 단순히 module.exports를 참조한다. 사용형식만 다를뿐이다. <require('파일 경로 또는 모듈');> 형식으로 사용한다.

[참고 : https://medium.com/@flsqja12_33844/require-exports-module-exports-%EA%B3%B5%EC%8B%9D%EB%AC%B8%EC%84%9C%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1d024ec5aca3]

* 라우팅이란 어플리케이션 엔드 포인트(URI)의 정의와 URI가 클라이언트 요청에 응답하는 방식을 말한다. (이젠 좀 기억하자!)

* URI : 인터넷에 있는 원을 나타내는 유일한 주소


<기본적인 라우팅 코드>

1
2
3
4
5
6
7
8
9
10
11
var express = require('express');
 
var app = express();
 
 
 
app.get('/users'function (req, res) {
 
  res.send('list of users')
 
});
cs

* express객체를 담고 있는 app 변수의 함수 네가지

app.post()

app.get()

app.put()

app.delete()

이 함수들의 첫 번째 파라미터는 서버자원을 가리키는 URI 문자열을, 두 번째 파라미터는 라우팅 로직함수를 콜백형태로 구현한다.


= 내일 라우팅 정리 다시 하고, 코드 이해 완벽히 하기

= node.js 책 가져오기



@ 그냥 혼자 정리한거니 참고 X, 틀린거 많아요!




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

19.01.14 월요일  (0) 2019.01.14
19.01.11 금요일  (0) 2019.01.11
19.01.10 목요일  (0) 2019.01.10
19.01.09 수요일  (0) 2019.01.09
19.01.07 월요일  (0) 2019.01.07

예전에 풀었지만 지금에서야 올려봅니당3

제일 처음으로 풀었던 문제~!

 

 

 

 

처음으로 풀어봤던 문제라 코드가 지저분한 것 같네요^^(?핑계)

무조건 입력 한번에, 출력 한번에 해야되는 줄 알고...

스택을 두 개로 했어요... 입력용 스택, 출력용 스택 ㅋㅎㅋㅎ

 

1. initialize 함수

스택을 초기화 해준다. 스택의 포인터(현재위치)는 0으로, 스택의 크기(s->max)는 지정해 준 값(max)을 저장한다. 스택 배열에 공간을 할당하였을 때 크기(s->max)가 0이면 -1을 리턴하여 오류가 있음을 알린다.

2. pushX 함수

스택에 push하는 함수이며, 스택이 가득차 있을때 -1을 반환하고 그렇지 않으면 x를 넣고, 스택 포인터(s->ptr, 현재위치)는 다음을 가리켜야 한다.

3. pop 함수

스택에서 가장 위에있는 것을 pop하는 함수이며, 스택이 비어있을 때 -1을 반환하고, 그렇지 않으면 스택 포인터(s->ptr, 현재위치)를 이전으로 옮기고, 스택에서 pop한 값을 리턴한다. 

4. size 함수

스택의 크기를 반환하는 함수이며, s->ptr을 알면 스택에 있는 정수의 갯수를 알 수 있다. s->ptr은 곧 배열의 인덱스인데, 포인터는 스택 속에 마지막 데이터가 들어있는 곳의 다음 인덱스를 가리키기 때문에 s->ptr의 숫자가 곧 스택에 있는 정수의 갯수이다.

5. empty 함수

(s->ptr <= 0)이 부분! 0보다 작거나 같다고 해 준 이유는 혹시 모를 오류를 방지하기 위함이다(책에서 봤는데 이렇게 기억합니다ㅠㅠ). =만 써주어도 된다.

6. top 함수

스택의 top을 반환하는 함수이며, s->ptr은 가장 위(마지막) 데이터의 다음을 가리키기 때문에 s->stk[s->ptr-1]를 반환한다.

7. Print 함수

스택에 있는 것들을 차례대로 프린트하는 함수. for문을 이용하였다.

 

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10000
 
typedef struct {
    int    max; //스택 배열의 최대 크기
    int *stk; //스택 표현할 배열
    int ptr; //현재 위치
}Stack;
 
int initialize(Stack* s, int max) {
    s->ptr = 0;
    if ((s->stk = (int*)calloc(max, sizeof(int))) == NULL) {
        s->max = 0;
        return -1;
    }
    s->max = max;
    return 0;
}
 
int pushX(Stack* s, int x) {
    if (s->ptr >= s->max) //스택이 가득 차 있을 때
        return -1;
    s->stk[s->ptr++= x;
    return 0;
}
 
int pop(Stack* s, int *x) {
    if (s->ptr <= 0//스택이 비어있을 때
        return -1;
    *= s->stk[--s->ptr];
    return *x;
}
 
int size(Stack* s) { //스택에 들어있는 정수의 갯수 출력
    return s->ptr;
}
 
int empty(Stack* s) { //스택이 비어있으면 1, 아니면 0출력
    if (s->ptr <= 0//스택이 비어있을 때
        return 1;
    return 0;
}
 
int top(Stack* s) {//스택의 맨 위에있는 정수 출력, 비어있으면 -1 출력
    if (s->ptr <= 0//스택이 비어있을 때
        return -1;
    else
        return s->stk[s->ptr - 1];
}
 
void Print(Stack* s) {
    for (int i = 0; i < s->ptr; i++)
        printf("%d\n", s->stk[i]);
}
 
int main(void) {
    Stack s, s2;
    int ans = 0, input = 0;
    char ans1[] = "empty";
    ans1[0= '\0';
 
    initialize(&s, MAX);
    initialize(&s2, MAX);
    scanf("%d"&ans);
 
    while (ans > 0) {
        scanf("%s", ans1);
 
        if (strcmp(ans1, "push"== 0) {
            scanf("%d"&input);
            pushX(&s, input);
        }
        else if (strcmp(ans1, "pop"== 0) {
            pushX(&s2, pop(&s, &input));
        }
        else if (strcmp(ans1, "size"== 0) {
            pushX(&s2, size(&s));
        }
        else if (strcmp(ans1, "empty"== 0) {
            pushX(&s2, empty(&s));
        }
        else if (strcmp(ans1, "top"== 0) {
            pushX(&s2, top(&s));
        }
        ans--;
    }
    Print(&s2);
    return 0;
}

cs

 

 

D +1

앞으로 8주동안 진행할 프로젝트에 대한 계획을 세우고 그의 첫번째 단계인 리서치를 진행하였다.

8주 동안 내가 해야할 프로젝트는 language pack(언어팩)과 같은 개념으로, 다양한 언어로 웹 페이지를 볼 수 있도록 구현하는 것이다. 내가 언어팩도 만들어야 할 것이고, 그것을 어떻게 적용시켜서 구현할 것인지 리서치하고 해결해 나가야할 것이다.

 

1. 용어 정리

language pack이란? 일반적으로 인터넷에서 다운로드 받을 수 있는 파일로 구성되어 있으며, 설치하면 사용자가 응용 프로그램이 처음 작성된 언어가 아닌 다른 언어로 시스템에 적용시킬 수 있다. 이때, 글꼴도 함께 적용된다.


웹 서버란? 웹 브라우저를 이용하여 World Wide Web을 사용하는 클라이언트에게 미리 저장된 하이퍼 텍스트를 제공하는 서버를 지칭한다. 웹 서버의 종류에는 아파치, IIS등이 있으며 내가 현장실습으로 있는 회사에서는 express를 사용한다고 한다.


Qt란? 컴퓨터 프로그래밍에서 GUI 프로그램 개발에 널리 쓰이는 크로스 플랫폼 프레임워크이다. 서버용 콘솔과 명령 줄 도구와 같은 비GUI 프로그램 개발에도 사용된다. 그래픽 사용자 인터페이스를 사용하는 경우에는 Qt를 위젯 툴킷으로 분류한다.


NLS이란? National Language Support 국가별 언어 지원을 말한다.


라우터란? 서로 다른 네트워크를 연결해주는 장치를 말한다. 서로 다른 네트워크들이 연결되어 있을 때 각각의 네트워크들의 통신 방법이나 신호가 다르기 때문에 이들이 서로 송수신하기 위해서 중간에서 정리하고 안내해 줄 장치를 라우터라고 한다.


라우팅이란? internetwork을 통하여 근원지에서 목적지로 데이터가 전달될 수 있도록 하는 기능을 말한다. 라우터가 가지고 있는 소프트웨어적 기능으로 패킷의 주소 정보를 읽어 데이터를 목적지별로 분류한다. 네트워크 상에서 정보를 주고 받을 때에는 데이터 앞뒤에 발신지와 목적지 그리고 수신상황과 관련한 각종 정보데이터를 덧붙인 패킷 형태로 송수신 된다.


2. 다국어가 지원되는 웹사이트 만들기 - 방법 리서치

(1) IP 주소 사용

ip 주소를 이용하여 접속한 국가명에 맞는 언어 페이지를 보여주도록 하는 방법

(2) NLS

> I18N = Internationalization 국제화, 한 언어를 여러 언어들에 대응시켜 다른 국가의 사람들에게도 읽힐 수 있게 만드는 작업이다.

① 자바 스크립트에서 적용

② jquery.i18n.properties를 사용

* 모든 다국어 처리를 서버 사이드에서 진행하기에는 부담이 크며, 외부 자바스크립트 파일로도 처리가 힘들기 때문에 jquery.i18n.properties를 사용한다.

* 서버사이드 언어에서 사용하고 있는 message properties 파일을 재활용할 수 있도록 한다.

* 서버사이드 언어로부터 프로퍼티 내용을 읽어오기 위해 서버로 요청을 보내야 한다.

// This will initialize the plugin 

// and show two dialog boxes: one with the text "Olá World"

// and other with the text "Good morning John!" 

jQuery.i18n.properties({

    name:'Messages'

    path:'bundle/'

    mode:'both',

    language:'pt_PT'

    callback: function() {

        // We specified mode: 'both' so translated values will be

        // available as JS vars/functions and as a map

        // Accessing a simple value through the map

        jQuery.i18n.prop('msg_hello');

        // Accessing a value with placeholders through the map

        jQuery.i18n.prop('msg_complex''John');

        // Accessing a simple value through a JS variable

        alert(msg_hello +' '+ msg_world);

        // Accessing a value with placeholders through a JS function

        alert(msg_complex('John'));

    }

});

cs


③ node.js에서 적용

* 모듈 설치($ npm i -S i18n) 후 모듈을 불러와서 사용 한다.


var
 i18n = require('i18n');

 

i18n.configure({

  locales: ['ko''en'],

  fallbacks: { nl: 'ko' },

  defaultLocale: 'ko'//디폴트 언어

  cookie: 'lang'//쿠키 이름 설정

  directory: __dirname + '/locales' //폴더 생성위치

});

cs

json 파일에 언어들을 각각 저장하여 실행 (kr.json, en.json)

* 템플릿 파일에서 코딩(호출)


<%= __('json 파일에서 설정한 이름') %>

cs


* 코드 사용방법 : https://stackoverflow.com/questions/8972639/how-do-you-use-i18n-with-node-js


> L10N = Location 현지화, 좀 더 심화적으로, 단순히 내용이 읽히는 것에 더해서 지역명이나 인물을 바꾸거나, 숙어와 속담, 문화와 생활 양식 등을 대상 국가에 맞춰 치환해서 현지화하는 작업이다.

(3) 쿠키 이용,,(?)

언어 선택과 관련하여 발급했었던 쿠키가 있다면 이 쿠키 언어를 사용한다. 특정 요청시 쿠키에 언어 추가하고, 이후에 쿠키에 언어값에 따라 로케일을 변경하는 방식을 사용한다.

*로케일 : 사용자의 언어, 국가뿐 아니라 사용자 인터페이스에서 사용자가 선호하는 사항을 지정한 매개 변수의 모임이다. 보통 로케일 증명자는 적어도 하나의 언어 증명자와 하나의 지역 증명자를 가지고 있다.

*파싱 : 주로 어떤 데이터를 다른 모양으로 가공하는 걸 말한다.

*크롤러 :  조직적, 자동화된 방법으로 월드 와이드 웹을 탐색하는 컴퓨터 프로그램이다.

*크롤링 : 새로운 페이지나 업데이트 된 페이지를 찾아 구글에 추가하는 과정을 말한다.

(4) URL사용

언어의 버전별로 다른 URL을 사용한다.

예시) example.ko, ko.example.com, example.com/ko/ 등등

(5) 엔진 사용

Xpress엔진

firebase

--------------------------------------------------------------------------------------------------

단어에 대한 개념이 부족해서 하나를 검색하면 이 단어를 모르고 검색이 꼬리에 꼬리를 물다보니 뜻 찾아보고 이해하는데에만 하루 종일이 걸렸다. 사실 아직도 이해하지 못했다 ㅎㅎ 그래서 여기저기서 짜깁기해서 정리한 느낌이 굉장히 크다. 지금 한 것도 맞게 한건지, 내가 뭘 한건지 사실 잘 모르겠다! 그냥 지금 개념이 없는 듯... 증말 눈 빠지는 줄 알았는디,,, 정리한 거 제출하려고 보니까 정리 내용이 없어서 당황함ㅋㅋ 망했다 ㅠㅜ 앞으로 8주 어떡하지...

* 그냥 혼자 정리한거니 참고 X, 틀린거 많아요!

 




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

19.01.14 월요일  (0) 2019.01.14
19.01.11 금요일  (0) 2019.01.11
19.01.10 목요일  (0) 2019.01.10
19.01.09 수요일  (0) 2019.01.09
19.01.08 화요일  (0) 2019.01.08

+ Recent posts