막대기 17608번 [7일차]
시간제한 | 메모리 제한 |
1 초 (추가 시간 없음) | 512MB |
문제
아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로 6, 9, 7, 6, 4, 6 이다. 일렬로 세워진 막대기를 오른쪽에서 보면 보이는 막대기가 있고 보이지 않는 막대기가 있다. 즉, 지금 보이는 막대기보다 뒤에 있고 높이가 높은 것이 보이게 된다. 예를 들어, 그림과 같은 경우엔 3개(6번, 3번, 2번)의 막대기가 보인다.
N개의 막대기에 대한 높이 정보가 주어질 때, 오른쪽에서 보아서 몇 개가 보이는지를 알아내는 프로그램을 작성하려고 한다.
입력
첫 번째 줄에는 막대기의 개수를 나타내는 정수 N (2 ≤ N ≤ 100,000)이 주어지고 이어지는 N줄 각각에는 막대기의 높이를 나타내는 정수 h(1 ≤ h ≤ 100,000)가 주어진다.
출력
오른쪽에서 N개의 막대기를 보았을 때, 보이는 막대기의 개수를 출력한다.
나의코드
package day7;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Solution1 {
// 막대기 - 17608번
public static void main(String[] args) throws IOException {
// 스택을 이용
// 입력 정수가 100000까지 담겨야 하기 때문에 Buffered 사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Stack<Integer> stack = new Stack<>();
// 스택에 추가
for(int i = 0;i<N;i++){
int h = Integer.parseInt(br.readLine());
stack.add(h);
}
int count = 1; // 제일 높은 막대기는 무조건 보이기 때문에 1로 설정
int maxHeight = stack.pop(); // 첫번째 막대기 제일 높은값으로 초기 설정
while (!stack.isEmpty()) {
int height = stack.pop();
if (height > maxHeight) { // 다음 막대기가 maxHeight보다 클 경우 카운트 해주기
// 중간에 가려서 안보이는 막대기는 카운트 하면 안되기 때문에 앞에 막대기가 나보다 작을때만 카운트
count++;
maxHeight = height; //그리고 maxHeight 해당 막대기의 높이로 바꾸기
}
}
System.out.println(count);
}
}
처음에 큐로 풀어보려고 하다가 많은 시간을 허비했다
알고보니 스택으로 풀면 간단하게 해결되는 문제였다
중간에 가려서 안보이는 막대기를 카운트 하면 안되게 때문에 해당 조건을 넣어줘야했다
'Algorithm > 코딩테스트' 카테고리의 다른 글
[코딩테스트] 백준 - 3의배수 (0) | 2024.07.25 |
---|---|
[코딩테스트] 백준 - 단어순서 뒤집기 (0) | 2024.07.25 |
[코딩테스트] 백준 - 덱 (0) | 2024.07.24 |
[코딩테스트] 백준 - N과 M (2) (0) | 2024.07.24 |
[코딩테스트] 백준 - 알고리즘 수업 - 점근적 표기 1 (0) | 2024.07.24 |