반복문?

 

- 같은 행동을 정해진 만큼 반복을 수행하는 문장

- 같은 코드를 복붙해서 넣으면 되지만 이렇게되면 코드의 가독성이 매우 낮고 효율도 낮아진다.

- 원하는 횟수, 조건 등에 맞춰 반복을 수행해줘서 같은 행동을 하는 코드라면 반복문으로 결합을 해보쟝

 

 

 

 

 

For 문의 형태

 

for문의 형태

초기식, 조건식, 변화식 뭔지 1도 모르겠지만 천천히 설명을 들어보자...

 

초기식 = 변수 선언하고 초기값 설정   ( 주로 이때 변수는 루프 본체에서도 사용되니깐 잘 생각하고 선언하자 )

조건식 = 변수에 대한 조건 ( 조건이 참이면 루프 본체 수행, 거짓이라면 반복문을 빠져나감 )

변화식 = 변수가 한번 진행 될때마다 어떻게 변할지 선언

 

만약 우리가 6번을 수행하고 싶다???

그러면 우리는 반복횟수를 루프선언문에서 선언을 해주고 처음에 0으로 지정해      ->      int i =0;

이후 조건을 i<6 으로 설정해보자 이건 왜 이렇게 설정했는지 다음에 설명함

그리고 변화식을 i++;로 해보자

 

이렇게 되면 조건식이 i<6이니깐 5번 수행하는거 아니냐 물어볼수있어

근데 for문의 진행 순서는 어떻냐면

 

 

조건 확인 -> 수행 -> 변화 -> 조건확인 -> 수행 -> .... 이런식으로 진행된다

 

그럼

i=0일때 1번 루프 돌고 i는 1로 변화

i=1일때 2번 루프 돌고 i는 2로 변화

i=2일때 3번 루프 돌고 i는 3로 변화

i=3일때 4번 루프 돌고 i는 4로 변화

i=4일때 5번 루프 돌고 i는 5로 변화

i=5일때 6번 루프 돌고 i는 6로 변화

이후 i=6이니깐  조건식을 만족시키니 않으므로 반복문을 종료시킨다.

 

 

 

- 다중 반복문 ( 이중 for문 )

 

이렇게 for문이 두개가 겹치는거는 코딩 좀만 하면 졸라 쉽게 봄

 

단순하게  안쪽에 있는 for문은 파란색을 반복하는거야 

이때 초기값이 j=1이고 조건식이 j<=i 이고, 변화식이 j++이니깐 총 i번 반복하는거겠네?

 

바깥쪽에 있는 for문은 빨간색을 반복하는데 10번 반복하는거지

 

이거를 잘 생각해봐 큰거부터 생각해봐

 

빨강 빨강 빨강 빨강 빨강 빨강 빨강 빨강 빨강 빨강   -     이렇게 빨강이 10번 수행하는거야 그런데 빨강이 뭔데? 파랑 i번 반복이고 이때 i는 바깥 for문에서 정해지지

 

그러면 위의 식은 아래와 같아지지

(파랑) (파랑 파랑) (파랑 파랑 파랑) (파랑 파랑 파랑 파랑) ..... (파랑 열개) 

 

왜 이딴거 쓰냐고? 

코테 많이 써보면 알아 이거 이중반복써야겠다.. ㅅㅍ..

 

 

 

 

 

 

 

break 문은 또 뭔데

 

반복하다 짜증나? 그럼 break 쓰세요. 만나면 반복 깨드립니다.

 

for문 안에 절대 break를 그대로 쓰진않아 왜냐면 그렇게 쓰면 반복안하고 1회 수행때 break 만나면 바로 반복문에서 빠져나오니깐

 

주로 if문 즉 조건문과 같이 사용해

위의 그림을 보면 100회 수행 반복문인데 조건안에 num1이라는 변수가 10이되면 반복 깨라하네

걍 10번만 수행하고 끝나는 문장이겠네

예시는 진짜 간단하지만 의외로 break가 유용하게 쓰일때가 있어

 

