코드굽는 타자기

Jungol[1141] - 불쾌한 날(Bad Hair Day) 본문

알고리즘/스택&큐

Jungol[1141] - 불쾌한 날(Bad Hair Day)

bright-jun 2020. 2. 3. 09:34

링크

Jungol[1141]

문제설명

  • O(N^2)

문제풀이

  • 최적화 해야함. Scanner 이용하면 시간초과. BufferedReader사용. Heap사용 최소화.
    cow   5  2  4  2  6  1  
    stack2              -2  
    stack1      -2  4 -4  
    stack0   5  5  5 -5  6  
    count 0  1  1  2  0  1

문제코드

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.Stack;

public class Main1141 {
    public static void main(String[] args) throws IOException {
        System.setIn(new FileInputStream("res/jungol/1141.txt"));
//        Scanner sc = new Scanner(System.in);
//        int N = sc.nextInt();
//        int [] cow = new int[N];
//        for (int i = 0; i < N; i++) {
//            cow[i]=sc.nextInt();
//        }
//        /*
//         * 선형탐색
//         */
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine().trim());
//        int [] cow = new int[N];
        Stack<Integer> stack = new Stack();
        long ans = 0;

        int stk_temp=0;
        for (int i = 0; i < N; i++) {
//            cow[i] = Integer.parseInt(br.readLine().trim());
            stk_temp = Integer.parseInt(br.readLine().trim());
            while(!stack.isEmpty() && stack.peek()<=stk_temp) {
                stack.pop();
            }
            ans += stack.size();
            stack.push(stk_temp);
        }

//        for (int i = 0; i < N; i++) {
////            cow[i] = Integer.parseInt(br.readLine().trim());
//            stk_temp = Integer.parseInt(br.readLine().trim());
//            if(stack.isEmpty()) {
//                ans += stack.size();
//                stack.push(stk_temp);
//            }
//            else {
//                while(stack.peek()<=stk_temp) {
//                    stack.pop();
//                    if(stack.size()==0)break;
//                }
//                ans += stack.size();
//                stack.push(stk_temp);
//            }
//        }


//        int temp = 0;
//        for (int i = 0; i < N-1; i++) {
//            temp = cow[i];    //로컬 변수 사용(heap 가는거 단축)
//            for (int j = i+1; j < N; j++) {
//                if(temp>cow[j]) {
//                    ans++;
//                }
//                else break;
//            }
//        }

        System.out.println(ans);
    }
}

아쉬운점

  • Heap사용 최소화 -> cow[i] 호출 최소화
  • O(N^2) = 80000^2 = 6*10^9 = 6s 시간초과
  • ans = 80000*100000000 이라 long 사용해야함
  • stack 사용해서 좀 더 빠르게 풀 수 있다.
    • 명제의 대우
    • 자기가 보는 소 세기 -> 자기를 보는 소 세기
    • `stack.peek()<stk_temp`가 아니라 `stack.peek()<=stk_temp`다.(키가 같은 애들은 볼 수 없음. 더 큰 애들만 가능)
  • 조건문 더 깔끔하게 적을 수 있음.

잘한점

  • BufferedReader 공부함
  • 조건문의 조건비교 최소화(if-else > if-elseif)

'알고리즘 > 스택&큐' 카테고리의 다른 글

SWEA[1229] - 암호문2[D3]  (0) 2020.02.04
SWEA[1228] - 암호문1[D3]  (0) 2020.02.03
SWEA[1225] - 암호생성기[D3]  (0) 2020.02.03
SWEA[1218] - 타일 장식물[D4]  (0) 2020.01.31
Comments