'Coding/CPP 삽질기'에 해당되는 글 45건

  1. 2016.08.20 Bit 연산 정리
  2. 2016.04.13 가장 넓은 직사각형 구하는 알고리즘 ( O(MN) )
  3. 2016.04.13 printf로 디버깅 하기
  4. 2016.03.30 C++ 컴파일러
  5. 2016.03.17 Lambda function 1
  6. 2016.03.16 Lambda function
  7. 2016.03.03 짝수만 출력하기
  8. 2015.12.23 Couple
  9. 2014.11.12 사각형 개수 구하기
  10. 2014.10.27 Mirror
Coding/CPP 삽질기2016. 8. 20. 12:49

arr[k >> 5] |= (1 << (k & 31));

arr[k >> 3] |= (1 << (k & 7));

'Coding > CPP 삽질기' 카테고리의 다른 글

Quick sort  (0) 2017.07.13
가장 넓은 직사각형 구하는 알고리즘 ( O(MN) )  (0) 2016.04.13
printf로 디버깅 하기  (0) 2016.04.13
Posted by chobocho
Coding/CPP 삽질기2016. 4. 13. 18:00

가장 넓은 직사각형 구하는 알고리즘 ( O(MN) )


/*
From :
http://stackoverflow.com/questions/7245/puzzle-find-largest-rectangle-maximal-rectangle-problem
*/

int findMaxRect (int rect[XSIZE][YSIZE]) {
	int ret = 0;
	unsigned int x = 0, y = 0, k = 0;
	int sum[YSIZE+1] = { 0, };
	int stack[YSIZE][2] = { 0, };
	int stIdx = -1;
	int width = 0;
	int y0 = 0, w0 = 0, tempArea = 0;
	
	for ( x = 0; x < XSIZE; ++x ) { 
		for ( y = 0; y <= YSIZE; ++y ) {
			sum[y] = rect[y][x] ? ++sum[y] : 0;
		}
		sum[YSIZE] = 0;
		width = 0;
		stIdx = -1;
		for ( y = 0; y <= YSIZE; ++y) {
			if ( sum[y] > width ) {
				stack[++stIdx][0] = y;
				stack[  stIdx][1] = width;
				width = sum[y];				
			} 
			else if ( sum[y] < width ) {

				while(1) {
					y0 = stack[stIdx  ][0];
					w0 = stack[stIdx--][1];
					tempArea =  width * (y - y0);
				  
					ret = tempArea > ret ? tempArea : ret;

					width = w0;
					if( sum[y] >= width) break;
				} 
				width = sum[y];
				if ( width != 0 ) {
					stack[++stIdx][0] = y0;
					stack[  stIdx][1] = w0;	
				}
			}
		}
	}	
	
	return ret;
}


'Coding > CPP 삽질기' 카테고리의 다른 글

Bit 연산 정리  (0) 2016.08.20
printf로 디버깅 하기  (0) 2016.04.13
C++ 컴파일러  (0) 2016.03.30
Posted by chobocho
Coding/CPP 삽질기2016. 4. 13. 17:25

#define DEBUG


#ifdef DEBUG

    #define cprintf(...) printf(__VA_ARGS__)

#else

    #define cprintf(...) 

#endif



'Coding > CPP 삽질기' 카테고리의 다른 글

가장 넓은 직사각형 구하는 알고리즘 ( O(MN) )  (0) 2016.04.13
C++ 컴파일러  (0) 2016.03.30
Lambda function  (1) 2016.03.17
Posted by chobocho
Coding/CPP 삽질기2016. 3. 30. 00:09

무료 C++ 컴파일러



