21921 블로그
https://www.acmicpc.net/problem/21921
문제설명
주어진 기간 동안 최대 방문자 수를 가지는 구간을 찾고
그 구간의 방문자 수와 구간의 개수를 출력한다.
접근방식
O(N) 선형 시간복잡도
슬라이딩 윈도우 연산은 상수 시간이 소요되므로,
입력받은 배열만큼의 합을 계산하는데 O(N)의 시간이 소요된다.
문제 조건 분석 과정
- 입력 처리:
- 배열의 크기 NN과 부분 배열의 길이 MM을 읽는다.
- 방문자 수를 배열에 저장한다.
- 배열의 길이에 맞게 슬라이딩 윈도우 기법을 사용하여 부분 배열의 합을 계산한다.
- 슬라이딩 윈도우:
- 처음 MM개의 요소의 합을 계산한다.
- 그 다음에는 윈도우를 오른쪽으로 이동하면서 합을 갱신한다.
- 이동 시, 왼쪽 끝 요소를 빼고 오른쪽 끝 요소를 추가한다.
- 최대 합을 갱신하며, 최대 합과 같은 합을 가지는 구간의 개수를 카운트한다.
- 결과 출력:
- 최대 합이 0이면 "SAD"를 출력한다.
- 그렇지 않으면 최대 합과 구간의 개수를 출력한다.
전체코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) {
int n = 437674; //변환할 수
int k = 3; //변환할 진법 (3진법)
//solution메서드 호출
System.out.println(solution(n, k));
}
public static int solution(int n, int k) {
int result = 0;
//정수 n을 진법 k로 변환한 문자열
String re = Integer.toString(n, k);
//문자열을 0으로 구분하여 분리
for(String rea : re.split("0")){
//빈 문자열 무시
if(rea.equals("")) continue;
//문자열이 소수인지 확인
if(isPrime(rea) == false){
result++; //소수가 아닌 경우 result 증가
}
}
return result;
}
public static boolean isPrime(String num){
long n = Long.parseLong(num);
//1은 소수가 아님
if(n == 1){
return true;
}
//2부터 n의 제곱근까지 나눠서 소수 여부 판별
for(int i = 2; i <= Math.sqrt(n); i++){
if(n % i == 0){
return true; //나누어 떨어지면 소수가 아님
}
}
return false;
}
}
'자료구조 > 문제풀이' 카테고리의 다른 글
[프로그래머스 JAVA] Lv2. 소수찾기 (0) | 2024.08.01 |
---|---|
[프로그래머스 JAVA] Lv1. 신규 아이디 추천 (0) | 2024.08.01 |
[백준 JAVA] 17276 배열 돌리기 (0) | 2024.08.01 |
[백준 JAVA] 16165 걸그룹 마스터 준석이 (0) | 2024.08.01 |
[백준 JAVA] 14916 거스름돈 (0) | 2024.08.01 |