주로 무한반복문이야 ㅇㅅㅇ...

 

예를 들자면 골키퍼가 기다리고 있다가 공이 오면 공을 막으려는걸 생각해봐

골키퍼는 공이 오기 전까지는 가만히 있지 그런데 공이 오는 순간 가만히 있는걸 종료하고 공을 막는 행동을 하는거야

 

이를 코드로 대충 써보자면

 

for ( ; ; )     <- 이렇게 적어주면 무한반복임 알아두셈

{

    if ( 공이 골대로 날아온다 ) {

    break;

    }

}

 

왜 이건지 잘 생각해보셈..나는 정말 열심히 설명함....

 

 

 

 

 

 

 

While 문의 형태

 

for문에서 변한거는 총 두가지

 1. 초기식을 while문 이전에 선언해줘야함

 2. 변화식은 루프본체에 있음.   ( 만약 없다면 뭐 무한루프 도는거지 )

 

 

for 문의 진행과 완전 똑같아 

초기식 -> 조건식 -> 루프 와 변화식 -> 조건식 -> 루프와 변화식 -> 조건식 ....

모든 반복문은 조건부터 확인하고 루프와 변화를 한다 생각하면 됨.

 

while문과 for문이 왜 둘다 있냐고 물어보면 당당하게 이렇게 말할게

 

나도몰라.

 

근데 확실히 일반적인 반복문을 작성할때는 for문을 사용하는게 많아 왜냐면 좀더 읽기 편함 while은 변화식이 안에 있다보니 조큼 그렇긴하더라

 

그리고 while문은 주로 무한반복문 작성할때 사용하지

 

while ( true ){

반복

}

 

이렇게 설정한다면 조건이 항상 참이니깐 무한하게 반복을 하게되지 껄껄

 

 

 

 

 

 

 

 

Continue는 또 뭔데;;

 

 

일단 말할게 솔직히 나도 이거 왜쓰는지 모름

위의 두개의 코드를 비교해 보자

왼쪽은 continue 없고 오른쪽은 continue가 있어

 

continue는 뭐냐면 break처럼 만나면 이후 코드를 안해 하지만 반복문은 빠져나가지 않아.

 

루프 안에서 continue를 만난다면 루프의 이후 코드들을 수행 안하고 다시 조건식으로 가서 조건을 판단해 이후 다시 루프를 도는거야.

 

이거도 while문이랑 자주 쓰여서 왜 쓰는건진 모르겠어 그냥 if-else문 쓰면 되는거 아닌가...

For each문  =  python에서의 반복문처럼 배열의 요소를 통해 반복하는 구문

 

위를 사용하기 위해서는 주어진 배열의 자료형을 알아둬야함 아래의 예시를 보면

for ( int num : arr ){
        .... 수행할 내용 ....
}

 

arr[10]은 각 배열의 요소가 int 자료형을 취하고 있어야하며 각 배열의 index순서대로 for문 안에서 num이라는 변수로 사용가능하다.

 

다시 말하자면

 

for ( int i=0; i<10; i++){
        ..... 수행할 내용.....

}

 

여기에서는 arr[i]를 통해 배열의 요소에 접근한다면 위의 for each문에서는 num이라는 변수를 통해 접근이 가능하다.

 

for each문을 사용하면 코드의 내용을 좀더 쉽게 확인 가능하다.

 

하지만 for each문에서 사용될 배열을 동적할당으로 선언했다면 사용이 불가능하다.

 

하지막 std안에 있는 vector을 통해 동적할당을 했다면 사용 가능하다.

 

만약 for each문에서 각 배열의 요소에 대해 값을 불러오기만 한다면 위의 예시처럼 사용하면 되지만 만약 배열요소의 값을 변경하고 싶다면 아래와 값지 &를 사용해야한다.

 

for ( int& num : arr){
    .... 수행할 내용.....
}

 

게시글출처 : https://blog.naver.com/ckdgus1433/221443513440

 

