숫자 카드: 백준 10815번 문제

n개의 카드를 받았을 때,
m개의 숫자카드 중 가지고있는 카드가 무엇무엇인지를 판단하는 문제

문제 이해 및 풀이

arr1에 n개의 숫자를 받고,
std::sort 알고리즘으로 미리 정렬해놓는다.

sort 알고리즘은 <algorithm> 헤더파일에 있고
퀵소트로 정렬하여 O(nlogn)의 시간복잡도를 가진다.
sort(start, end, compare)으로
첫번째인자는 시작주소,
두번째인자는 끝주소,
마지막인자는 비교함수를 옵션으로 넣어줄 수 있다.
기본값은 오름차순 정렬이다.

다시 돌아와서,
m개의 숫자를 받아
각 숫자가 n개의 카드에 존재하는지 여부를 출력해주기 위해
바이너리서치 함수로 전달한다.
함수로 배열을 전달할 때 길이정보가 같이 넘어가지는 않으므로, 꼭 인자로 따로 넘겨주어야 한다.

재귀적 방법과 반복문을 사용하는 방법 두 가지가 있다.

재귀적 방법

처음 인덱스 0부터 끝까지 인자로 넘겨놓고,
매번 중간값을 확인한 후
더 클경우 중간값+1을 first값으로 재귀호출한다.
더 작을경우 중간값-1을 last값으로 재귀호출한다.
찾지 못했는데 first값이 last값을 초과해버리면 원하는 값이 없는것.

직관적 이해:
search(first=1, first=2) 호출의 경우
인덱스 1 2에서 중간값은 1이되고 없을경우 중간값1+1=2가 초기값 first가 된다.
search(first=2, last=2)가 된다.
이번호출에서는 중간값이 2가되고 fisrt=3 last=2가 되어 탈출조건을 만족한다.

void search(int* arr1, int a, int first, int last) {
    if(first>last) {
        printf("0");
        return;
    }
    int mid = (first + last) / 2;
    if(arr1[mid] == a) {
        printf("1");
        return;
    }
    else if(arr1[mid] < a)
        search(arr1, a, mid+1, last);
    else if(a < arr1[mid])
        search(arr1, a, first, mid-1);
}

// 함수 호출부
search(arr1, arr2[i], 0, len-1);

반복문 사용 방법

함수 호출에는 배열, 찾고자하는 값, 배열길이를 인자로 넘겨준다.
while문에서 마찬가지로 first가 last를 초과하는 순간을 탈출조건으로 잡는다.

void search(int* arr1, int a, int len) {
    int first = 0;
    int last = len-1;
    int mid;

    while(first<=last) {
        mid = (first+last)/2;
        if(arr1[mid]==a) {
            printf("1");
            return;
        }
        else if(arr1[mid]<a) {
            first = mid+1;
        }
        else {
            last = mid-1;
        }
    }
    printf("0");
    return;
}

내장 과민이 왜 생기게 되는가?

결론부터 말하자면, 헬리코박터균 때문이다.

최근 들어서는 애초에 기질적으로 '민감성 장 증후군'을 안고 태어나는 것이 아니라
소아 때부터 헬리코박터균에 감염되어 민감한 장을 안고 살아가는 것이라 생각이 든다.
과민성 장 증후군의 원인규명도 안되지 않았는가.

어리고 건강할 때는 헬리코박터균으로 인한 위장 염증반응이 빠르게 재생되고 회복되어 괜찮았지만
나이가 들어 재생능력이 저하되면, 염증반응에 의한 증상이 심해져 기능성 소화불량증, 위염 등이 생기게 되는 것이다.

헬리코박터 감염 시 특이증상

소화불량, 속쓰림, 기능성 소화불량 모두 헬리코박터균의 증상일 수 있다.
관련 내용을 유튜브나 구글에 검색해보면 어렵지 않게 찾을 수 있는 내용들이다.
하지만 이들 증상은 헬리코박터 감염의 결과로만 나오는 특이적 증상이 아니기에, 쉽게 간과할 수 있는 증상들이다.

