본문 바로가기

삼성전자 알고리즘/정올

12. 1141 : 불쾌한 날

원본 출처 : http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=421&sca=50&sfl=wr_subject&stx=%EB%B6%88%EC%BE%8C%ED%95%9C+%EB%82%A0&sop=and

 

JUNGOL | 불쾌한 날 > 문제은행

제한시간: 1000 ms    메모리제한: 32 MB 해결횟수: 1866 회    시도횟수: 13585 회    농부 시현이의 N(1≤N≤80,000)마리의 소들은 "bad hair day"를 맞이하였다.  각 소들이 자신들의 촌스런 머리 모양을 부끄러워 하자, 시현이는 소들이 다른 소들의 머리 모양을 얼마나 알 수 있는지를 알고자 했다. i번째 소들은 키가 hi(1≤hi≤1,000,000,000) 이며, 동쪽(오른쪽)을 바라보고 서있다.  따라서, i번

www.jungol.co.kr

문제풀이 :

#include <stdio.h>
//스택을 이용하여 문제 풀기
#define MAX 80050
unsigned int stack[MAX];    //stack 생성
int s_p = 0;    //스택 포인터
long long sum = 0;  //sum
void push(int data) {
        stack[++s_p] = data;
        sum += s_p - 1;
}
 
int main() {
    int N;  //입력되는 수 N<=80000
    int temp;
    scanf("%d", &N);
    //처음 입력되는 수는 Stack에 일단 PUSH.
    scanf("%d", &temp);
    push(temp);
    for (int i = 1; i < N; i++) {
        scanf("%d", &temp);
        if (stack[s_p] > temp) {
            //새로 입력 받은 값이 stack에 st_pt 포인터가 가리키는 곳 밑에 값보다 작다면 PUSH.
            push(temp);
        }
        else if(stack[s_p] <= temp){
            //새로 입력 받은 값이 stack에 st_pt 포인터가 가리키는 곳 밑에 값보다 크거나 같다면 POP.
            s_p--;
            //계속 POP할 것인지 ?
            while (1) {
                if (stack[s_p] > temp) {
                    //큰 값이 있을 때 까지 탐색.. 아니면 pop
                    push(temp);
                    break;
                }
                else {
                    --s_p;
                    //전부 다 POP 되면 break
                    if (s_p == 0) {
                        push(temp);
                        break;
                    }
                }
            }
        }
    }
 
    printf("%lld\n", sum);
    return 0;
}

내가 볼 수 있는 소들의 합 = 나를 보고 있는 소들의 합

나를 볼 수 있는 소들만 stack에 남겨둔다

'삼성전자 알고리즘 > 정올' 카테고리의 다른 글

14. 1133 : Uniqueness  (0) 2019.06.28
13. 1726 : 구간의 최대값1  (0) 2019.06.28
11. 1318 : 못생긴 수  (0) 2019.06.16
10. 2788 : 도약  (0) 2019.06.16
9. 2581 : 예산  (0) 2019.06.16