오늘은 캐글(Kaggle) 사이트에 대해서 소개하려고 한다. 아마 데이터 사이언스, 머신러닝에 대해 관심이 있는 사람이라면 이미 많이 들어봤을 것이다. 머신러닝에 입문해서 홍콩과기대 김성훈 교수님의 '모두를 위한 머신러닝' 강의를 들어 보았고, MNIST와 CIFAR10과 같은 기본적인 예제도 거쳤다면, 필자는 다음으로 캐글에 입문하는 것을 추천한다.

캐글은 필자와 같은 머신러닝 입문자가 레벨업 할 수 있는 던전이자, 사냥터이다...

우리에게 Kaggle이란...(바람의 나라 - 초보자 사냥터)

캐글(Kaggle)은 2010년 설립된 빅데이터 솔루션 대회 플랫폼 회사이다. 21세기의 가장 섹시한 직업으로 데이터 사이언티스트가 꼽힐 만큼[하버드 비즈니스 리뷰] 빅 데이터(Big Data)가 사회 및 기업 환경에서 큰 화두로 떠오르면서 캐글의 규모도 같이 성장하게 되었고, 지난 2017년 3월, 구글은 캐글을 인수하기에 이르렀다.

[관련 기사] http://www.zdnet.co.kr/view/?no=20170309080842

기업 및 단체에서 Prize를 걸고 데이터와 해결 과제를 등록하면, 데이터 사이언티스트들이 이를 해결하기 위해 모델을 개발하고 경쟁하게 되는 시스템이다.

사이트에 들어가 보면, 엄청나게 많은 도전 과제들이 기다리고 있는 것을 확인 할 수 있다. 누구나 이 중 관심있는 과제를 골라서 경쟁에 참여할 수 있다. 다만, 큰 상금이 걸린 과제들은 대부분 난이도가 매우 높다.

처음 캐글에 입문하시는 분이라면, 가장 유명한 타이타닉 예제를 추천한다. 마침 캐글 코리아(Kaggle Korea)에서는 '캐글 코리아와 함께하는 1st ML 대회 - 타이타닉 생존자를 예측하라!' 라는 Competition을 진행중이다.

아래 그림의 우측 상단에 있는 Submit Predictions 버튼이 원래는 Join Competition인데, 이 버튼을 클릭해서 Competition에 참여할 수 있다.(필자는 이미 Join Competiton을 눌렀기 때문에 Submit Predictions로 표시된다.)

이제 캐글의 구성을 하나하나 살펴보도록 하자.

1. Overview

Overview에는 문제에 대한 간략한 소개와 문제 정의가 되어 있다. Competition이 생겨난 시나리오부터 시작해서 해결해야 하는 문제에 대한 정의까지 구체적이고 명확하게 설명되어 있는 것을 확인 할 수 있다.

캐글 코리아가 주관하는 타이타닉 생존자 예측 예제

2. Data

Data에는 예측 모델을 만들기 위해 필요한 데이터셋(Training, Test 데이터셋)이 친절하게 업로드 되어 있고, 데이터의 Feature가 되는 Data fields에 관한 설명까지 되어 있다.

타이타닉 예제의 Training Data

Training Data를 보니 어떤 문제를 풀어야 하는지 좀 더 명확하게 감이 온다.

결국 성별, 나이, 이름, 티켓 등과 같은 특징을 갖는 데이터를 넣었을 때, 이 데이터의 Survived가 0이냐 1이냐를 예측하는 문제이다. 구체적인 문제 해결방법에 대해서는 다음에 포스팅하기로 하고, 캐글 사이트에 대해서 좀 더 둘러보자.

3. Kernels

이 문제를 해결하기 위한 방법은 여러가지가 있을 것이다. 사람마다 해결하는 방법이 다를 것이고, 모델을 최적화하는 방법 또한 다를 것이다. Kernels에서는 다른 사람들이 어떤 모델을 써서 구현을 했는지 힌트를 얻을 수 있고, 또한 내가 구현한 모델이 과연 올바른지에 관해서 코멘트를 주고받을 수 있다.