오늘은 헬리코박터 보균자로서 직접 체감한, 일반적 소화불량과 약간 다른,
헬리코박터 감염과 병과를 인지할 수 있는 특이적 증상들을 정리해보았다.
물론 무심코 지나가면 알 수 없고, 우리 몸의 소리에 열심히 귀기울여야 알아챌 수 있다.

첫째, 매운 것을 못 먹게 됨

흔하디 흔한 소화불량보다 좀더 확실한 것은, 매운 것을 먹지 못하게 변한다는 것이다.
어디서 들은 적도 없고 순전히 뇌피셜이지만 높은 확률로 확신한다.

하루하루 매운 음식이 더 맵게 느껴진다.
신라면도 맛있게 먹던 내가
어느날부터 비빔면도 맵게 느껴지고
심지어 일반 음식점에 나오는 김치까지 맵게 느껴진다.

일주일 전에 먹었던 똑같은 음식이, 오늘 갑자기 더 맵게 느껴진다.
물론 먹고나면 속이 아파 밤잠을 설치는 경우가 잦아진다.
"내가 이정도로 매운 것도 못먹었었나?" 하는 생각이 들게 된다.

이는 사실 매운 음식뿐만 아니라, 장에 자극을 일으키는 모든 음식에 해당되는 얘기일 수 있다.
예를 들면 커피도 그렇다.
어렸을 때 아무런 문제 없이 마시던 커피가 이제는 위에 부담을 주는 음식이 되었다.
개인적으로 점점 먹지 못하는 음식이 늘어간다(블루베리, 피넛버터 등).

헬리코박터균의 증식이 억제되고 위장이 회복되었을 때 다시 위 음식들을 마음껏 먹을 수 있게 되길 바란다.

둘째, 조기포만감

밥을 거의 먹지 않았음에도, 평소보다 적게 먹었음에도 금방 배가 불러온다.
사람의 위는 음식물이 들어왔을 때 유하게 늘어나야 하는데,
헬리코박터에 의한 염증반응으로 장상피화생(위상피가 장상피처럼 바뀜)이 생겨 위가 늘어나지 않게된다.

한두 번 그러는 것으로는 무심코 지나칠 수가 있는데
위가 반복되어 식사량이 줄어 체중이 감소된다면 감염을 의심해 볼 수 있다.

증상에 대한 원인분석

헬리코박터 파일로리 균은 위에 지속적인 염증반응을 생성한다.
이 염증반응은 위장의 운동성을 저하시키고, 부풀게 만들며 불편감을 일으킨다.
다시 말해 위장, 소장 내 벽을 민감하게 만드는 것이다.

헬리코박터균은 위점막 내에서 기생한다.
음식을 섭취하면 음식물과 같이 소장까지 내려가며, 이는 소장에도 염증반응을 일으키게된다.
이렇게 소장이 헬리코박터균에 의한 염증반응으로 붓게 되면, 장의 민감성이 심해지는 것이다.

건강한 소장이라면 매운 음식이 들어와도 별 문제가 없지만,
염증반응으로 인해 민감해진 소장은 매운 음식의 자극에 과민반응을 일으키고 붓기가 생겨 소화흡수를 방해한다.

해결방법

헬리코박터균은 강산에서 생존과 번식이 어렵기때문에 위산의 분비를 낮추는 방향으로 우리 몸을 바꾼다.
헬리코박터균의 번식을 억제하는 영양제와 음식들은 쉽게 찾을 수 있다.
그중에서 가장 효과적인 것은 Vitamin-C이다.
관련 내용은 이왕재교수님의 블로그에서 좀더 자세한 정보를 얻을 수 있다.

이는 하루이틀의 비타민C 섭취로 나아지는 질환이 아니다.
헬리코박터균 증식이 억제되는데 걸리는 시간도 있을 뿐더러,
위장의 기능이 회복되어야 하고
무엇보다도 매운음식에 민감하게 반응하는 장이 원래대로 진정되고 회복되는데 시간이 필요하기 때문이다.

