목록전체 글 (242)
개발 공부~
https://www.acmicpc.net/problem/16472최대 N개의 종류의 알파벳을 가진 연속된 문자열만 인식 문자열이 주어졌을 때 이 번역기가 인식할 수 있는 최대 문자열의 길이 구하기 단, 문자열에는 알파벳 소문자만이 포함 번역기가 인식할 수 있는 문자열의 최대길이를 출력 getCount(int[] alp) 현재 창(window)에 포함된 서로 다른 알파벳의 개수를 반환alp 배열: 각 알파벳 등장 빈도 -> 크기 26 투포인터 : 현재까지 포함된 알파벳 종류는 n개 이하 -> 다음 알파벳 검사 (next) next가 문자열 범위에 있을 때,다음 알파벳을 추가하여 종류 개수 검사n보다 크면 next가지말고 -> 한칸 뒤로, 추가했던 빈도 되돌리기 -> 더이상 증가 불가=> i 증가 -..
https://www.acmicpc.net/problem/15831 문자열에서 연속된 부분 문자열B의 최대 개수가 bMax 이하W의 최소 개수가 wMin 이상가장 긴 부분 문자열의 길이=> 가장 긴 부분을 찾는 것 => 최대 개수을 넘어가면 더이상 추가 불가능 -> i증가=> 최대 개수안에서 w의 최소 개수를 만족시키는 구간의 길이 구하기 => next : 현재의 다음 인덱스를 가리킴 (오른쪽 포인터)=> 두 포인터 사이의 구간 : next는 포함안됨 -> next-i 두개의 조건중 최대 개수를 넘지 않을 동안 계속 추가추가한 구간이 w의 최소 조건을 만족시키는지 검사만족하면 최댓값으로 갱신현재 i에서 시작하는 구간은 다 해봄 -> i증가 => 해당 개수 줄이기 import java.util.Scan..
https://www.acmicpc.net/problem/17609 회문 : 처음부터 시작, 끝부터 시작하는 포인터 2개를 두고 하나씩 증가, 감소시키며 현재 가리키는 문자가 일치하면 회문유사회문: 회문이다가 처음으로 다른 지점을 만났을때 그 지점의 두 포인터중 하나를 각각 뺀 문자열이 회문이면 유사회문=> 문자 하나를 제거하여 회문으로 만들 수 있어야함=> 회문인지 검사하다 처음 다른 지점이 나왔을때, 2개의 문자열이 회문인지 검사 -> 회문이면 유사회문 isPaindrome 함수문자열이 회문인지 확인l과 r을 이용해 문자열의 양 끝에서부터 하나씩 비교 import java.util.Scanner;public class Main { //주어진 문자열이 회문인지 확인하는 함수 public static ..
https://www.acmicpc.net/problem/11728 Arrays.sort바로 정렬대신, 입력과 출력의 시간초과를 방지하기 위해 BufferedReader와 BufferedWriter를 사용함import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.util.Arrays;import java.util.Scanner;import java.util.StringTokenizer;public class Main { public static void main(..
https://www.acmicpc.net/problem/12891 지난 풀이https://better21.tistory.com/61 [백준 - 12891] DNA 비밀번호 .javahttps://www.acmicpc.net/problem/12891문제평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자better21.tistory.com 지난 풀이보다 투포인터를 조금 더 많이 푼 지금, 다시 풀어본 문제이다 change 메소드: DNA 문자열에서 각 문자를 0,1,2,3으로 변환isPossible 메소드: 현재 구한 문자열이 각 문자 최소 개수를 만족하는지 확ㅇ니처음 입력받은 문..
https://www.acmicpc.net/problem/2230차이가 M 이상이면서 제일 작은 경우 아예 정렬을 하면 되는데 이를 처음에 생각 못해서 살짝 헤맸다answer: 두 수의 차이를 구할 때 가장 큰 차이로 초기화첫 번째 포인터 i에 대해 두 번째 포인터 pair를 오른쪽으로 이동시켜 차이가 m 이상인 경우찾기=> nums[pair] - nums[i] => 여기서 pair의 범위를 꼭 설정해야함전체 시간 복잡도: O(n log n)import java.io.BufferedWriter;import java.io.IOException;import java.io.OutputStreamWriter;import java.util.*;public class test1 { public static v..
https://www.acmicpc.net/problem/1806 두 포인터 같은 방향으로 이동=> i 고정해놓고 r 이동 현재 합이 s보다 작고 r이 n-1보다 작은 범위에 속할때 => r을 하나 이동우측 포인터가 증가하여 curSum이 s 이상이 되면, 그 구간의 길이를 계산하여 count에 저장그 구간의 최소 구간 길이 갱신if (answer > n) answer = 0; 부분합이 s 이상인 연속된 구간이 없을 경우, 결과로 0을 출력 이 문제는 정렬을 하면 안되기에 for문으로 왼쪽포인트를 하나씩 증가해가면서 오른쪽 포인터을 통해 해당 조건에 부합하는 값들을 구하면 된다import java.io.BufferedWriter;import java.io.IOException;import java.io...
https://www.acmicpc.net/problem/2110 N개의 집에 C개의 공유기를 설치 -> 가장 인접한 두 공유기 사이 거리를 최대화이분 탐색 -> 공유기 간 거리 l은 1, r은 집들 사이의 최대 거리, 최댓값을 구하는 것이기에 가능할때, l을 갱신 findDist()이분탐색으로 하나씩 공유기 사이 거리를 구하고 그거리 이상으로 c개 이상 설치 가능 여부를 구하는 함수 구현첫 집을 기준으로 현재 집과 직전에 설치한 집 사이의 거리가 dist이상이면 설치인접한 최소 거리를 구하려면 공유기 수는 많아도 된다 -> c개 이상이면 거리 늘려서 다시 최댓값 찾기 이분탐색을 할때, 이상/초과 , 이하/미만 이 조건들을 명확히 해야한다 import java.util.Arrays;import java..