목록분류 전체보기 (28)
닌자고양이
ASCII 코드표 (0-127) 0x03 CTRL+C 프로세스에 종료 신호 전송 0x04 CTRL+D 유닉스 입력 종료 0x1A CTRL+Z 윈도우 입력 종료 (유닉스는 프로세스 일시중지) SPACE 는 Printable 문자이면서 제어 문자이기도 함 확장 ASCII 코드표 (128-255) ASCII 7비트 미국 영어 문자 집합 (0~127). 거의 대부분의 문자 집합이 ASCII 문자 구간을 동일한 문자로 정의. ANSI ASCII 에서 확장된 8비트 문자 집합을 지칭. 대표적으로 Windows-1252, IBM-437, ISO-8859 시리즈 등. 이에 기반한 CP-949 같은 멀티 바이트(가변 길이) 문자 집합들도 ANSI 문자라 함. ISO-8859-1 (Latin 1) 확장 ASCII 로 라틴..
0x03 CTRL+C 프로세스에 종료 신호 전송 0x04 CTRL+D 유닉스 입력 종료 0x1A CTRL+Z 윈도우 입력 종료 (유닉스는 프로세스 일시중지) SPACE 는 Printable 문자이면서 제어 문자이기도 함
%[character-set] // 허용 문자세트 지정. 허용 문자 이외의 문자가 입력되면 그 이전까지 문자열만 추출 %[^character-set] // 비허용 문자세트 지정. 비허용 문자가 입력되면 그 이전까지 문자열만 추출 포맷 예 %[ab ] // 문자 리스트 (a,b,공백 에 매칭) %[a-c] // 문자 범위 (a,b,c 에 매칭) %[a-cd1-3] // 리스트와 범위 조합 (a,b,c, d, 1,2,3 에 매칭) %[^\r\n] // 제외식 (개행, 리턴 문자 이전까지 매칭) ] - ^ 를 문자세트에 지정하려면 ] 를 매칭 문자로 지정하려면 ]문자를 두번 써준다. %[abc]]] - 를 매칭 문자로 지정하려면 맨 마지막에 써준다. %[abc-] ^ 를 비허용 문자로 지정할 때에는 그대로 쓰..
\a 경고음 \b 백스페이스 \f 페이지 전환 \n 개행 \r 리턴 \t 수평 탭 \v 수직 탭 \\ 역슬래시 \' 작은 따옴표 \" 큰 따옴표 \# ~ \### 8진수로 1바이트 문자 표현 (ANSI) \x# ~ \x## 16진수로 1바이트 문자 표현 (ANSI) \u# ~ \u#### 16진수로 2바이트 문자 표현 (UTF-16) \U# ~ \U######## 16진수로 4바이트 문자 표현 (UTF-32)
SELECT * FROM ( SELECT 1 AS col ) a 위의 인라인뷰 a를 아래와 같이 WITH 절을 사용해 쿼리 앞에 사용하는 방식이다. WITH a AS ( SELECT 1 AS no ) SELECT * FROM a 인라인뷰에 비해 좋은 점은 WITH 식을 한번 선언후 여러 FROM 절에서 참조할 수 있다는 점과, 재귀 쿼리 기능을 제공한다는 점이다. 아래 예제는 컬럼 별칭의 정의와 ,을 사용해 여러개의 CTE를 정의하는 것을 보여준다. WITH a("컬럼별칭") AS ( SELECT 1 ), b("컬럼별칭") AS ( SELECT 2 ) SELECT * FROM a UNION SELECT * FROM b WITH 절의 재귀 쿼리는 UNION ALL 을 사용한다. -- 1부터 10까지 출력 ..
1.콘솔에서 dotnet publish 명령어를 사용하는 portable한 방법 프로젝트 파일이 있는 디렉터리에서 다음 명령어를 입력한다. dotnet publish -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeAllContentForSelfExtract=true 옵션 설명: -r win-x64 대상 시스템의 Runtime-ID로 win-x64, win-x86, linux-x64, linux-arm, linux-arm64, osx-x64 등 --self-contained true 배포에 자체적으로 .NET 런타임을 포함한다. false 또는 생략시 시스템에 설치된 런타임을 사용하며 일치하는 런타임 버전이 없을 시 실행이 안된다..
이진수 -> 십진수 방법은 다음과 같다. ... 10000 -> 1*(2^4) = 1*16 = 16 1000 -> 1*(2^3) = 1*8 = 8 100 -> 1*(2^2) = 1*4 = 4 10 -> 1*(2^1) = 1*2 = 2 1 -> 1/(2^0) = 1/1 = 1 0.1 -> 1/(2^1) = 1/2 = 0.5 0.01 -> 1/(2^2) = 1/4 = 0.25 0.001 -> 1/(2^3) = 1/8 = 0.125 0.0001 -> 1/(2^4) = 1/16 = 0.0625 ... 소수점 이하만 보면, 이진수 1 = 십진수 1 이고, 이진수 0.1 + 0.1 = 1 이므로 이진수 0.1 의 십진수 값은 1/2 = 0.5, 이진수 0.01 + 0.01 = 0.1 이므로 이진수 0.01 의 십진..
반복문을 사용하면 이렇게 간단하게 작성할 수 있지만 int n; int a = 1234567890; for (n = 1; a > 9; n++) a /= 10; printf("%d", n); 반복문이 없다면 if 문을 여러번 사용해야 한다. int 형의 최대 값이 10자리 (2147483648) 이므로 9번 사용하면 되겠다. int n = 1; int a = 1234567890; if (a > 9) a /= 10, n++; if (a > 9) a /= 10, n++; if (a > 9) a /= 10, n++; if (a > 9) a /= 10, n++; if (a > 9) a /= 10, n++; if (a > 9) a /= 10, n++; if (a > 9) a /= 10, n++; if (a > 9)..
1. C 의 strpbrk 함수를 사용한 delimiter 문자 검색 (가장 빠름) #include #include int main(void) { char str[] = "This_is,the,,C/C++ world"; char del[] = "/, _"; char *start = str, *stop = start; for (; stop != NULL; start = stop + 1) { if (stop = strpbrk(start, del)) *stop = NULL; printf("%s\n", start); } } 출력: This is the C C++ world 2. C 의 strtok 함수를 사용한 delimiter 문자 검색 strtok 함수는 strpbrk 와 비슷한데, 발견된 구분자 위치에 자..
ifstream, ofstream 은 생성자에 ios::binary 옵션을 주지 않으면 기본적으로 텍스트 모드로써, 개행 문자(윈도우 CR+LF, 유닉스 LF, 맥 CR)를 읽을 때는 LF 로 치환해 읽어오고, 쓸때는 LF 를 해당 OS별 개행 문자로 치환해 저장한다. 스트림 종료 문자(윈도우 CTRL+Z(0x1A), 맥/유닉스 CTRL+D(0x04))가 발견시 스트림 또는 파일의 끝으로 간주해 더 이상 읽기는 실패하며 eof() 는 true 가 된다. 1.한 문자씩 읽기 #include #include using namespace std; int main() { ifstream file("file.txt"); while (!file.eof()) cout
Linq 사용 string[] Split(string str, int len) { var chunks = Enumerable.Range(0, (str.Length + len - 1) / len); return chunks.Select(p => str.Substring(p * len, Math.Min(str.Length - p * len, len))).ToArray(); } 반복문 사용 string[] Split(string str, int len) { int i, count = (str.Length + len - 1) / len; var arr = new string[count]; for (i = 0; i < count - 1; i++) arr[i] = str.Substring(i * len, len);..
C++ 로케일 설정 후 wifstream 으로 읽기 #include #include using namespace std; int main() { locale::global(locale(".UTF-8")); wifstream f(L"text.txt"); wstring wstr; f >> wstr; } fopen 의 파일 모드 옵션에 인코딩 타입 지정해 읽기 (ccs=UNICODE 또는 UTF-8 또는 UTF-16LE) #include int main(void) { wchar_t buf[10000]; FILE* f = fopen("text.txt", "rt+,ccs=UTF-8"); fwscanf(f, L"%ls", buf); // scanf 포맷으로 읽기 fgetws(buf, 1000, f); // 한 줄 ..
// 최소 비교로 중간값 구하기 int mid(int a, int b, int c) { if (a < b) return b < c ? b : (c < a ? a : c); else return a < c ? a : (c < b ? b : c); } /* 몹쓸(?) 방법들 난독성 define #define mid(a,b,c)(a , c); // max return a + b + c - n - m; } */
using System.Runtime.InteropServices; class Program { [DllImport("msvcrt.dll")] public static extern int printf(string format, __arglist); public static int printf(string format) => printf(format, __arglist()); [DllImport("msvcrt.dll")] public static extern int scanf(string format, __arglist); public static int scanf(string format) => scanf(format, __arglist()); [DllImport("msvcrt.dll")] static ..
bool IsOverlap(TimeSpan a1, TimeSpan a2, TimeSpan b1, TimeSpan b2) { if (a1 > a2) return IsOverlap(a1, TimeSpan.FromHours(24), b1, b2) || IsOverlap(TimeSpan.Zero, a2, b1, b2); else if (b1 > b2) return IsOverlap(a1, a2, b1, TimeSpan.FromHours(24)) || IsOverlap(a1, a2, TimeSpan.Zero, b2); else return (a1
PIVOT SELECT m1, m2, m3, m4 FROM ( SELECT 'm1' col, 10 val UNION ALL SELECT 'm2' col, 20 val UNION ALL SELECT 'm3' col, 30 val UNION ALL SELECT 'm4' col, 40 val ) a PIVOT ( SUM(val) FOR col IN (m1, m2, m3, m4) ) b 결과 m1m2m3m4 10203040 UNPIVOT SELECT col, val FROM ( SELECT 10 AS m1, 20 AS m2, 30 AS m3, 40 AS m4 ) a UNPIVOT ( val FOR col in (m1, m2, m3, m4) ) b 결과 colval m110 m220 m330 m440
결과 집합을 단일 XML 태그 문자열로 반환하는 FOR XML PATH 을 사용하는 편법. 가장 좋은건 사용자 정의 Aggregate 함수를 .NET dll 로 만드는 것인데 잠시 쓸거라면... 다소 복잡한 구문이지만 별도의 확장 작성 없이 SELECT 한줄로 해결하는 유일한 방법이다. WITH T(col) AS ( SELECT 'aaa' UNION ALL SELECT 'bbb' UNION ALL SELECT 'ccc' ) SELECT STUFF((SELECT CONCAT(',', col) FROM T FOR XML PATH('')), 1, 1, '') -- MSSQL 2017 에서는 간단히 다음처럼 사용 가능 -- SELECT STRING_AGG(col, ',') FROM T CONCAT 으로 모든 값..
DAYSHOLYDAY_YNHOLYDAY_STR 2017-01-0111 2017-01-0200 2017-01-0300 2017-01-2211 2017-01-2312 2017-01-2400 2017-01-2500 2017-01-2600 2017-01-2711 2017-01-2812 2017-01-2913 2017-01-3014 1은 휴일, 0은 평일을 뜻하는데, 당일이 몇일 연속 휴일인지 알아내는 문제이다. 0 과 1 두가지 만으로 구성된 데이터를 연속성만으로 증분 그룹핑하기가 의외로 까다롭다. SELECT DAYS, HOLYDAY_YN, HOLYDAY_YN * RANK() OVER (PARTITION BY d ORDER BY DAYS) HOLYDAY_STR FROM ( SELECT *, MAX(CASE W..
숫자 테이블을 만들어 두는 것이 가장 좋지만 쿼리만으로 생성하고자 할 때 1.시스템 테이블 사용 (가장 빠름) SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS no FROM sys.all_objects a, sys.all_objects b, sys.all_objects c -- 100억 ) a WHERE no < 1000 --MSSQL SELECT TOP 1000 ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS no FROM sys.all_objects a, sys.all_objects b, sys.all_objects c -- 100억 뷰로 만들어 쓰기 CREATE VIEW V_Numbers AS SELECT ..
개행 문자가 입력되거나 입력이 종료될 때까지 문자열을 입력 받아 공백으로 구분된 숫자들을 추출하는 예제 1. string.h 의 gets_s, strtok 사용 #define _CRT_SECURE_NO_WARNINGS #include #include int main() { char str[100], *s; int num[100], i, cnt = 0; gets_s(str); for (s = strtok(str, " "); s; s = strtok(NULL, " "), cnt++) // strtok 에 구분자 지정 if (sscanf(s, "%d", &num[cnt]) < 1) break; for (i = 0; i < cnt; i++) printf("%d\n", num[i]); } 입력: 1 2 34 56..
1. 한글 윈도우(CP949)인 경우 코드 페이지를 CP1252로 변경해 윈도우 확장 아스키 문자 출력 윈도우 표준 8비트 코드 페이지 CP1252(Windows-1252, ISO-8859-1, 라틴 알파벳 문자 집합) 사용 #include #include int main() { SetConsoleOutputCP(1252); // 코드 페이지 CP1252 로 변경 printf("%c", 216); // 윈도우 확장 아스키 문자 Ø 출력 } * 코드 페이지를 1252 대신 437 을 사용하면 도스 확장 아스키 문자 ╪ 를 출력한다. 2. 콘솔 출력 스트림을 유니코드 모드로 변경한 뒤 유니코드 문자 함수를 사용 유니코드는 16비트 코드 페이지로 8비트 코드 페이지 1252를 하위 호환함 #include #i..
windows #include #include int main(void) { int c = 0; while (c != 3) { c = _getch(); // ctrl+c 입력시 ascii code 3 (End Of Text) 반환 printf("getch %d\n", c); } printf("break\n"); } linux #include #include bool m_break = false; void OnSignal(int sig) // 콘솔 ctrl+c 입력시 인터럽트 발생 { signal(sig, SIG_IGN); printf("break\n"); m_break = true; } int main(void) { signal(SIGINT, OnSignal); // 인터럽트 시그널 콜백 설정 while..
#include int main(void) { for (int i = 1, j = 1; i 0 && j % 10 && j % 10 % 3; j /= 10); }
#include #include void eratos_sieve(int n, char* primes) // primes size = n + 1 { int i, j; for (i = 2; i
char* NumToString(int num, int radix, char* outbuf) { char* p = outbuf, charset[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for (int n = num; n > 0; n /= radix) p++; for (*p-- = 0; num > 0; num /= radix) *p-- = charset[num % radix]; return outbuf; } char s[100]; printf("%s", NumToString(1234, 16, s)); // 1234를 16진수 문자열로 출력 ==> 4D2 printf("%s", NumToString(1234, 2, s)); // 1234를 2진수 문자열로 출력 ==> 1..
scanf() 사용시 엔터까지 입력을 한 경우 입력 버퍼에서 마지막 개행문자 '\n' 는 비우지 않는다. 그래서 이후에 문자나, 문자열을 읽으려 할때 개행문자 또는 빈문자열만 들어오는 일을 겪는다. 이 문제를 해결하려면 입력 버퍼에서 개행 문자 '\n' 를 비워주어야 한다. // 후속 scanf 에서 이전 개행 문자를 제거하면서 입력 받기 scanf("%d", &d); scanf("\n%c", &c); // \n, \t, 공백 등 사용 가능 // 개행 문자까지 한번 비우기 (getchar 사용) while(getchar() != '\n'); // 개행 문자까지 한번 비우기 (scanf 사용) scanf("%*[^\n]"); scanf("%*c"); // 연속된 모든 개행 문자 비우기 (C++) cin.i..
LINQ 의 query 구문은 쓰고 싶지 않지만 join 문 같은 경우 Enumerable Method 로만 코딩하기는 너무 복잡하므로 쿼리를 사용해 본다. void AddRow(DataTable dt, params object[] cols) { DataRow row = dt.NewRow(); for (int i = 1; i
n번째 피보나치 수를 구하는 재귀 함수. 직관적이나 실행시간 O(n^2) int fib(int n) { if (n