헬리코박터균은 100% 완전제균이 어렵다.
높은 농도의 비타민C를 지속적으로 오버도즈해 번식을 억제하는 방법이 전부다.
평생 안고 살아간다고 생각하고 꾸준히 관리하면 문제될 건 없다.

최대공약수와 최소공배수 구하기

일반적으로 교과과정에서 배운 최대공약수 구하는 법은
두 수를 2나 3, 나뉠만한 소수로 계속 나눠보는 것이다.

 

gcd와 lcm 구하기
gcd와 lcm 구하기



위와 같이 더이상 나눠지지 않는 수까지 나눈 후에,
즉 A와 B를 서로소가 될 때까지 나눈 후에
왼쪽 나눈 수들을 전부 곱한 값이 gcd, 최대공약수이고
A, B를 gcd로 나눈 몫들을 모두 gcd와 곱한 값을 lcm, 최소공배수라 한다.

최대공약수 gcd = greatest common divisor
최소공배수 lcm = least common multiple

이는 사실 A와 B를 소인수분해한 후, 공통약수를 모두 골라내는 작업과 같다.
하지만 이 계산법들은 A와 B가 커질수록 소인수분해하기 어려워진다.

유클리드 호제법: Euclidean algorithm

원이름은 유클리드 알고리즘.
호제라는 뜻은 서로() 나눈다()는 뜻이고,
이 알고리즘을 적용하는 방법 때문에 붙인 이름인 듯 하다.

두 양의 정수 $a,b (a>b)$에 대하여 $a=bq+r,(0\le r<b) $ 일 때,
$a,b$의 최대공약수는 $b,r$의 최대공약수와 같다.

$$gcd(a, b)=gcd(b, r)$$

$r=0$이라면, $a,b$의 최대공약수는 $b$가 된다.

증명

증명을 한 번 하고나면, 조금 더 직관적으로 와닿는다.

$gcd(A,B)=g$일 때, $gcd(B,r)=g$임을 증명하자.

$A$와 $B$의 최대공약수가 $g$일 때, 더 큰 수 $A$를 $B$로 나누면 $A=Bq+r$로 표현된다.
($r$은 나누는 수 $B$보다 작으므로 $0\le r\lt B$이다.)

$gcd(A,B) = g$이므로, A와 B를 아래와 같이 표현 가능하다.
$$A=ga\newline B=gb\newline gcd(a,b)=1$$
$gcd(a,b)=1$는 $a$와 $b$가 서로소임을 뜻한다.

$A$를 $B$로 나눈 $A=qB+r$에서 $A=ga, B=gb$를 대입하면 $ga = q(gb)+r$이 되고
$r$에 대해서 $r=g(a-qb)$로 정리된다.
말인즉슨, $r'=a-qb$으로 놓으면
$$r=gr'$$
$r$이 $g$로 나누어진다.

보이고자 하는 것은 $gcd(B,r)=g$이다.
처음에 $B=gb$로 놓았었고 이제 $r=gr'$을 얻었으므로
$B$와 $r$이 모두 공통인수 $g$를 갖는것을 확인했다.

이에 더해 $b$와 $r'$이 서로소, 즉 $gcd(b,r')=1$이라면, $gcd(B,r)=g$가 된다.