1. 구름 IDE ( https://ide.goorm.io/ )

웹기반 IDE 이며, 기본 사용은 무료 이다.

웹 브라우져만 있으면 손쉽게 다양한 언어로 개발이 가능 하다.




2. C++ shell ( http://cpp.sh )

무료이며, 웹브라우져만 띄우면 짧은 코드를 쉽게 실행 할 수 있다.



3. Cygwin ( http://cygwin.com/install.html )

자세한 설명은 Cygwin 홈페이지를 참고하시면 됩니다.



4. Visual studio Express ( https://www.visualstudio.com/ko-kr/products/visual-studio-community-vs.aspx )

너무 유명하므로 설명은 생략 합니다.


'Coding > CPP 삽질기' 카테고리의 다른 글

printf로 디버깅 하기  (0) 2016.04.13
Lambda function  (1) 2016.03.17
Lambda function  (0) 2016.03.16
Posted by chobocho
Coding/CPP 삽질기2016. 3. 17. 00:56

[ C++ Lambda 함수 설명 ]

https://msdn.microsoft.com/ko-kr/library/dd293608.aspx

https://msdn.microsoft.com/ko-kr/library/dd293599.aspx

http://en.cppreference.com/w/cpp/language/lambda


'Coding > CPP 삽질기' 카테고리의 다른 글

C++ 컴파일러  (0) 2016.03.30
Lambda function  (0) 2016.03.16
짝수만 출력하기  (0) 2016.03.03
Posted by chobocho
Coding/CPP 삽질기2016. 3. 16. 01:02

#include <iostream>

using namespace std;


int main()

{

   int num = 2;

  

   auto sum = [](int n) -> int{ return n*n; }(num);

   

   cout << num << " " << sum << endl;

   

   return 0;

}



2 4


'Coding > CPP 삽질기' 카테고리의 다른 글

Lambda function  (1) 2016.03.17
짝수만 출력하기  (0) 2016.03.03
Couple  (0) 2015.12.23
Posted by chobocho
Coding/CPP 삽질기2016. 3. 3. 00:04

#include <iostream>

using namespace std;


int main()

{

    for (int i = 0; i < 100; i++) {

       i % 2 ||  cout << i << endl;   

    }

    return 0;

}




'Coding > CPP 삽질기' 카테고리의 다른 글

Lambda function  (0) 2016.03.16
Couple  (0) 2015.12.23
사각형 개수 구하기  (0) 2014.11.12
Posted by chobocho
Coding/CPP 삽질기2015. 12. 23. 00:42

#include <stdio.h>

#include <stdlib.h>


#define FALSE 0

#define TRUE  1



int IsSheBeautiful() { return (rand() % 101 > 99); }

int IsSheLikeMe()    { return (rand() % 51  > 49); }


int MeetGirl(int count) {

    int amIcouple = FALSE;

    

    // printf ("%d : I meet a girl!\n", count);

    

    if ( IsSheBeautiful() && IsSheLikeMe() ) {

        amIcouple = TRUE;

    }

    

    return amIcouple;

}


int Process() {

    int amIcouple = FALSE;

    int count = 0;

    

    while ( amIcouple == FALSE ) {

        amIcouple = MeetGirl(++count);      

    }

    printf ("I met %d girls\n", count);

    return amIcouple; 

}


int main(int argc, char **argv) {

    printf("%s\n", Process() == TRUE ? "I am not a single!" : "I am a sigle");

    return 0;

}


'Coding > CPP 삽질기' 카테고리의 다른 글

짝수만 출력하기  (0) 2016.03.03
사각형 개수 구하기  (0) 2014.11.12
Mirror  (0) 2014.10.27
Posted by chobocho
Coding/CPP 삽질기2014. 11. 12. 00:07

#include <stdio.h>


#define BLOCK 1

 

#define SIZE 5


int mirror[SIZE][SIZE] = {

    { 0, 0, 0, 0, 0},

    { 0, 1, 1, 1, 0},

    { 0, 1, 0, 1, 0},

    { 0, 1, 1, 1, 0},

    { 0, 0, 0, 0, 1},    

};


int process(void);

int checkIsRect(int x, int y);


int main (int argc, char **argv) {

    

    int count = process();

       

    printf ("%d\n", count);

    

    return 0;

}


int process(void) {

    int count = 0;

    int i = 0, j = 0;

    

    for ( i = 0; i < SIZE; i++) {

        for ( j = 0; j < SIZE; j++ ) {

            if ( mirror[i][j] == BLOCK ) {

                count += checkIsRect(j, i);

            }

        }

    }

    

    return count;

}


int checkIsRect(int posX, int posY) {

    int count  = 0;

    int isEnd  = 0;

    int x = posX;

    int y = posY;

    int width  = 0;

    int height = 0; 

    

    int x2 = posX;

    int y2 = posY;

    //int width2  = 0;

    //int height2 = 0; 

    

    /* Check Right -> Check Down */

    do  {

        mirror[y][x] = 0;

        x++;

        width++;        

    } while (x < SIZE && mirror[y][x] == 1);

    x--;

    

    do {

        mirror[y][x] = 0;    

        y++;

        height++;

    } while (y < SIZE && mirror[y][x] == 1);

    y--;

    

   /* Check Down -> Check Left */

    do {

        mirror[y2][x2] = 0;    

        y2++;

        //height2++;

    } while (y2 < SIZE && mirror[y2][x2] == 1);

    y2--;

    

    do {

        mirror[y2][x2] = 0;    

        x2++;

        //width2++;

    } while (x2 < SIZE && mirror[y2][x2] == 1);

    // Already mirror[y2][x2] == 0 

    // Because x == x2, y == y2

    // No need to x2--;

    

    if ( x == x2 && y == y2 && width >= 3 && height >= 3 ) {

        count = 1;

    }

    

    //printf ("x: %d y: %d x2: %d y2: %d width: %d height: %d \n", x, y, x2, y2, width, height);              

    

    return count;

}



'Coding > CPP 삽질기' 카테고리의 다른 글

Couple  (0) 2015.12.23
Mirror  (0) 2014.10.27
대칭행렬  (0) 2014.10.24
Posted by chobocho
Coding/CPP 삽질기2014. 10. 27. 00:56

#include <stdio.h>


#define UP 0

#define RIGHT 1

#define DOWN 2

#define LEFT 3


#define MIRROR_1 1

#define MIRROR_2 2


#define SIZE 5


int mirror[SIZE][SIZE] = {

    { 0, 0, 0, 0, 2},

    { 0, 1, 0, 2, 0},

    { 0, 2, 0, 0, 1},

    { 0, 0, 0, 1, 0},

    { 0, 0, 0, 0, 1},    

};


int process(int x, int y, int direction);


int main (int argc, char **argv) {

    

    int count = process(0, 0, RIGHT);

       

    printf ("%d\n", count);

    

    return 0;

}



int process(int x, int y, int direction) {

    int count = 0;

    int isEnd = 0;

    

    while ( isEnd == 0 && x >= 0 && x < SIZE && y >= 0 && y < SIZE) {

        switch(direction) {

            case UP:

                 while (y >= 0 && mirror[y][x] == 0) {

                     y--;

                 }

                 // printf ("Up %d %d\n", x, y);                   

                 break;

            case RIGHT:

                 while (x < SIZE && mirror[y][x] == 0) {

                     x++;

                 }

                 // printf ("Right %d %d\n", x, y);

                 break;

            case DOWN:

                 while (y < SIZE && mirror[y][x] == 0) {

                     y++;

                 }

                 // printf ("Down %d %d\n", x, y);

                 break;

            case LEFT:

                 while (x >= 0 && mirror[y][x] == 0) {

                     x--;

                 }

                 // printf ("LEFT %d %d\n", x, y);

                 break;

            default:

                 break;

        }

        

        if ( x >= 0 && x < SIZE && y >= 0 && y < SIZE ){

            if ( mirror[y][x] == MIRROR_1 ) {

               direction ^= 1;      

               count++;              

            } else if ( mirror[y][x] == MIRROR_2 ) {

               direction ^= 3;

               count++;

            }

                  

            switch (direction) {

                case UP : y--; break;

                case RIGHT : x++; break;

                case LEFT : x--; break;

                case DOWN : y++; break;

            }

            //printf ("%d %d %d\n",direction, x, y);

        } else {

            isEnd = 1;    

        }              

    };

    

    return count;

}


'Coding > CPP 삽질기' 카테고리의 다른 글

사각형 개수 구하기  (0) 2014.11.12
대칭행렬  (0) 2014.10.24
Programming 실습 예제  (0) 2014.03.28
Posted by chobocho