문제 해결을 위한 코딩을 시작하기 너무 막막하다면, 이들의 코드를 가져다가 응용하는 것부터 시작하는 것을 추천한다. 창조를 위해서 모방을 먼저...

4. Discussion

Discussion은 같은 문제에 직면해 있는 사람들과 질의 응답을 할 수 있는 매우 유용한 공간이다. 예측 모델을 만들다가 생기는 수 많은 궁금증을 이곳에서 공유하고, 같은 문제에 직면했던 사람들과 자유롭게 Discussion 할 수 있다.

5. Leaderboard

Leaderboard는 모델의 예측 정확도를 기준으로 랭킹이 매겨지는 공간이다. 코피터지는 무한 경쟁을 통해 참가자들은 조금 더 높은 예측 정확도를 갖는 모델을 어떻게 만들어 낼 수 있는지에 대해서 공부하게 되고, 그러면서 자연스레 여러가지 머신러닝 기법들을 찾으려 시도한다. 내 모델이 과연 어느정도의 성능을 나타낼지 랭킹을 확인하는 일은 콩닥콩닥 아주 흥미로울 것이다.

현재 7위를 보면, 4명의 인원이 팀을 이루어서 진행하는 것도 확인할 수 있다. 이처럼 Competition은 개인뿐만아니라 팀으로도 참여할 수 있다.

*Public Learderboard와 Private Learderboard

Competition에 참가하게 되면 알게 되겠지만, 내 모델이 예측한 답이 정답인지 아닌지는 주최측만 알 수 있다. Competition이 종료되기 전에는 Public Learderboard에서 내 모델이 예측한 결과의 50%를 기준으로 Accuracy를 계산하고, 랭킹을 산정한다. 그리고 Competition이 종료되면 나머지 50%의 결과까지 포함해서 랭킹을 산정하게 된다.

다시 말해, 우리는 Competition이 종료되기 전에 대략적인 랭킹만 알 수 있고, Competition이 종료 되고 나서야 정확한 랭킹을 알 수 있게 된다. 즉, 끝날 때 까지는 끝난게 아니라는 것이다.

6. Submit Predictions - Learderboard에 내 이름 올리기

모델을 구현했고, 어느 정도 성능을 확인했다면 이제 당신이 랭커가 될 차례이다. 내 모델이 예측한 결과를 csv파일로 저장한 다음, 해당 파일을 Upload Files에 드래그하여 업로드 할 수 있다. 즉, 모델에 Test data를 입력했을때, 0 또는 1로 이루어진 Survived 레이블의 값을 csv파일로 저장하고 이곳에 업로드하게 되는 것이다.

나도 랭커다

7. 여담

약간의 여담을 하자면, 필자는 머신러닝 수업 때 처음 캐글 사이트를 알게 되었다. 위의 Leaderboard는 당시 같이 수업 듣는 학생들과 진행했던 이미지 분류 과제(CIFAR10)인데, 교수님께서는 Learderboard에 올라간 랭킹대로 학점을 주시겠다고 하셨다. 0.01라도 정확도를 향상시켜 내 사랑하는 동기들을 눌러야만이 비로소 내 학점을 올릴 수 있는게 아닌가, 그래서 모두 서로의 랭킹을 의식하며 코피터지도록 경쟁했던 기억이 있다.

처음에는 '에라이, 결과만이 중요한 세상!'이라며 적당히 제출만 하자는 마인드로 임했었는데, 랭킹에 이름을 한번 올리고 나서는 밤 늦게까지 변태처럼 0.01의 정확도에 집착하고 있는 나의 모습을 발견할 수 있었다...

조금 고생스럽기도 했지만, 정확도를 올리기 위해서 대체 어떻게 해야할까에 대해서 열심히 서칭을 하게 되면서 많은 머신러닝 기법들을 배우게 되었던 기억이 있다. 이것이 필자가 캐글을 더더욱 추천하고 싶은 이유이다.

자, 이제 여러분이 하고 싶은 Competition에 참여하고, 랭커가 되어보자.

Kaggle 하기

https://www.kaggle.com/