$gcd(r',b)=1$임을 보여야 하므로,
$gcd(r',b)=\alpha$, $(\alpha\neq 1)$으로 가정해보자. (귀류법)
그럼 이렇게 된다. $r'=\alpha r''$, $b=\alpha b'$

$A$와 $B$에 대해서 식을 정리하면,
$A=qB+r=q(gb)+gr'=qg(\alpha b')+g(\alpha r'')=g\alpha(qb'+r'')$
$B=gb=g(\alpha b')$

즉 $A$와 $B$가 모두 $g\alpha$의 공약수를 갖게된다.
이는 처음 가정이었던 $gcd(A,B)=g$에 모순이므로
귀류법에의해 $gcd(r',b)=1$이다.

결론적으로 $B=gb$, $r=gr'$이고 $gcd(r',b)=1$이므로
$B$와 $r$또한 최대공약수 $g$를 갖는다는것이 증명되었다.

백준 2609: 최대공약수와 최소공배수

#include<cstdio>
int Euclidean(int a, int b) {
    int r = a%b;
    if(r==0) { // meaning that a is dividable by b
        return b;
    }
    return Euclidean(b,r);
}
int main() {
    int a,b;
    scanf("%d %d", &a, &b);
    int gcd = Euclidean(a,b);
    printf("%d\n%d", gcd, a*b/gcd);
}

더 빠른 성능의 KaTeX

한창 MathJax를 써오다가 속도하락을 경험한 후,
더 빠른 KaTeX를 알게되었다.

티스토리 HTML편집에서 <head> 사이에 아래와 같이 집어넣었다.
auto-render extension이 왜 따로 필요한지는 모르겠다.

<!-- KaTeX -->
<!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly -->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css"
integrity="sha384-Xi8rHCmBmhbuyyhbI88391ZKP2dmfnOl4rT9ZfRI7mLTdk1wblIUnrIq35nqwEvC"
crossorigin="anonymous">

<!-- The loading of KaTeX is deferred to speed up page rendering -->
<script
        defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.js"
        integrity="sha384-X/XCfMm41VSsqRNQgDerQczD69XqmjOOOwYQvr/uuC+j4OPoNhVgjdGFwhvN02Ja"
        crossorigin="anonymous">
</script>

<!-- To automatically render math in text elements, include the auto-render extension: -->
<script
        defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/contrib/auto-render.min.js"
        integrity="sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR"
        crossorigin="anonymous"
        onload="renderMathInElement(document.body);">
</script>

<script> 
    document.addEventListener("DOMContentLoaded", function(){
        renderMathInElement(document.body, {
            delimiters: [
                {left: "$$", right: "$$", display: true},
                {left: "$", right: "$", display: false}
            ]
        }); 
    });
</script>

사용법

인라인은 $로 감싸고, 블록 표기는 $$로 감싼다.

$ 1+1=2 $
$$ 1+2 = 3 $$

$ 1+1=2 $
$$ 1+2 = 3 $$

소화기능 관련

커피를 마시면 장내 비피더스균을 늘려 소화 활동을 촉진한다는 연구결과가 있다.
식이섬유와 폴리페놀이 유익균의 먹이가 되고,
이로인해 면역력 증가, 장 운동 촉진, 췌장염, 변비 등 질환 위험을 낮춘다.

또한 소화를 돕는 위산과 담즙의 분비를 촉진한다.
이는 위산부족으로 인한 소화문제가 있는 사람에게는 긍정적인 효과가 있을 것이고,
위벽 손상, 위염증으로 인해 고생하는 사람에게는 위를 자극하는 효과가 생겨 좋지 않을 것이다.

이뇨작용 관련

카페인 성분이 수분배출을 일으킨다.
이뇨제라 할정도의 수분을 배출시키는 것은 아니고,
섭취한 카페인 양에 비례해 약간 소변량이 늘어나는 정도이다.

이는 시간이 지남에 따라 몸이 카페인의 이뇨작용 메커니즘에 적응해
과량을 섭취하지 않는 한 정상 범위로 돌아오며, 요량이 더 늘지는 않게 된다.

각성효과 관련

카페인이 각성효과를 일으키는 기전에 대해 이해하려면 먼저 아데노신에 대해 알아야한다.
아데노신은 ATP를 사용할 때 분리되는 물질로, 우리 몸이 깨어있는동안 지속적으로 생성된다.
뇌의 A2A 수용체와 결합하는 아데노신이 많다면, 우리 몸은 피곤과 졸음을 느낀다.
수면 시에 ATP로 재합성되며 아데노신 농도가 낮아졌을 때 잠에서 깨게 된다.

카페인은 이 아데노신과 비슷하게 생겨 아데노신 수용체에 대신 결합하게 된다.
하지만 카페인이 결합하였을때는 졸음유발을 일으키지는 않기 때문에 우리는 피곤함을 느끼지 않는다.
피곤함을 느끼지 않다 하더라도 실제 우리몸의 에너지가 부족한 것은 변함이 없으므로, 뇌는 수용체를 더 만들어 결국엔 피곤함을 더 느끼게 만든다.
카페인 내성이 생기는 이유다.

이 외에도 카페인은 행복을 느끼게 만드는 도파민의 분비를 촉진해 각성상태로 만든다.

사람마다 카페인 민감도가 달라 각성효과를 느끼는 적정 섭취량은 개인차가 크다.
잠이 안 오는 사람은 민감도가 큰 것이며, 카페인을 배출시키는 속도가 남들보다 느린 것이다.

카페인이 우리 몸을 각성상태로 만드는데 적게는 20분, 길게는 1시간의 시간이 걸린다.
잠깐의 낮잠으로 피로를 회복하고 싶다면
카페인을 먹고 각성상태로 진입하기 전 낮잠을 자면
잠깐의 낮잠으로 개운하게 일어날 수 있다.

과량의 카페인 복용은 실제로 수면효율을 떨어뜨린다.
카페인 민감도가 낮은 사람도, 커피를 많이 마시고도 잠을 잘 자는 사람도,
실제로는 깊은 잠에 들지 못한다는 연구결과가 있다.

사망률 관련

커피를 한두잔 정도 마시는 사람들은 사망률이 낮아진다는 통계보고가 있다.
알츠하이머, 치매, 심혈관계질환 등의 질병예방효과도 밝혀졌기 때문에
하루 적정량의 커피 음용은 건강에 도움이 된다.

카페스톨에 대해

커피의 크레마, 이쁜 모양의 거품은 카페스톨이라는 콜레스테롤 지방성분이다.
이 커피스톨은 양면성을 지니고있다.

항염, 항암 효과가 있다고 밝혀졌지만,
좋지 않은 LDL콜레스테롤을 높인다.

커피를 고온에서 추출하는 과정에서 녹아나오는 지방이기 때문에,
페이퍼타올을 이용해 기름을 걸러내는 핸드드립과
뜨거운 물을 쓰지 않는 더치커피에는 카페스톨이 10% 미만으로 적게 함유되어있다.
인스턴트커피또한 냉동,건조하는 제조과정에서 콜레스테롤이 모두 걸러진다.

자동차보험과 운전자보험도 구분하지 못하는 나를 위해 포스트를 작성하자.

자동차보험

자동차보험은 차를 소유한 사람에게 필수적인 보험.
1년 단위로 가입한다.
가입하지 않으면 과태료가 부과된다.

자동차보험은 자동차를 소유한 사람에 드는 게 아니라 '자동차'에 드는 보험이다.
즉 보험을 들 때 운전자를 지정해서 가입한다.
해당 운전자가 낸 사고가 아니면 보장받지 못한다.

운전자보험

운전자보험은 의무보험이 아닌 선택이다.
형사책임이 발생하는 11대 중과실 사고나, 피해자가 사망 또는 중상해를 입은 경우에 도움을 받을 수 있다.
형사합의금, 변호사수임비 같은 부분에서 지원이 된다.

렌트카의 의무보험

렌터카 차량 소유주는 자동차손해배상보장법에 따라 의무적으로,
대인 (상대방 운전자), 대물 (상대방 차), 자손 (우리 운전자) 3개가 의무보험이다.
때문에 렌트카 이용자 입장에서는 선택사항인 자차(우리 차 수리비 보장)만 신경쓰면 된다.

여러 렌트카 업체를 들어가보면, 이 자차보험에 대해 각기 다르게 영업하고 있다.
왜냐면 이는 실제 자차 보험이 아니라, 면책제도라는 이름으로 자차 보험인 것처럼 판매하는 것이기 때문이다.

자차라고 되어있어 모두 보장받을 수 있을 것 같지만, 실제 보장내용은 약관을 잘 살펴보아야 한다.
자차라 써있는 면책제도를 가입했음에도, 휠/타이어 긁힘이나 사고시 휴차료를 추가 청구할 수 있음이 명시되어있는 경우가 많다.
(그래서 완전자차, 슈퍼자차 이름이 다른 것..)

가입 시 꼭 보상제외항목이 있는지 확인해야 한다.

SK렌터카

SK렌터카를 예로 들면,
대인 무한, 대물 건당2천한도, 자손 인당 1천5백한도, 사고 건당 1억5천한도
의 종합보험이 걸려있다.
(이건 필수니까 모든 렌터카 업체가 보장되는 부분)

이와별도로 자차를 '차량손해면책제도' 라는 이름으로 운영하는데,
이는 "만약 너네가 사고를 내더라도, 책임을 면해줄 테니 면책비용을 미리 내라." 라고 이해하면 된다.

작성시점 기준 1)무가입, 2)일반자차, 3)완전자차 3가지중에 선택할 수 있었는데,
일반자차는 사고났을 시 50만원까지 고객부담금을 내야하고, 완전자차는 고객부담금 완전 면제다.

