2021학년도 2학기 중간과제물(온라인제출용)교과목명:현대인의 여가생활학번:성명:연락처:과제유형(공통형/지정형):공통형__________________________________________________________________________________- 이하 과제 작성※ 표지는 A4용지 사용1. 운동 실행 계획 및 운동 일지1) 운동 종목 : 필라테스2) 운동 실행 계획 : 일주일에 2번 이상, 1회 40분 운동 할 것이며, 4가지의 동작을 해볼 것이다.3) 실천 운동 일지 :일시운동 동작운동 시간09.14(화)몸통 감아 상체 올리기(롤업)18:00~18:40(총 40분)공처럼 몸 굴리기톱질하기롤 오버09.16(목)밴드를 이용하여 스쿼드와 런치19:00~19:40(총 40분)다리 들고 팔 흔들기싱글 레그 스트레칭C커브 만들기9.18(토)푸쉬업13:00~14:00(총 60분)척추 앞으로 뻗어 스트레칭싱글 레그 스트레칭허리 돌려서 꼬기09.21(화)필라테스링 허벅지에 끼고 쪼이기18:00~18:40(총 40분)밴드를 이용하여 팔 들어올리기C커브 만들기몸통 감아 상체 올리기9.23(목)무릎대고 푸쉬업 자세19:00~19:40(총 40분)등대고 다리 들어올리기스완 자세 버티기싱글 레그 스트레칭9.25(토)락킹자세 버티기12:00~13:00(총 60분)공처럼 몸 굴리기헌드레드 자세 버티기롤 오버09.28(화)싱글 레그 스트레칭18:00~18:40(총 40분)크리스 크로스 자세 반복옆으로 구부려 비틀기와이드 스쿼트09.30(목)더블 레그 스트레칭19:00~19:40(총 40분)힙 써클 자세 버티기옆으로 누워 다리한 쪽 들기 반복등대고 다리 들어올리기2. 운동을 통해 몸에 일어난 변화와 소감: 필라테스를 하기 시작하면서 가장 크게 변화가 느껴지는 부분은 어깨 결림이 한결 나아졌다는 것이다. 평소 계속 앉아서 일을 하거나 공부를 하며 어깨가 뭉치는 일이 잦았고, 목 부분까지 통증이 있었는데, 필라테스를 하고 나니 목과 어깨 부분이 부드러워 짐을 느낄 수 있었다. 또한 자세가 교정된 느낌이 들면서 앉아있을 때도 몸에 긴장을 주어 바르게 앉을 수 있게 되었고, 서 있을 때에도 올바르게 서서 걸을 수 있었다.필라테스를 하면서 호흡에 신경을 쓰게 되고 몸에 집중하는 시간이 많아지니 자연스럽게 심신이 안정됨을 느낄 수 있었다. 필라테스에서는 자세만큼이나 호흡이 중요한 부분이기 때문에 호흡하는 것에 집중하려고 노력하였고, 운동할 때뿐만 아니라 일상생활 에서도 틈틈이 호흡에 집중하는 시간을 가져 몸과 마음의 안정을 느끼며 집중력도 향상될 수 있었다.가장 만족을 느낄 수 있었던 부분은 다이어트 효과였다. 코로나로 인하여 밖으로 나갈 수 없는 시기에 계속 집안에만 머물다 보니 체중이 증가하게 되었는데 시간을 정하여 계획을 가지고 필라테스를 하니 체중의 감소 효과를 볼 수 있었다. 체중감소와 더불어 몸의 안 쓰는 근육을 쓰기 시작하면서 몸이 단단해지고 유연해지는 것을 느낄 수 있었다.많은 사람들과 다함께 운동하기 어려운 시기에 집에서 틈틈이 하기 쉬운 필라테스는, 몸과 마음의 안정을 주고 몸의 변화를 주어 일상생활에 활력을 불어 일으키기 때문에 좋은 운동이라고 말할 수 있다. 필라테스를 하고 나서 몸과 마음에 긍정적인 효과를 볼 수 있었기 때문에 앞으로도 시간을 내어 운동계획을 세우고 계획에 맞게 필라테스에 도전해 볼 것이다. 또한 일상생활에서도 틈틈이 필라테스 동작을 하며 몸의 유연성과 근력을 더욱 강화할 수 있도록 노력할 것이다.3. 평소 하던 운동과의 비교: 평소에 하던 운동은 대부분 동적인 운동이 많았다. 수영을 하거나 런닝, 등산, 줄넘기 등의 운동을 했었는데 그러한 동적인 운동은 땀이 매우 많이 나고 숨이 차오르는 운동이었다. 반면에 필라테스는 실내에서 자세와 호흡에 집중하며 근력을 쓰는 정적인 운동이라고 할 수 있다.필라테스와 평소에 하던 동적인 운동과의 큰 차이점은 시간과 장소에 구애받지 않는 운동이라는 것이다. 동적인 운동들은 보통 실외에서 하는 운동이 많으며, 실내에서 하기 에는 무리가 있고 낮 시간에만 하는 운동이 대부분이었다. 하지만 필라테스는 집안에서 운동을 해도 무리가 없으며 시간도 자유롭게 정하여 운동할 수 있다. 또한 정적인 운동은 하고나면 숨이 차오르고 헐떡이는 모습을 보이는 반면에 필라테스는 숨을 고르며 하는 운동이기 때문에 숨이 차지 않는 운동이다.평소에 하던 운동들은 보통 근육을 자극하고 순간적인 힘을 쓰는 운동들이라면, 필라테스는 코어근육을 사용하여 몸을 탄탄하게 만드는 운동이다. 그리고 필라테스는 동적인 운동과는 다르게 유연성에 초점을 둔 운동이라고 할 수 있다.
2020학년도 2학기 출석수업대체과제물(온라인 제출용)교과목명 : 자료구조학 번 :성 명 :연 락 처 :________________________________________________________________________________○ 과 제 명 : 자료구조 문제풀이- 이하 과제 작성※ 표지는 A4용지 사용1. 자료구조와 추상화에 대해서 자세히 설명하시오.(10점): 자료구조에서 추상화는 중요한 부분이라고 할 수 있다. 자료구조에서 추상화는 꼭 필요한 존재이며 제외하고는 설명할 수 없기 때문이다.먼저 추상화란, 공통된 개념, 특징 등만 추출하여 모아 객체를 정의하는 것을 의미한다. 어떠한 이에게 추상화된 단어를 말해도 의사소통이 이루어질 수 있으며 말하는 사람의 의도를 파악할 수 있다. 또한 추상화를 통해 간결하게 말하는 사람의 의사를 전달할 수 있는 것도 추상화의 특징이다. 자료의 추상화는 다양한 객체를 컴퓨터에서 표현하고 활용하기 위해 필요한 자료의 구조에 대해서 공통의 특징만 뽑아 정의한 것을 말하며, 표현방법이나 저장 위치 등은 포함하지 않고 자료의 공통된 것만 뽑아 단순히 개발자의 머릿속에 그림을 그리는 것처럼 개념화하는 것을 말한다.자료구조란, 추상화를 통해 알고리즘에서 사용한 자료의 논리적 관계를 구조화 한 것을 말하며, 자료 사이의 논리적 관계를 컴퓨터나 프로그램에 적용하기 위해 자료의 추상화가 필요하다. 만약 자료의 추상화와 구조화가 적절히 이루어지지 못하게 된다면 소프트웨어는 비효율적으로 수행되거나 소프트웨어의 확장성에 문제가 발생할 수 있다. 따라서 자료구조의 중요성을 자료가 복잡할수록 중요하다고 볼 수 있다.자료구조는 입력 자료에 대한 추상화된 상태라고 한다면, 알고리즘은 컴퓨터가 수행해야 할 명령의 추상화라고 할 수 있다. 이러한 알고리즘이 일을 하기 위해서 필요한 다양한 자료의 논리적 구조나 논리적 관계를 자료구조라고 한다. 따라서 입력 값을 머릿속에서 추상화된 형태(자료구조)로 구조화하고 수행되어야 할 명령어를 머릿속에서 추상화된 형태(알고리즘)으로 체계화한다고 볼 수 있다.자료구조는 프로그램과 개발자의 두 가지 관점에서 볼 수 있다. 개발자 관점에서 본다면, 프로그램 개발자가 머릿속에서 추상화된 개념의 자료 구조를 상상하고 컴퓨터가 그것을 이진수로 변형하여 이를 전기신호로 바꾸어 실제 연산이나 계산이 이루어지게 하는 것이다. 프로그램 관점에서 본다면, 알고리즘은 프로그램에 대한 추상화의 결과이며 컴퓨터에 일을 시키기 위하여 일의 대상이 되는 입력 값과 컴퓨터가 수행해야 할 명령어를 알고리즘(추상화된 형태)로 체계화하여 프로그래밍언어로 자료구조와 알고리즘으로 표현(구체화)한 것이다.2. 희소행렬에 대한 2차원 배열의 표현 방법 중에서 메모리를 절약할 수 있는 방법에 대해서 자세히 설명하시오.(10점): 희소행렬이란 원소 값이 0인 원소가 0이 아닌 원소보다 많은 행렬을 말하며, 이런 행렬은 메모리의 낭비를 초례할 수 있다. 따라서 메모리를 절약하기 위해 한 단계 높여서 추상화를 하게 되면 메모리가 낭비되는 문제를 해결할 수 있다.희소행렬에서 0의 값을 저장하지 않고 0이 아닌 값을 저장하게 된다면 메모리를 절약할 수 있다. 0이 아닌 원소의 값을 저장할 때, (행 번호, 열 번호, 원소 값)의 형태로 나타내면 매우 효율적인 배열표현이 된다. 예를 들어 첫 번째 줄에 있는 [0,1]의 값은 행의 개수를, [0,2]의 값은 열의 개수를, [0,3]의 값은 0이 아닌 원소의 개수를 의미하며, 중간에 있는 (1, 4, 7)은 1행에 4열의 값은 7을 의미한다. 이렇게 희소행렬을 효율적인 배열로 표현하게 된다면 희소행렬일 때보다 훨씬 더 메모리를 절약할 수 있을 것이다.3. 서브루틴 함수호출 관리를 위해 사용되는 스택에 대해서 자세히 설명하시오.(10점): 서브루틴의 수행이 끝난 후 되돌아갈 함수 주소를 저장하기 위하여 서브루틴 호출(subroutine call)이 사용된다. 메인루틴에서 사용되는 레지스터의 내용을 서브루틴 호출 후에도 유지하여야 할 때 서브루틴을 사용하며, 서브루틴 호출을 관리하기 위하여 스택이 사용된다.
2020학년도 2학기 기말시험(온라인평가)?교과목명:자료구조?학번:?성명:?연락처:?평가유형:주관식형?주관식형:※ 주관식일 경우 문제번호 표기 후 답안 작성?과제물유형:공통형?과제명:자료구조 문제풀이- 이하 과제 및 답안 작성 (※ A4용지 편집 사용)1.B트리, B*트리, B+트리를 설명하고 비교하시오(30점)B트리란, 균형트리로서 기존에 자식을 2개만 가질 수 있던 Binary tree를 확장하여 더 많은 자식을 가질 수 있는 것을 말한다. B트리는 하나의 노드에 여러 자료가 배치되는 트리구조이며 한 개의 노드에 m개의 자료가 배치되면 m-tree라고 한다. B트리는 스스로 균형을 맞추는 트리로써, 최악의 경우에도 O(logN)의 검색성능을 보인다. 또한 하나의 노드에 많은 수의 데이터를 저장할 수 있는 장점을 가지고 있다. 따라서 단순하지만 효율적인 트리라고도 할 수 있다.B트리의 조건으로는 노드의 데이터가 정렬된 상태여야 하며, 루프노드는 적어도 두 개 이상의 자식을 가져야한다는 것, 루트노드를 제외한 모든 노드는 적어도 m/2개의 자료를 가지고 있어야 한다는 것, 외부 노드로 가는 경로의 길이는 모두 같아야 한다는 것, 입력 자료는 중복될 수 없다는 것 등이 있다. 또한 각 노드는 최대 2개의 키를 가질 수 있고 최대 3개의 자식을 가질 수 있다.B*트리란, 노드의 약 2/3이 차야 하는 트리는 말하며 각 노드는 디스크의 블록과 같기 때문에 노드 하나를 접근하는 것은 디스크를 한 번 더 접근하라는 것을 의미한다. 그러므로 적은 수의 노드를 생성하는 것으로 색인구조의 성능을 높일 수 있다. B*트리는 생성되는 노드의 수를 줄이기 위하여 B-트리의 변형으로 나오게 되었으며, B-트리에서 필요한 보조 연산을 가급적 지연시켜서 횟수를 줄이기 위한 목적으로 만들어지게 되었다. B*트리는 노드에 저장되는 자료가 넘치는 경우(over- flow), 형제 노드들로 재분배 시킨 후 모든 형제 노드가 가능 찬 경우에만 B-트리의 분할 연산을 수행함으로써 연산의 횟수를 줄일 수 있다.B*트리의 조건으로는 루트 노드를 제외한 모든 노드는 2/3이상 채워져야 한다는 것, 한 노드가 가득 차고 인접 노드까지 모두 가득 찰 때 까지 분열을 하지 않는다는 것이 있다.B+트리란, B*트리와 마찬가지로 B-트리의 변형구조이며 리프 노드로 구성된 순차 데이터 부분으로 이루어져 있다. B+트리는 모든 내부 노드에는 자료의 킷값만 저장하고 각 자료의 데이터는 리프노드에만 저장하며 리프노드는 순차적으로 Linked list를 구성하고 있어 순차적인 처리가 가능하다는 특징이 있다. 따라서 리프노드에 저장된 키와 똑같은 키를 저장하는 내부노드가 있을 수도 있다. 또한 각 리프노드는 다음 형제 노드에 대한 포인트를 가지고 있어 중위 순회 없이도 순차적으로 접근이 가능하다. B+트리는 블록사이즈(노드사이즈)를 더 많이 이용할 수 있고 리프노드끼리 linkes list로 연결되어 있어서 탐색에 유리하다는 장점을 가지고 있지만, 무조건 리프노드까지 가야 끝낼 수 있다는 단점이 있다.B+트리의 특징으로는 삽입 시 B-트리와 동일하기 이루어지지만, 노드의 분열이 일어날 경우 중간 킷값이 부모 노드로 올라갈 뿐만 아니라 새로 분열된 노드에도 포함되어야 한다는 것과 새로운 노드는 리프노드끼리의 linked list에도 삽입되어야 한다는 것이 있다. 또한 삭제 시 인덱스 부분은 다른 킷값을 찾는데 사용도리 수 있기 때문에 리프노드의 값이 삭제되어도 삭제하지 않는다는 것, 재배치를 할 경우 인덱스부분에 있는 노드의 킷값은 변하지만 트리구조는 변하지 않는다는 것, 합병을 할 경우 인덱스 부분에서도 킷값을 삭제한다는 것이 있다.B트리, B*트리, B+트리의 공통점은 모든 잎의 깊이가 같다는 것과 삽입 시 overflow가 발생하면 분열이 된다는 것, 삭제 시 underflow가 발생하면 복구하거나 병합한다는 것, 검색이 비슷하다는 것 등을 꼽을 수 있다.2. 스택과 큐를 설명하고 비교하시오(20점)스택(Stack)이란, 쌓아 올린다는 것을 의미하며 책을 쌓는 것처럼 차곡차곡 쌓아올린 형태의 자료구조 말한다. 스택은 객체가 저장되는 순서를 기억하는 방법에 관한 추상자료형이며, 같은 구조와 크기의 자료를 정해진 방향으로만 쌓을 수 있고, top으로 정한 곳을 통해서만 접근할 수 있다. top은 가장위에 있고 가장 최근에 들어온 자료를 가리키고 있으며 자료를 삽입, 삭제 할 때도 top을 통해서 할 수 있다. 스택에서 삽입하는 연산을 push, 삭제하는 연산을 pop이라고 한다. 따라서 스택은 시간 순서에 따라 쌓이므로 가장 마지막에 삽입된 자료가 가장 먼저 삭제된다는 후입선출(LIFO, Last-In-First-Out)의 구조적 특징을 가지고 있다. 또한 비어있는 스택에서 원소를 추출하려 할 때, stack underflow라고 하며 stackEmpty의 메시지를 반환한다. 반면 스택이 넘치는 경우는 stack overflow라고 하며 stackFull의 메시지를 반환하게 된다.큐(Queue)란, 사전적 의미로 줄 또는 줄을 서서 기다리는 것을 말하며, 은행에서 줄을 기다리거나 놀이공원에서 줄을 서서 기다리는 것과 같이 선입선출(FIFO, First in First out)방식의 자료구조를 말한다. 정해진 한 곳(top)을 통해서 삽입과 삭제가 이루어지는 스택과 달리, 큐는 한쪽에서 삽입 작업이, 다른 한 쪽에서 삭제 작업이 양쪽으로 동시에 이루어진다. 이때, 삭제연산이 수행되는 곳을 프론트(front), 삽입연산이 수행되는 곳을 리어(rear)이라고 하며 각각의 연산 작업만 수행된다. 또한 큐의 프론트에서 이루어지는 삭제연산을 디큐(deQueue)라고 부르며 큐의 리어에서 이루어지는 삽입연산을 인큐(enQueue)라고 부른다. 큐의 접근방법은 가장 첫 원소와 끝 원소로만 가능하며 즉, 큐에서 프론트 원소는 가장먼저 큐에 들어왔던 첫 번째 원소가 되는 것이며, 리어 원소는 가장 늦게 큐에 들어온 마지막 원소가 되는 것이다.스택는 맨 위쪽에서만 데이터의 삽입, 삭제를 할 수 있기 때문에 데이터의 삽입과 삭제가 빠르다는 장점이 있지만, 탐색을 하려면 원소를 하나하나 꺼내어 옮겨가면서 해야 하며 맨 위에 있는 원소만 접근가능하다는 단점을 가지고 있다. 따라서 재귀알고리즘이나 역추적을 해야 할 때, 안드로이드의 액티비티, 수식의 괄호 검사, 웹 브라우저의 방문기록을 추적할 경우 활용하기 유용하다.큐는 데이터의 삽입과 삭제가 양쪽에서 동시에 이루어지기 때문에 데이터의 삽입과 삭제가 빠르다는 장점이 있지만, 중간에 위치한 데이터의 접근이 어렵다는 단점이 있다. 따라서 데이터를 입력된 순서대로 처리해야 할 때나 BFS(너비 우선 탐색)을 구현할 때, 게임 대전 매칭 시스템을 구현할 때, 콜센터 고객 대기시간을 계산할 때, 캐시(Cache)를 구현할 때 등에서 활용하기 유용하다.스택은 메모리의 할당과 수집을 위한 시스템스택(system stack)과 서브루틴 호출(subroutine call)관리를 할 때, 우선순위에 의한 계산순서를 결정할 때, 인터럽트(interrupt)를 처리할 때, 문법을 검사하기 위하여 컴파일러(compiler)할 때 등 많은 부분에서 응용이 가능하다.큐는 CPU(중앙처리장치)를 관리하는 것에 응용이 가능하다. 이때 관리하기 위한 스케줄링 기법이 몇 가지 있는데, 먼저 FCFS(First-Come First-Served)스케줄러 기법은 도착한 순서대로 CPU에 할당받을 수 있게 해주는 스케줄링 기법이다. 그리고 RR(Round Robin)기법은 대화형 시스템에 사용되는 스케줄링 기법으로, 작업한 순서대로 CPU가 할당되지만, 할당량과 시간 간격에 의해 제한이 있다. 따라서 일정량의 시간 할당량을 모든 작업에 준 다음 완료되지 못하면 큐의 맨 뒤에 배치가 되어 다음 작업에 CPU를 할당한다. 이러한 스케줄링은 CPU를 공평하게 이용한다는 장점이 있지만, 우선순위가 높은 작업을 빨리 처리하지 못한다는 단점이 있다. 이런 스케줄링 기법은 상황에 따라 더 효율적인 방법으로 선택하여 처리할 수 있다.3. 자료구조, 추상자료형을 설명하고 비교하시오(20점)자료구조(data structure)란, 추상화를 통해 알고리즘에서 사용할 자료의 논리적 관계를 구조화한 것을 말한다. 즉, 자료를 효율적으로 사용하기 위하여 자료의 특성에 따라 자료를 분류하여 구성하고 분류된 자료 값을 저장, 처리하는 모든 작업들을 의미한다.
2020학년도 2학기 출석수업대체과제물(온라인 제출용)교과목명 : 컴파일러구성학 번 :성 명 :연 락 처 :________________________________________________________________________________○ 과 제 명 : 컴파일러구성 문제풀이- 이하 과제 작성※ 표지는 A4용지 사용1. 컴파일러 논리적 구조 6단계를 간단히 설명하시오(10점): 컴파일러의 논리적 구조 단계는 6단계로 나누어 볼 수 있다.첫 번째로 어휘분석(lexical analysis)단계이다. 어휘분석 단계란 원시 프로그램을 읽어서 기본어휘가 문법에 맞는지 분석하는 단계라고 할 수 있다. 문법에 맞는지 분석하기 위해서는 모든 어휘를 정의한 문법이 필요하며 올바르지 않은 어휘를 발견하면 오류메시지가 출력되고 올바른 경우엔 토큰 형태로 출력된다. 이와 같은 일을 하는 것을 어휘분석기(lexical analyzer) 또는 스캐너(Scanner)라고 한다.두 번째로 구문분석(syntax analysis)단계이다. 구문분석 단계란 파싱(parsing)이라고 하며, 어휘분석 단계에서 출력된 토큰들을 입력으로 받아 구문이 문법(문장구조)에 맞는지 분석하는 단계이다. 어휘분석 단계처럼 구문분석 단계에도 문장구조를 정의한 문법이 필요하며 올바른 문장에 대해서는 문장에 대한 구문구조를 만들어 출력하고, 올바르지 않는 문장에 대해서는 오류메시지 출력한다. 이러한 일을 담당하는 것을 구문분석기(syntax analyzer) 또는 파서(parser)라고 한다. 구문구조는 토큰들을 단말노드로 하는 트리형태로 표현되는데 이를 파스트리(parer tree)라고 한다. 파스트리는 기억공간을 낭비하고 컴파일러의 속도를 떨어뜨리는 단점이 있는데, 파스트리에서 꼭 필요한 정보만으로 구성된 트리를 만든 것을 구문트리라고 한다.세 번째로 의미분석(semantic analysis)단계이다. 의미분석단계는 구문분석단계의 결과인 파스트리에 의미를 부여하여 기능이 올바르게 수행될 수 있도록 환경을 조성하는 역할을 한다. 이와 같은 일을 하는 것을 의미분석기(semantic analyzer)라고 한다. 이 단계에서는 구문트리를 보고 산술식, 각문장의 연산자 및 피연산자를 인식하고 유형검사를 한다. 또한 혼합형 연산에서 연산을 실행하기 전 정수를 실수로 바꿔 주는 작업을 하기도 한다.네 번째로 중간코드 생성(intermediate code generation)단계이다. 중간코드 생성단계는 최적화를 위한 중간단계로, 구문트리를 이용하여 생성된 코드가 합쳐질 때마다 구문지시적 변환(syntax-directed translation)이 이루어지는데 이때 문법규칙에 알맞은 코드생성 루틴을 불러 중간코드를 생성하는 단계이다. 이와 같은 일을 담당하는 도구를 중간코드 생성기(intermediate code generator)라고 한다. 중간언어의 표현방법은 후위표현, 쿼드러블(Quadruple) 코드 방법으로 표현, U코드로 표현 등이 있다.다섯 번째로 코드최적화(code optimization)단계이다. 코드최적화단계는 효율화 단계로써, 수행시간과 기억공간을 최소화 하는데 목적을 가지고 있는 단계이다. 이 단계는 방법에 따라 지역최적화, 전역최적화로 나눌 수 있고 단일문에서의 최적화, 루프문장에서의 최적화로 나뉠 수 있다. 또한 실행속도 면에서의 최적화, 기억장소 절약 면에서의 최적화 등으로 나눌 수 있다.마지막으로 목적코드 생성(code generation)단계이다. 목적코드 생성단계는 컴파일러 과정의 마지막 단계로 연산을 수행할 레지스터를 선택하거나 자료에 기억장소 위치를 정해주며, 실제로 목적기계어에 대한 코드를 생성하는 단계이다. 이 과정에서 중간코드를 기계명령어(machine instruction)로 바꾸어 주는 역할을 한다. 목적코드 생성단계에서는 사용할 레지스터의 수, 계산과정, 명령어의 종류 등을 정하는 과정이라고 할 수 있다.