PowerPoint 프레젠테이션

Similar documents
11장 포인터

11장 포인터

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - 제11장 포인터(강의)

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Microsoft PowerPoint - 제11장 포인터

슬라이드 1

Microsoft PowerPoint - chap-11.pptx

untitled

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

PowerPoint 프레젠테이션

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

Microsoft PowerPoint - chap06-2pointer.ppt

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

금오공대 컴퓨터공학전공 강의자료

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - ch08 - 구조체 (structure) am0845

Microsoft PowerPoint - chap10-함수의활용.pptx

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap11-포인터의활용.pptx

C 언어 프로그래밊 과제 풀이

OCW_C언어 기초

Data Structure

02장.배열과 클래스

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

슬라이드 1

슬라이드 1

설계란 무엇인가?

중간고사

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

기초컴퓨터프로그래밍

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - Chapter_08.pptx

C 프로그래밊 개요

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

금오공대 컴퓨터공학전공 강의자료

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

설계란 무엇인가?

14 주차구조체와공용체

Microsoft PowerPoint - chap04-연산자.pptx

<C1DFB0EDB5EEBACE2E687770>

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chapter14_17.pptx

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

PowerPoint Template

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

untitled

C 프로그래밊 개요

Microsoft PowerPoint - chap13-입출력라이브러리.pptx


Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

untitled

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>

Microsoft PowerPoint - chap09-1.ppt

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

목차 배열의개요 배열사용하기 다차원배열 배열을이용한문자열다루기 실무응용예제 C 2

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

슬라이드 1

PowerPoint Presentation

PowerPoint Presentation

Microsoft PowerPoint - chap12-고급기능.pptx

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터


OCW_C언어 기초

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - chap03-변수와데이터형.pptx

쉽게 풀어쓴 C 프로그래밍

ch15

본 강의에 들어가기 전

C++ Programming

Microsoft PowerPoint - 7장 배열 pptx

PowerPoint 프레젠테이션

Infinity(∞) Strategy

PowerPoint 프레젠테이션

Infinity(∞) Strategy

ABC 6장

Microsoft PowerPoint - Chapter 6.ppt

PowerPoint 프레젠테이션

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

PowerPoint Template

Microsoft PowerPoint - Java7.pptx

Transcription:

김서형 : 010 9320-8604

대각선이있는사각형 n 이입력된다.(3<=n<=100) 대각선이포함된 n*n 사각형을출력합니다. ex) 사각형의높이를입력하세요.(3<=n<=100) : 9 ( 입력 ) 높이가 9 인사각형을출력합니다. ( 변수값출력 ) ********* ** ** * * * * * * * * * * * * * * * * * * * ** ** *********

대각선이있는사각형 #include <stdio.h> int main() { int a, i, j; printf(" 사각형의높이를입력하세요 (3<=n<=100) : "); scanf("%d",&a); printf(" 높이가 %d 인사각형을출력합니다.\n",a); for(i=0;i<a;i++) { if((i==0) (i==a-1)) { for( j=0;j<a;j++) { printf("*"); else { for( j=0;j<a;j++) { if(( j==0) ( j==a-1)) { printf("*"); else if(( j==i) ( j==a-i-1)) { printf("*"); else { printf(" "); printf("\n"); return 0;

괄호개수 왼쪽괄호 ( 와오른쪽괄호 ) 가입력되면개수를파악합니다. ( 괄호외의다른문자는개수파악하지않습니다. ) ex) 괄호를입력하세요. ( 출력 ) (a ds )) 3+5) (7*4) ajvuf ) ()( ( ) ( 입력 ) 왼쪽괄호는 5개, 오른쪽괄호는 7개입니다. ( 변수값출력 ) 알고리즘 ( 만약, 입력된문자가왼쪽괄호 ( 라면 left 변수증가 ) ( 만약, 입력된문자가오른족쪽괄호 ) 라면 right 변수증가 )

괄호개수 #include <stdio.h> int main() { int i,j,l=0,r=0; char a[10000]; printf(" 괄호를입력하세요.\n"); for(i=0;1;i++) { scanf("%c",&a[i]); if(a[i]=='\n') { break; for( j=0;j<i;j++) { if(a[j]=='(') { l++; else if(a[j]==')') { r++; printf(" 왼쪽괄호는 %d 개, 오른쪽괄호는 %d 개입니다.",l,r); return 0;

빠진카드 우리는 1 부터 N 까지의숫자가차례대로적힌 N 장의카드묶음을가지고있다. 그런데이카드묶음을옮기는중실수로땅에떨어뜨려그중한장을잃어버렸다. 여러분은땅에떨어진카드묶음을읽어서빠진하나의카드번호를찾아출력해야한다. ex) 카드의개수를입력하세요 : 10 ( 입력 ) 현재가지고있는카드를입력하세요. ( 출력 ) 3 4 1 10 2 6 7 5 9 빠진카드는 8 입니다. 알고리즘 ( 카드의번호를배열의주소로사용. ex- 3 번카드가있다면, a[3] = 1) ( 배열의값이 0 이라면카드가없다는것 )