완전자차는 특히 사고발생시 휴차료도 완전 면제로 홈페이지에 쓰여있다.
(이말인즉슨 일반자차는 사고났을 시 휴차료를 내야 한다는 뜻)

휴차 보상료 : 차량손해면책제도 가입 유무와 관계 없이 사고로 인해 차량이 휴차할 경우,
수리 기간 동안 정상 요금의 50%에 해당하는 휴차보상료가 청구되며,
이는 임차인이 배상하여야 합니다.(임대차 계약서 내 보험 보상 관련 약관 有)
※ 단, 제주 지점에 한하여 완전자차 가입 시 휴차보상료가 면제됩니다.


헌데 그럼 완전자차를 들고 사고나면 무조건 돈을 안내냐,
그런 말도안되는 슈퍼 조건이 어딨냐.
같은 생각이 들어 문의한 결과 아래의 답변을 받을 수 있었다.
자세한 사항은 렌트카 예약 결제 창 우리가 안보고 지나갔던 많은 이용약관 중에 쓰여있다고 한다.

12대 중과실 사고(음주운전, 중앙선 침범, 신호 또는 지시위반 등)발생 시 면책금 적용 불가로 명시 되어 있습니다만
고객님의 편의를 위해서 통상적으로 대부분의 사고에 대해 면책금 적용을 해드리고 있습니다.
다만 음주운전, 무면허운전, 폐차사고 또는 대형사고 등 각 사고 상황에 따라 면책금 적용이 불가한 경우가 발생 될 수 있으며
혹시나 그러한 경우라도 사고 발생 시 전반적인 상황을 고려하여 면책금 적용 여부가 결정 되는 점 참고부탁드립니다.

