-
Q 1859. 백만 장자 프로젝트(D2)코딩테스트/SWEA_Java 2023. 5. 8. 23:35
0. 문제
D2 난이도의 문제이고, 단순한 배열 순회 문제라고 생각된다.
매일 매일 물건의 가격이 주어진다. 하루에 물건은 하나만 살 수 있고, 파는 수량은 제한이 없다.이 때 최대 이익을 출력하는 문제이다.
1. 풀이
처음에 투 포인터나 정렬을 이용한 문제인가? 라는 생각을 했었는데,
단순하게 생각을 뒤집어서 맨 뒤에서 앞으로 배열을 조회하면 해결할 수 있었다.
1) 배열의 맨 뒤에서 앞으로 순회한다.
1-1) 이 때 만약 기존 최대 가격보다 큰 가격을 만날 경우 그 값을 저장한다.
1-2) 그렇지 않은 경우 기존 최대 가격 - 현재 가격을 결과값에 저장한다.
import java.util.Scanner; import java.util.StringTokenizer; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; class Solution { static Scanner scanner; static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; static StringBuffer sb = new StringBuffer(); static int[] arrN; static int N; static void input() throws IOException { N = Integer.parseInt(br.readLine()); arrN = new int[N]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < N; i++) { arrN[i] = Integer.parseInt(st.nextToken()); } } static void pro(int tc) { int prevMax = arrN[N-1]; long res = 0; for (int i = N-2; i >= 0; i--) { if (prevMax > arrN[i]) { res += prevMax - arrN[i]; } else { prevMax = arrN[i]; } } sb.append('#').append(tc).append(' ').append(res).append('\n'); } public static void main(String args[]) throws Exception { // System.setIn(new FileInputStream("res/input.txt")); // scanner = new Scanner(System.in); // int T = scanner.nextInt(); int T = Integer.parseInt(br.readLine()); for(int test_case = 1; test_case <= T; test_case++) { input(); pro(test_case); } System.out.println(sb); } }
2. 시간복잡도 계산
0) N의 최대값은 1,000,000이다.
1) 처음 입력값(가격) 저장 - O(N)
2) 풀이 1번 - O(N)
따라서 시간복잡도는 O(2N)이고, 시간제한은 20초이므로
1초에 약 1억번 연산을 한다고 가정하면, 1초 이내에 풀 수 있다.
반응형'코딩테스트 > SWEA_Java' 카테고리의 다른 글
Q. 1860. 진기의 최고급 붕어빵(D3) (2) 2023.05.10 Q. 1225. 암호생성기(D3) (0) 2023.05.09 Q. 1206. View (D3) (0) 2023.05.07 Q. 1991 자바 : 트리 순회 (0) 2023.04.13 Q. 1868 파핑파핑 지뢰찾기(D4) (0) 2023.03.15