int main() { int i, n, m; char a[10000] = { 0 ; 빠진카드 printf(" 카드의개수를입력하세요 : "); scanf("%d",&n); printf(" 현재가지고있는카드를입력하세요.\n"); for(i=1;i<n;i++) { scanf("%d",&m); a[m] = 1; for(i=1;i<=n;i++) { if(a[i] == 0) { break; printf(" 빠진카드는 %d 입니다.",i); return 0;

하나의정수 N 을입력받아다음과같이작성합니다. 지그재그로출력, N 이 5 라면다음과같이출력됩니다. 1 2 3 4 5 10 9 8 7 6 11 12 13 14 15 20 19 18 17 16 21 22 23 24 25 지그재그배열 알고리즘 ( 이차원배열을규칙에맞게숫자를넣어준다.) ( 홀수줄에는증가, 짝수줄에는감소 )

지그재그배열

재귀함수 함수자신이자신을호출하는함수의형태

재귀함수 ( 팩토리얼 )

재귀함수장점

재귀함수장점

재귀함수연습 1 1 부터정수 n 까지출력하는재귀함수를설계합니다 이문제는반복문 for, while 등을이용하여풀수없습니다. ( 재귀함수, printf, scanf 만사용 )

재귀함수연습 1

재귀함수연습 2 시작수 (a) 와마지막수 (b) 가입력되면 a 부터 b 까지의모든홀수를출력합니다. 이문제는반복문 for, while 등을이용하여풀수없습니다. ( 재귀함수, printf, scanf 만사용 )

재귀함수연습 2

재귀함수연습 3 피보나치수열이란앞의두수를더하여나오는수열입니다. 첫번째수와두번째수는모두 1 이고, 세번째수부터는이전의두수를더하여나타냅니다. 피보나치수열을나열해보면다음과같습니다. 1, 1, 2, 3, 5, 8, 13 자연수 N 을입력받아 N 번째피보나치수를출력하는프로그램을작성하세요. 이문제는반드시재귀함수로풀어야합니다.

재귀함수연습 3

포인터란? 포인터 (pointer) : 주소를가지고있는변수 1003 1004 1005 영화관 1002 1006 1001 포인터 (pointer) 1007

메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1,

변수와메모리 변수의크기에따라서차지하는메모리공간이달라진다. char 형변수 : 1 바이트, int 형변수 :4 바이트, int main(void) { int i = 10; char c = 69; float f = 12.3;

변수의주소 변수의주소를계산하는연산자 : & 변수 i 의주소 :&i

i 의주소 : 1245024 c 의주소 : 1245015 f 의주소 : 1245000 변수의주소

포인터의선언 포인터 : 변수의주소를가지고있는변수 *p 가가리키는내용은정수가된다. * 가우선순위가높아서 p 는포인터가된다.

포인터와변수의연결 int i = 10; int *p; p = &i; // 정수형변수 i 선언 // 포인터변수 p 선언 // 변수 i 의주소가포인터 p 로대입

간접참조연산자 간접참조연산자 *: 포인터가가리키는값을가져오는연산자 int i=10; int *p; p =&i; printf( %d, *p):

포인터와변수연결 p 10 i int *p = &i; // 한줄로써도됨

포인터의값은변경가능 p 100 x 200 y

포인터사용시주의점 초기화가안된포인터를사용하면안된다. int main(void) { int *p; *p = 100; return 0; // 포인터 p 는초기화가안되어있음 // 위험한코드 주소가잘못된것같은데 p

포인터를통하여값변경 p 10 i 포인터를통하여변수 i 의값을변경한다.

포인터사용시주의점 포인터의타입과변수의타입은일치하여야한다. #include <stdio.h> int main(void) { int i; double *pd; pd = &i; *pd = 36.5; // 컴파일오류! double 형포인터에 int 형변수의주소를대입 return 0;

포인터연산 가능한연산 : 증가, 감소, 덧셈, 뺄셈연산 증가연산의경우증가되는값은포인터가가리키는객체의크기 포인터타입 ++ 연산후증가되는값 char 1 short 2 int 4 float 4 포인터의증가는일반변수와는약간다릅니다. 가리키는객체의크기만큼증가합니다. double 8 p++

포인터의증감연산

증가연산예제

포인터사용의장점 연결리스트나이진트리등의향상된자료구조를만들수있다. N A C D E A C D E B B 메인메모리 메인메모리 참조에의한호출 (call-by-reference) 포인터를매개변수로이용하여함수외부의변수의값을변경할수있다. 동적메모리할당

인수전달방법 함수호출시에인수전달방법 값에의한호출 (call byvalue) C 에서기본적인방법 참조에의한호출 (call byreference) C 에서는포인터를이용하여흉내낼수있다.

값에의한호출 현재의위치 (10,20) 현재의위치 (10,20)

참조에의한호출 함수호출시에변수의값을함수에전달 현재의위치 (10,20) 현재의위치 (11,21)

swap() 함수 #1 변수 2 개의값을바꾸는작업을함수로작성 #include <stdio.h> voi d swap(int x, int y); in t main(void) { int a = 100, b = 200; swap(a, b); return 0; void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; 함수호출시에값만복사된다. 100 a 200 b <main> 2100 x 2100 y <swap> 100 tmp

swap() 함수 #2 포인터를이용 #include <stdio.h> voi d swap(int x, int y); in t main(void) { int a = 100, b = 200; swap(&a, &b); return 0; void swap(int *px, int *py) { int tmp; tmp = *px; *px = *py; *py = tmp; 함수호출시에주소가복사된다. 100 tmp 1200 a 2100 b <main> &a px &b py <swap>

인수를변경하지못하게하려면 #include <stdio.h> void display(const int *xpos, const int *ypos); void move(int *xpos, int *ypos); int main(void) { int x = 10; int y = 20; display(&x,&y); move(&x, &y); display(&x, &y); return 0; void display(const int *xpos, const int *ypos) { printf(" 현재의위치 (%d, %d) \n", *xpos, *ypos); void move(int *xpos, int *ypos) { *xpos = *xpos + 1; *ypos = *ypos + 1;

scanf() 함수 변수에값을저장하기위하여변수의주소를받는다.

자료형의분류 자료형 (data type) 기초자료형파생자료형사용자정의자료형 char int float double void 배열포인터구조체공용체 typedef enum

구조체의필요성 학생에대한데이터를하나로모으려면? 학번 : 20100001( 정수 ) 이름 : 최자영 ( 문자열 ) 학점 : 4.3( 실수 ) int number; char name[10]; double grade; 와같이개별 변수로나타낼수있지만 묶을수가있나?

구조체의필요성 int number; char name[10]; double grade; 구조체를사용하면변수들을하나로묶을수있습니다.

구조체선언 구조체선언형식 struct 태그 { 자료형자료형 ;... 멤버 1; 멤버 2;

구조체변수선언 구조체정의와구조체변수선언은다르다.

구조체선언 구조체선언은변수선언은아님 구조체를정의하는것은 와플이나붕어빵을만드는 틀을정의하는것과같다. 와플이나붕어빵을실제로 만들기위해서구조체변수를 선언하여야한다. 구조체 구조체변수

멤버연산자 (.) 사용 구조체멤버접근

예제 #1 구조체선언 구조체변수선언 구조체멤버참조

학생데이터예제 struct student s = { 20160001, "Kim", 4.3 ; 52

핵심예제 : 점들간의거리계산 사용자로부터점의좌표를입력받아서이들점사이의거리를계산하여보자. 핵심예제 : 성적표만들기로변경?

두점의거리 p2 (x,y) p1 (x,y)

구조체변수의대입과비교 같은구조체변수까리대입은가능하지만비교는불가능하다. struct point { int x; int y; ; int main(void) { struct point p1 = {10, 20; struct point p2 = {30, 40; p2 = p1; if( p1 == p2 ) printf("p1 와 p2 이같습니다.") if( (p1.x == p2.x) && (p1.y == p2.y) ) printf("p1 와 p2 이같습니다.") // 대입가능 // 비교 -> 컴파일오류!! // 올바른비교

동적할당메모리의개념 프로그램이메모리를할당받는방법정적 (static) 동적 (dynamic)

정적메모리할당 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 ( 예 ) int score_s[100]; 처음에결정된크기보다더큰입력이들어온다면처리하지못함 더작은입력이들어온다면남은메모리공간은낭비

동적메모리할당 동적메모리할당 실행도중에동적으로메모리를할당받는것 운영 체제 사용이끝나면시스템에메모리를반납 score = (int *) malloc(100*sizeof(int)); 요구 할당 필요한만큼만할당을받고메모리를매우효율적으로사용 malloc() 계열의라이브러리함수를사용 # i n c l u d e < s t d i o. h > # i n c l u d e < s t d i o. h > # i n c l u d e < s t d l i b. h > # i n c l u d e < s t d l i b. h > i n t m a i n ( v o i d ) i n t m a i n ( v o i d ) { { i n t * p ; i n t * p ; p = ( i n t * ) m a l l o c ( s i z e o f ( i n t ) ) ; p = ( i n t * ) m a l o c ( s i z e o f ( i n t ) ) ;...... 프로그램

동적메모리할당절차

동적메모리할당 void *malloc(size_t size) size는바이트의수 malloc() 함수는메모리블럭의첫번째바이트에대한주소를반환 만약요청한메모리공간을할당할수없는경우에는 NULL값을반환 int *score; score = (int *)malloc(100*sizeof(int)); if( score == NULL ){... // 오류처리 score?????

동적메모리사용 할당받은공간은어떻게사용하면좋을까? 첫번째방법 : 포인터를통하여사용 *score = 100; *(score+1) = 200; *(score+2) = 300;... 두번째방법 : 동적메모리를배열과같이취급 score[0] = 100; score[1] = 200; score[2] = 300;... score 100 200 300??

동적메모리반납 void free(void *ptr) free() 는동적으로할당되었던메모리블록을시스템에반납 ptr 은 malloc() 을이용하여동적할당된메모리를가리키는포인터 int *score; score = (int *)malloc(100*sizeof(int)); free(score); score?????

핵심예제 : 평균점수계산하기 시험점수의평균을구하는프로그램을동적메모리할당을이용하여작성해보자. 사용자로부터미리학생수를입력받는다.

예제소스

구조체배열예제 구조체배열할당

realloc() void *realloc(void *memblock, size_t size); realloc() 함수는할당하였던메모리블록의크기를변경 malloc() ( 예 ) int *p; p = (int *)malloc(5 * sizeof(int))); p = realloc(p, 7 * sizeof(int))); p p realloc() 1 5 7 4 2 9 1 5 7 4 2 9??

정보올림피아드초등부 2016 기출 13. (2.7점) 어떤수에대해서 의등식이성립한다고한다. 의값은얼마일까? 1-1 2 0 3 1 4 2 5 2016 x 2016 x 2 = -x -1 14. (1점) 다음중 C나 C++ 언어의함수가될수없는것은? 1 Robot() 2 returns() 3 home() 4 for() 5 ever() 15. (1점) 다음중 C나 C++ 언어의연산자가아닌것은? 1 + 2 ++ 3-4 -- 5 +-

정보올림피아드초등부 2016 기출 13. (2.7점) 어떤수에대해서 의등식이성립한다고한다. 의값은얼마일까? 1-1 2 0 3 1 4 2 5 2016 x 2016 x 2 = -x -1 sol) x 3 = x 2 x = x 1 x = x + 1 x = 1 x 2016 = (x 3 ) 672 =1 672

정보올림피아드초등부 2016 기출 14. (1점) 다음중 C나 C++ 언어의함수가될수없는것은? 1 Robot() 2 returns() 3 home() 4 for() 5 ever() Sol) 예약어와같은이름의함수는생성할수없습니다. 15. (1점) 다음중 C나 C++ 언어의연산자가아닌것은? 1 + 2 ++ 3-4 -- 5 +- Sol) 1 + : 더하기 2 ++ : 증감연산자 3 - : 빼기 4 -- : 증감연산자 5 +- :?

정보올림피아드초등부 2016 기출 21. (1.4 점 ) 다음문자열은메모리에서몇바이트를차지하는가? char a[] = "seven"; 1 5 2 6 3 7 4 8 5 9 22. (1.4 점 ) 다음프로그램의출력은무엇인가? float a; int b=3, c=2; a = b/c; printf("%.1f", a); 1 1.5 2 3.2 3 1.0 4 2.0 5 2.3

정보올림피아드초등부 2016 기출 21. (1.4 점 ) 다음문자열은메모리에서몇바이트를차지하는가? char a[] = "seven"; 1 5 2 6 3 7 4 8 5 9 Sol) char 타입은 1 바이트, ( 배열의각방이 1byte) 문자열의마지막에는 \0 가들어간다는것에주의 a[0] = s, a[1] = e, a[2] = v, a[3] = e, a[4] = n, a[5] = \0 C 언어 _PT3 의 48 페이지

정보올림피아드초등부 2016 기출 22. (1.4 점 ) 다음프로그램의출력은무엇인가? float a; int b=3, c=2; a = b/c; printf("%.1f", a); 1 1.5 2 3.2 3 1.0 4 2.0 5 2.3 Sol) b/c = 1.5 이지만 ( 정수 )/( 정수 ) = 정수이기때문에소수점아래 0.5 는사라집니다.

정보올림피아드초등부 2016 기출 32. (2점) 다음프로그램의출력이 5가되도록할때 (a) 에 들어가야할수는무엇인가? int num = 1, cnt = 0; while (num <= 2016) { num = num * 10 - (a) ; cnt++; printf("%d", cnt); 1 0 2 2 3 4 4 6 5 8

정보올림피아드초등부 2016 기출 32. (2점) 다음프로그램의출력이 5가되도록할때 (a) 에 들어가야할수는무엇인가? int num = 1, cnt = 0; while (num <= 2016) { num = num * 10 - (a) ; cnt++; printf("%d", cnt);1 a = 0 이라고생각하고어떻게동작하는지확인해보겠습니다. cnt 가 0 일때, num = 1 * 10 = 10;, cnt = 1; cnt 가 1 일때, num = 10 * 10 = 100;, cnt = 2; cnt 가 2 일때, num = 100 * 10 = 1000;, cnt = 3; cnt 가 3 일때, num = 1000 * 10 = 10000, cnt = 4; cnt 가 4 일때, while 조건인 num <= 2016 이거짓이므로 while 구문빠져나와서 4 를출력

정보올림피아드초등부 2016 기출 32. (2점) 다음프로그램의출력이 5가되도록할때 (a) 에 들어가야할수는무엇인가? int num = 1, cnt = 0; while (num <= 2016) { num = num * 10 - (a) ; cnt++; printf("%d", cnt);1 4 6 cnt 가 0 일때, num = 1 * 10-6 = 4;, cnt = 1; cnt 가 1 일때, num = 4 * 10-6 = 34;, cnt = 2; cnt 가 2 일때, num = 34 * 10-6 = 334;, cnt = 3; cnt 가 3 일때, num = 334 * 10-6 = 3334, cnt = 4; cnt 가 4 일때, while 조건인 num <= 2016 이거짓이므로 while 구문빠져나와서 4 를출력

정보올림피아드초등부 2016 기출 32. (2점) 다음프로그램의출력이 5가되도록할때 (a) 에 들어가야할수는무엇인가? int num = 1, cnt = 0; while (num <= 2016) { num = num * 10 - (a) ; cnt++; printf("%d", cnt);1 5 8 5 8 cnt 가 0 일때, num = 1 * 10-8 = 2;, cnt = 1; cnt 가 1 일때, num = 2 * 10-8 = 12;, cnt = 2; cnt 가 2 일때, num = 12 * 10-8 = 112;, cnt = 3; cnt 가 3 일때, num = 112 * 10-8 = 1112, cnt = 4; cnt 가 4 일때, num = 1112 * 10-8 = 11112, cnt = 5; cnt 가 5 일때, while 조건인 num <= 2016 이거짓이므로 while 구문빠져나와서 5 를출력

정보올림피아드초등부 2016 기출 40. (2.6 점 ) 다음프로그램의출력결과는무엇인가? const int N = 100; int edges[n][n], cnt[n]; void addedge(int x, int y) { edges[x][++cnt[x]] = y; edges[y][++cnt[y]] = x; int main() { addedge(1,2); addedge(1,3); addedge(2,1); addedge(2,4); addedge(3,1); addedge(4,2); int i, sum = 0; for(i=1;i<=4;i++) sum += cnt[i]; printf("%d\n",sum); return 0; 13 24 36 48 512

정보올림피아드초등부 2016 기출 40. (2.6 점 ) 다음프로그램의출력결과는무엇인가? const int N = 100; int edges[n][n], cnt[n]; void addedge(int x, int y) { edges[x][++cnt[x]] = y; edges[y][++cnt[y]] = x; int main() { addedge(1,2); addedge(1,3); addedge(2,1); addedge(2,4); addedge(3,1); addedge(4,2); int i, sum = 0; for(i=1;i<=4;i++) sum += cnt[i]; printf("%d\n",sum); return 0; 출력결과는 sum 변수의값. sum변수는 for문에의해13 cnt[1] + cnt[2] + cnt[3] + cnt[4] 24 cnt[100] 은전역변수이므로초기값 0 메인한수에서가장먼저하는 addedge(1,2) 를실행해보면 36, 인수 1과 2를매개변수 x와 y에넘줘서 edges[1][++cnt[1]] = 2; 48 edges[2][++cnt[2]] = 1; 512 필요한것은 cnt배열이기때문에, ++cnt[1], ++cnt[2] 에의해 cnt[1] = cnt[1] + 1, cnt[2] = cnt[2] + 1 즉, 각각 1이된다는것만체크.

정보올림피아드초등부 2016 기출 40. (2.6 점 ) 다음프로그램의출력결과는무엇인가? const int N = 100; int edges[n][n], cnt[n]; void addedge(int x, int y) { edges[x][++cnt[x]] = y; edges[y][++cnt[y]] = x; int main() { addedge(1,2); addedge(1,3); addedge(2,1); addedge(2,4); addedge(3,1); addedge(4,2); int i, sum = 0; for(i=1;i<=4;i++) sum += cnt[i]; printf("%d\n",sum); return 0; addedge(x,y) 의인수값이 cnt[n] 을증가시키므로, 인수의개수를파악. 13 24 ++cnt[1] 4번 => cnt[1] = 4 ++cnt[2] 4번 => cnt[2] = 4 ++cnt[3] 2번 => cnt[3] 36 = 2 ++cnt[4] 2번 => cnt[4] = 2 48 sum = 4 + 4 + 2 +2 = 12 512

제 33 회한국정보올림피아드전국본선 (2016.7.16) 초등부, 중등부문제 1 방배정 정보초등학교에서는단체로 2박 3일수학여행을가기로했다. 여러학년이같은장소로수학여행을가려고하는데 1학년부터 6학년까지학생들이묵을방을배정해야한다. 남학생은남학생끼리, 여학생은여학생끼리방을배정해야한다. 또한한방에는같은학년의학생들을배정해야한다. 물론한방에한명만배정하는것도가능하다. 한방에배정할수있는최대인원수가주어졌을때, 조건에맞게모든학생을 배정하기위해필요한방의최소개수를구하는프로그램을작성하시오. 예를들어, 수학여행을가는학생이다음과같고 K = 2 일때 12 개의방이필요하다. 왜냐하면 3 학년남학생을배정하기위해방두개가필요하고 4 학년여학생에는방을배정하지않아도되기때문이다. 소스파일의이름은 aa.c 또는 aa.cpp 를권장하지만, 서버에제출하는데는다른이름도상관없다.

제 33 회한국정보올림피아드전국본선 (2016.7.16) 초등부, 중등부문제 1 입력형식 표준입력으로다음정보가주어진다. 첫번째줄에는수학여행에참가하는학생수를나타내는정수 N(1 N 1, 000) 과한방에배정할수있는최대인원수 K (1<K 1,000) 가공백으로분리되어주어진다. 다음 N개의각줄에는학생의성별 S와학년 Y (1 Y 6) 가공백으로분리되어주어진다. 성별 S는0, 1중하나로서여학생인경우에 0, 남학생인경우에 1로나타낸다. 출력형식 표준출력으로학생들을모두배정하기위해필요한최소한의방의수를출력한다.

제 33 회한국정보올림피아드전국본선 (2016.7.16) 초등부, 중등부문제 1 부분문제의제약조건 l 부분문제 1 : 전체점수 100 점중 2 점에해당하며입력예시로주어진입력만존재한다. l 부분문제 2 : 전체점수 100 점중 10 점에해당하며 1 학년남학생만참가하는것으로가정한다. l 부분문제 3 : 전체점수 100 점중 20 점에해당하며 1 학년만참가하는것으로가정한다. l 부분문제 4: 전체점수 100 점중 68 점에해당하며원래의제약조건이외에아무제약조건이없다.

제 33 회한국정보올림피아드전국본선 (2016.7.16) 초등부, 중등부문제 1 입력과출력의예 입력 (1) 출력 (1) 입력 (2) 16 2 1 1 0 1 1 1 0 2 1 2 0 2 0 3 1 3 1 4 1 3 1 3 0 6 1 5 0 5 1 5 1 6 12 3 3 0 3 1 5 0 6 출력 (2) 3

제 33 회한국정보올림피아드전국본선 (2016.7.16) 초등부, 중등부문제 1 알고리즘 수학여행에참가하는학생수 = 변수 n 한방에배정할수있는최대인원수 = 변수 k 학생의성별 = 변수 s ( 남자 : 1, 여자 : 0) 학생의학년 = 변수 y (1 ~ 6 학년 ) 학생수를체크할 2 차원배열 = count[ 학년 ][ 성별 ] 두번째줄부터입력되는학생정보 ex) 1 1 : 1 학년남학생, 0 6 : 6 학년여학생 scanf 로 n 과 k 의값을받은후, n( 학생수 ) 만큼반복하여 scanf 로학생정보를입력받는다.

제 33 회한국정보올림피아드전국본선 (2016.7.16) 초등부, 중등부문제 1 알고리즘 count[ 학년 ][ 성별 ] 배열로같은성별, 학년의학생이몇명이있는지수량을측정한다. ex) - 입력된학생정보 - 3 3 0 3 1 5 0 6 학생수 : 3, 방배정최대인원 3 명 count[3][0] = 1, count[5][1] = 1, count[6][0] = 1 (3 학년여자 1 명, 5 학년남자 1 명, 6 학년여자 1 명 )

제 33 회한국정보올림피아드전국본선 (2016.7.16) 초등부, 중등부문제 1 알고리즘 이중반복문을사용하여각학년별 (1~6 학년 ) 성별의인원수를체크하여방이몇개가필요한지파악한다. 1학년남자 : 2명 = 방 1개 1학년여자 : 1명 = 방 1개 2학년남자 : 1명 = 방 1개 2학년여자 : 2명 = 방 1개 3학년남자 : 3명 = 방 2개 3학년여자 : 1명 = 방 1개 4학년남자 : 1명 = 방 1개 5학년남자 : 2명 = 방 1개 5학년여자 : 1명 = 방 1개 6학년남자 : 1명 = 방 1개 6학년여자 : 1명 = 방 1개 식으로나타내면??? 입력과출력의예 입력 (1) 16 2 1 1 0 1 1 1 0 2 1 2 0 2 0 3 1 3 1 4 1 3 1 3 0 6 1 5 0 5 1 5 1 6

제 33 회한국정보올림피아드전국본선 (2016.7.16) 초등부, 중등부문제 1 소스

정보올림피아드중고등부 2016 기출 28. (1.8 점 ) 다음프로그램의출력결과는무엇인가? int a[5] = {0, 1, 2, 0, 3, b[5] = {1, 2, 4, 3, 4; int c[5][5]; int i, j, k; for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (i == j) c[i][j] = 0; else c[i][j] = 99; for (i = 0; i < 5; i++) { c[a[i]][b[i]] = 1; for (k = 0; k < 3; k++) // 주의 : k < 3 for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) if (c[i][j] > c[i][k] + c[k][j]) c[i][j] = c[i][k] + c[k][j]; printf("%d", c[0][4]); 1 0 2 1 3 2 4 3 5 99

정보올림피아드중고등부 2016 기출 28. (1.8 점 ) 다음프로그램의출력결과는무엇인가? int a[5] = {0, 1, 2, 0, 3, b[5] = {1, 2, 4, 3, 4; int c[5][5]; 구하고자하는것은 c[0][4] int i, j, k; 1 0 for (i = 0; i < 5; i++) { 처음 for에의해 for (j = 0; j < 5; j++) { c[0][0], c[1][1], c[2][2], c[3][3], c[4][4] = 0 if (i == j) c[i][j] = 0; 2 1 나머지는 99 else c[i][j] = 99; 두번째 for에의해 c[0][1], c[1][2], c[2][4], c[0][3], 3 c[3][4] 2 = 1 for (i = 0; i < 5; i++) { c[a[i]][b[i]] = 1; 값이변할때가언제인가? if(c[i][j] > c[i][k] + c[k][j]) 4 3 for (k = 0; k < 3; k++) // 주의 : k < 3 for (i = 0; i < 5; i++) 조건에서힌트를얻으면 for (j = 0; j < 5; j++) i!= j 5 99 if (c[i][j] > c[i][k] + c[k][j]) ( i=j이면값은 0을가지는데 0은클수없다 ) c[i][j] = c[i][k] + c[k][j]; printf("%d", c[0][4]);

정보올림피아드중고등부 2016 기출 28. (1.8 점 ) 다음프로그램의출력결과는무엇인가? int a[5] = {0, 1, 2, 0, 3, b[5] = {1, 2, 4, 3, 4; int c[5][5]; int i, j, k; for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (i == j) c[i][j] = 0; else c[i][j] = 99; for (i = 0; i < 5; i++) { c[a[i]][b[i]] = 1; for (k = 0; k < 3; k++) // 주의 : k < 3 for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) printf("%d", c[0][4]); 값이변할때가언제인가? 가능하다. if (c[i][j] > c[i][k] + c[k][j]) c[i][j] = c[i][k] + c[k][j]; 1 0 if(c[i][j] > c[i][k] + c[k][j]) 2 1 또다른힌트를얻으면 c[i][j]!= c[i][k] j!= k c[i][j]!= c[k][j] i!= k 3 2 ( 둘중하나만같아도 c[i][j] 가커질수없다 ) 4 3 c[i][k], c[k][j] 의값이 99 면안된다. -> 초기에는 c[0][1], c[1][2], c[2][4], c[0][3], c[3][4] 만

정보올림피아드중고등부 2016 기출 28. (1.8 점 ) 다음프로그램의출력결과는무엇인가? int a[5] = {0, 1, 2, 0, 3, b[5] = {1, 2, 4, 3, 4; int c[5][5]; int i, j, k; for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (i == j) c[i][j] = 0; else c[i][j] = 99; for (i = 0; i < 5; i++) { c[a[i]][b[i]] = 1; for (k = 0; k < 3; k++) // 주의 : k < 3 for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) printf("%d", c[0][4]); if (c[i][j] > c[i][k] + c[k][j]) c[i][j] = c[i][k] + c[k][j]; 조건에맞춰진행하면시간을아껴서빠르게풀수있다. 조건에성립되는것만요약하면, 첫번째, c[0][2] = c[0][1] + c[1][2] = 2 두번째, c[0][4] = c[0][2] + c[2][4] = 3 세번째, c[1][0] = c[1][2] + c[2][4] = 2 1 0 2 1 3 2 4 3 5 99