다른 방법: 자동차보험 특약 가입

자동차보험을 들 때, 렌터카 자차 특약을 추가로 가입하는 방법이 있다.
현대해상의 경우 렌터카 차량손해담보특약이며, 개인용 자손 담보 가입시 가능한 특약이다.
대물배상 기준으로 수리비, 휴차료를 보상해주며 소정의 자기부담금이 나올 수 있다.

현재 이용하는 삼성화재 다이렉트의 경우 다른자동차자차담보특약2가 있는데,
전화로 물어본 결과 가입 중에 추가하거나 변경할 수는 없고,
가입 시 선택했어야 한다고 안내받았다.

C언어 자료형 정리

백준 20353 Atrium 문제

날먹할 외국어 문제 찾아보다가, 의외로 브론즈 4랭크인 20353번 Atrium 문제에서
10번이나 "틀렸습니다"를 받아 포스팅한다. (15610번과 같은 문제)
이번 기회에 자료형을 확실히 정리하고 넘어가야겠다..

분명 입력값이 single integer a(1 <= a <= 10^18)로 되어있어
integer? 당연 int지~ 하면서 무지성 답안제출했던게 원인이었다.

int형

4바이트인거는 다 아는데, 이게 몇 자리 수까지 저장할 수 있는지는 헷갈린다.
2의 32승, 이를 십진수로 환산하면 4,294,967,296.
42억이며 음수도 표현해야 하므로 -21억부터 0, +21억까지 표현 가능하다.
즉 고작 10의 9승 부근까지밖에 표현이 안된다.

따라서 더 큰 수에 대해서는 다른 자료형을 써야 하는데..

unsigned int

