목록전체 글 (32)
닌자고양이
#include #include #include using namespace std;template static double std_dev(Iter begin, Iter end){ size_t n = distance(begin, end); if (n == 0) return 0.0; double sum = accumulate(begin, end, 0.0); double mean = sum / n; double var_sum = 0.0; for (auto it = begin; it != end; it++) { auto diff = (double)(*it - mean); var_sum += diff * diff; } return sqrt..
위 처럼 3자리 마다 콤마를 추가하는 기능으로최대한 간결하고 성능을 극대화 한 함수를 만들었다.#include using namespace std;string comma(int n){ string s = to_string(n); for (int i = s.size(), j = n j;) s.insert(i, 1, ','); return s;} 콘솔 출력 예시:cout 빠른 성능위의 insert 방식은 여러 문자의 메모리 이동이 콤마 개수만큼 일어나고 경우에 따라 메모리 재할당도 일어나서 언뜻 최적의 성능은 아닐 것처럼 보인다. 하지만 대부분의 경우 13자리(1조)보다 작은 수가 압도적으로 많이 사용되는데, 12자리 숫자까지는 콤마를 추가해도 "123,456,..
Honorable Justices of the Constitutional Court, and dear citizens who have been watching this trial with interest, It has been 84 days since I declared martial law on December 3rd of last year. These have been the most difficult days of my life, but they have also been a time of gratitude and reflection. Looking back on myself, I have come to realize that I have received an overwhelming amount o..
존경하는 헌법재판관 여러분, 그리고 이 재판을 관심가지고 지켜봐주신 사랑하는 국민 여러분, 작년 12월 3일 비상계엄을 선포한 후, 84일이 지났습니다. 제 삶에서 가장 힘든 날들이었지만, 감사와 성찰의 시간이기도 했습니다. 저 자신을 다시 돌아보면서, 그동안 우리 국민들께 참 과분한 사랑을 받아왔다는 생각이 들었습니다. 감사한 마음이 들면서도, 국민께서 일하라고 맡겨주신 시간에 제 일을 하지 못하고 있는 현실이 송구스럽고 가슴이 아팠습니다. 한편으로, 많은 국민들께서 여전히 저를 믿어주고 계신 모습에, 무거운 책임감도 느꼈습니다. 국민 여러분께 죄송하고 감사하다는 말씀을 먼저 드리고 싶습니다. 제가 비상계엄을 선포하고 몇 시간 후 해제했을 때는 많은 분들께서 이해를 못하셨습니다. 지금도 어리둥절해 하시..
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..