본문 바로가기

백준

[백준] 1806 부분합 풀이 java 1. 문제 설명문제 설명2. 접근 방식KEY WORD: 구간합 & 투 포인터데이터 크기가 10^5 이라서 시간복잡도가 O(n^2) 이상이면 안된다. 따라서 한번의 조회안에 모든 것을 끝내야 한다. 그러기 위해서 누적합을 사용하여 문제를 풀었다. 진행 방식은 다음과 같다.입력을 누적합 배열(sum) 형태로 만든다. (다만 진짜 누적합의 시작은 sum[1] 부터 시작하고, sum[0]=0 으로 비워둔다.)left, right 포인터를 만들고 다음과 같이 움직인다.(1) sum[right] - sum[left] (2) sum[right] - sum[left] == M 이면 (right-left) 길이 기록 후에, right를 움직인다.(3) sum[right] - sum[left] > M 이면 (right -.. 더보기
[백준] 1253 좋다 1. 문제 분석[문제 링크](https://www.acmicpc.net/problem/1253)2. 접근 방식배열의 양 끝에 포인터를 둔다. 현재 Good이 되는 수인지 검산 한다. (포인터 2개의 합이 현재 검산 중인 수보다 크면 오른쪽 포인터를 한 칸 내린다.) (포인터 2개의 합이 현재 검산 중인 수보다 작으면 왼쪽 포인터를 한 칸 올린다.)숫자는 음수도 가능하므로, 제약없이 전체에 대해서 계산 해야한다. 이는 O(n^2)의 시간 복잡도가 들지만, 계산해야할 총 데이터 수가 2000 이므로 10^3 이라 계산이 괜찮다. 3. 코드 분석import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;im.. 더보기
백준 15552 문제(빠른 A+B) Code review 1. 문제 분석 문제의 요구 조건은 1.5초안에 최대 1,000,000개 이상의 더하기 연산을 하여 하나 하나 출력하는 것이다. 여기서 중요한 것은 1.5초라는 시간이다. 2. 기존에 입출력을 담당하던 scanner로 문제를 풀면 안되는 이유 scanner는 입력 받은 구문 분석을 위해 정규식을 남발한다. 실제로 Scanner 내부 코드를 뜯어보면, 입력 받은 구문을 분석하기 위해 많은 명령을 거친다는 것을 알 수 있다. 따라서 따로 입력 받은 값에 대한 구문분석이 없는 BufferedReader를 통해 해당 문제를 풀어야한다. 3. 해답코드 import java.io.*; import java.util.StringTokenizer; public class main { public static void .. 더보기