얘는 부호정보만 없앤것이라 자리수 똑같이 10의 9승까지밖에 저장이 안된다.

long int

long 운영체제나 플랫폼마다 크기가 다르다.
윈도우에서는 4바이트
리눅스x86에서는 4바이트, 리눅스x86-64에서는 8바이트
OSX x86에서는 4바이트, OSX x86-64에서는 8바이트

long long int

얘가 8바이트 자료형이다.
2의 64승, 십진수로는 18,446,744,073,709,551,616
한 자리수 더 늘리려면 unsigned long long int 형을 쓸 수 있다.
얼추 10의 17승 까지 표현 가능한 것 같고.
포맷 스트링은 아래와 같이 lli와 llu를 쓰면 된다.

#include<cstdio>
int main() {
    long long int a = 123456789012345678;
    unsigned long long int b = 1234567890123456789;

    printf("%lli\n", a);
    printf("%llu\n", b);
}

SQL Query

MySQL 문법을 본격적으로 공부하기에 앞서 SQL 쿼리문의 꼭 알아야 할 점들을 몇 가지 짚고 넘어가자

1. SQL 쿼리문의 끝을 세미콜론;으로 종료해야 한다.

무조건 붙여야 하며, 이는 오라클과 MS SQL에서도 똑같다.
서버와 연결을 끊는 quit과 exit의 경우에만 제외.

2. 대소문자 구분

mysql은 일반적으로 대소문자를 구분하지 않는다. 전체 대문자 또는 전체 소문자로 하는게 읽기 쉽다.

3. SQL에서의 주석

한줄주석은 --가 기본이다. 공백이 한칸 필요하다.
또는 #를 써도 가능하다.
여러줄주석은 /* */

접속 문제 해결

우분투에서 처음 mysql을 세팅하다 보면 생각처럼 접속이 잘 안되는 경우가 많다.
아래의 사항들을 하나씩 체크해보면 해결할 수 있다.

방화벽 문제의 경우

설치 후 접속이 되지 않는다면 방화벽 문제일 수 있다.

특히, 구글 클라우드 플랫폼(GCE: Google Compute Engine)을 사용할 경우 방화벽 룰을 설정해주어야 한다.
GCE에서 VPC네트워크 들어가서 firewall 설정으로 Ingress 3306 포트를 여는 태그를 만든다.
0.0.0.0으로 설정하면 작동하지 않고, 0.0.0.0/0으로 설정해야 작동한다.
VM Instance로 가서 해당 태그를 입력시킨다.

mysql bind-adress 문제의 경우

접속허용 IP주소를 설정하는 작업이다.
기본 세팅이 127.0.0.1로 되어있으며, 이는 자기자신에서만 접속을 허용한다는 뜻이다.
0.0.0.0으로 수정해주지 않으면 외부에서 접속할 수 없다.

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# bind-address 검색해 0.0.0.0 으로 수정 (모든 접속 허용)
sudo systemctl restart mysql # 재부팅해주고
sudo netstat -antp | grep mysql # foreign address 0.0.0.0으로 설정 확인

계정의 host 설정 문제의 경우

mysql에서는 유저를 생성할 때 host정보도 같이 입력해주어야한다.
지정된 host 이외의 주소에서는 접속이 차단된다.
해당 계정에 대해 모든 주소에서 접속이 가능하게 하려면 host를 %로 세팅하면 된다.

create user username@'%' identified by 'user_password'

-- 이미 생성한 유저의 호스트정보를 %로 바꾸는 경우
update user set host='%' where user='username';

해당 DB에 대한 계정 권한 문제의 경우

해당 계정이 접속하고자 하는 데이터베이스에 권한이 없으면 $ show databases; 명령에도 보이지 않는다.
접속까지 안되는지는 확실치는 않다.

-- 특정 DB와 테이블에 대한 모든 권한을 주는 경우
grant all privileges on [DB]@[table] to 'username'@'%';

-- username@% 계정에 모든 DB와 테이블에 대한 전체 권한을 주는 경우
grant all privileges on *.* to 'username'@'%';

+ Recent posts