본문 바로가기

알고리즘 문제 풀이/Baekjoon

5676 - 음주 코딩

반응형
SMALL

안녕하세요. 꼬동입니다.

 

https://www.acmicpc.net/problem/5676

 

5676번: 음주 코딩

각 테스트 케이스마다 곱셈 명령의 결과를 한 줄에 모두 출력하면 된다. 출력하는 i번째 문자는 i번째 곱셈 명령의 결과이다. 양수인 경우에는 +, 음수인 경우에는 -, 영인 경우에는 0을 출력한다.

www.acmicpc.net

 

오늘의 문제

 

음주 코딩

 

뭐 똑같은 세그먼트 트리 문제입니다.

 

세그먼트 트리가 쉬우면서, 백준 점수 따는데 제일 좋은거 같아서, 계속 찾아서 풀게되군요.

 

언제 다익스트라로 넘어가지 ..?

 

어쨌든,

 

이 문제는 뭔가 Python으로 안 풀릴거 같아서, C로 풀어봤습니다.

 

#include <stdio.h>

char o;
int N, K, tmp, i, j;
int tree[100000 * 4];

int insert(int n, int s, int e, int t, int v) {
    if (t < s || e < t) return tree[n];
    if (s == t && t == e) {
        tree[n] = v;
        return tree[n];
    }
    
    int m = (s + e) / 2;
    tree[n] = insert(n * 2, s, m, t, v) * insert(n * 2 + 1, m + 1, e, t, v);
    return tree[n];
}

int check(int n, int s, int e, int l, int r) {
    if (r < s || e < l) return 1;
    if (l <= s && e <= r) return tree[n];
    
    int m = (s + e) / 2;
    return check(n * 2, s, m, l, r) * check(n * 2 + 1, m + 1, e, l, r);
}

int main(void) {
    while (scanf("%d %d", &N, &K) != EOF) {
        for (int i = 0; i < 100000 * 4; ++i) tree[i] = 1;
        for (int n = 1; n <= N; ++n) {
            scanf("%d ", &tmp);
            if (tmp < 0) tmp = -1;
            else if (tmp > 0) tmp = 1;
            insert(1, 1, N, n, tmp);
        }
        for (int k = 0; k < K; ++k) {
            scanf("%c %d %d ", &o, &i, &j);
            if (o == 'C') {
                if (j > 0) j = 1;
                else if (j < 0) j = -1;
                insert(1, 1, N, i, j);
            }
            else {
                int res = check(1, 1, N, i, j);
                if (res < 0) printf("-");
                else if (res > 0) printf("+");
                else printf("0");
            }
        }
        printf("\n");
    }
    return 0;
}

 

이 문제 웃긴 점은, 입력 값의 마지막이 뭔지 모르고, 주어지면 일단 로직을 돌려야한다는 이상한 문제인데,

 

이 부분은 EOF 처리를 하면 가능합니다.

 

while (scanf("%d %d", &N, &K) != EOF) {...}

 

원리는 뭔지 모르겠지만, EOF(End Of File)면 끝내겠다는, 그런 의미 아닐까여

 

좀 알아보니,

 

운영체제에서 파일의 끝을 탐지하는 방법은 약간씩 다른데, C 언어는 파일의 끝에 도달했을 때 언제나 특별한 값을 반환한다하더라고요.

 

이 값이 EOF(End Of File)이며, 실제로의 값은 -1을 나타낸다고 합니다.

 

윈도우에선 Ctrl + Z를 누르고 Enter를 누르면 된다고 하네요.

 

근데 나 맥북인뎁


제가 MBTI N이라 그런지, 항상 생각이 많은데, 이 문제를 풀면서도 생각이 참 많았습니다.

 

제목이 음주 코딩이다 보니 뭔가, 대학생 때, 술 먹으면서 과제했던 생각도 나고,

 

뭔가 정겨운 문제 같아 보여서 센치해지더라고요.

 

고향 방문 후 다시 상경하는 기차 안에서 풀어서 그런지, 아니면 LAST DANCE 노래 들으면서 풀어서 그런지 왤케 문제가 짠하지

 

낼 모레 앞 자리가 바뀌어서 그런가

 

흑흑

 

서럽네

 

술 먹고싶다

푸념하는거 찐따 같은데, 이왕이면 멋진 찐따가 됩시다.


이상 5676 - 음주 코딩였습니다. ^_^

반응형
LIST

'알고리즘 문제 풀이 > Baekjoon' 카테고리의 다른 글

2243 - 사탕상자  (0) 2021.10.31
17404 - RGB 거리 2  (2) 2021.10.25
3653 - 영화 수집  (0) 2021.10.10
1107 - 리모컨  (0) 2021.10.09
7579 - 공장  (0) 2021.10.09