혼자 공부한거라 틀린 내용일수도 있습니다.

 

입출력 스트림중 입력 스트림은 eof ( end of file ) 을 만나게 되면 동작을 끝내게 된다.

 

cin의 버퍼는 eof만난 순간 버퍼를 fail로 두고 X에 변수를 저장하지 않으므로 X의 값은 변하지 않게된다.

 

예를 들어 데이터를 받고 단순 데이터를 출력하는 과정을 생각해보면

입력 cin >> X cout << X Is endOfFile?
a a a F
b b b F
EOF EOF b T

 

 

cin에서 받은 데이터가 eof인지 확인하는 방법은 cin.eof()를 호출하여 cin의 버퍼가 fail이 되었는지 확인하는 방법이다.

 

만약 cin의 버퍼가 EOF임을 확인 먼저 하고 입력을 받게 된다면 위의 표와 같이 a b b 를 출력하게 되므로

 

cin을 먼저 받고 cin.eof()를 호출해야 a b 즉 우리가 원하는 부분에서 끝나게 된다.

 

cin >> X

cin.eof() 이 두 문장을 한번에 하고 싶다면

( cin >> X ).eof() 로 사용하면 된다.

 

혼자 공부한거라 틀린내용이 있을수 있습니다.

 

 

1. ios_base::sync_with_stdio(false);

C++ 에서 입출력을 하기위해

#include <iostream> 을 사용한다.

 

이때 iostream 라이브러리는 C++ 뿐만 아닌 C언어의 입출력 구문도 할수 있도록 동기화를 해준다.

즉 C언어의 stdio와 C++ 의 iostream 을 모두 가져온다.

 

 

단순하게 생각하면 모든 입출력 순간 stdio 와 iostream 인지 구분하고 그에 맞는 함수를 호출하는 동작을 할거 같음

 

 

그러므로 stdio를 비활성화 시킴으로 오직 C++의 iostream만 사용해 시간을 줄이는 방법인거 같음.

 

 

 

2. cin.tie(NULL);

위와 같은 문장을 수행하면 name을 입력 받기전에 Enter name : 문장이 출력되고 name을 받게 된다.

즉 cout 수행이 완료되기 전까지 즉 cout구문이 완전히 출력된때까지 cin을 받을수 없다. 

 

cout 동작에 대충 설명하자면 cout 버퍼로 출력할 데이터를 보내고 자동으로 출력 함수를 호출하여 화면에 출력해준다.

 

cin은 위의 cout의 출력 동작이 된것을 확인하고 그 이후에 데이터를 받게된다.

 

하지만 cin.tie(null)을 수행하면 cout과 cin의 연결을 풀어서 출력의 수행 여부와 상관 없이 데이터를 받을수 있게된다.

 

즉 "Enter name:" 이 나오기 전에 사용자의 입력을 받을수도 있다.

 

cin.tie(null)을 사용 했을때도 cout과 cin의 순서를 유지시키고 싶다면 std::flush나  std::endl 를 추가해서 사용해야한다.

 

하지만 이를 너무 많이 사용하면 cin.tie(null) 쓴거랑 안쓴거랑 별 차이 없다.

 

 

cin.tie(null)은 cout과 cin을 같이 사용안할때, 또는 작은 값들을 여러번 받아올때 사용하면 속도 개선에 긍정적인 영향을 줄거같음 ㅇㅅㅇ..

 

 

3. endl 대신 개행문자 사용 ( \n )

보통 개행문자 \n은 문자열을 출력할때 사용할수 있어 주로 endl 을 사용했었는데

 

이또한 속도에서 차이가 있다 ㅇㅅㅇ..

 

아직 모든것을 이해 못했지만

 

\n과 endl 모두 버퍼를 출력하는  연산을 수행한다.

 

endl은 cout의 버퍼를 출력하고 비워주는 flush() 함수까지 호출한다.

 

하지만 \n 은 버퍼만 출력하고 flush()는 안하므로 좀더 빠른 수행

 

 

 

 

 

+ Recent posts