코드


import java.util.HashMap;
import java.util.Random;
class 모든아나그램찾기 {	
	public static void main(String[] args){
		String a = init(300); // 검사 대상
		String b = init(3); // 어나그램
		
		int answer=0;
		HashMap<Character, Integer> inputMap = new HashMap<Character, Integer>();
		HashMap<Character, Integer> map = new HashMap<Character, Integer>();
		
		//초기화
		for(int i=0;i<b.length()-1;i++) {
			char tmp1 = a.charAt(i);
			char tmp2 = b.charAt(i);
			inputMap.put(tmp1, inputMap.getOrDefault(tmp1, 0)+1 );
			map.put(tmp2, map.getOrDefault(tmp2, 0)+1 );
		}
		map.put(b.charAt(b.length()-1), map.getOrDefault(b.charAt(b.length()-1), 0)+1 );
		
		for(int lt=0, rt=b.length()-1 ;rt<a.length();rt++) {
			char tmp = a.charAt(rt);
			//1. 추가
			inputMap.put(tmp, inputMap.getOrDefault(tmp, 0)+1);
			
			//2. 검증 
			/* 메서드 안쓰고 할 시
			boolean flag= true;
			for(Character cha : map.keySet()) {
				//키 검증
				if(!inputMap.containsKey(cha)) {
					flag=false;
					break;
				}
				//개수 검증
				if(!(inputMap.get(cha) == map.get(cha))) {
					flag=false;
					break;
				}
				
			}
			if(flag) {
				System.out.println("일치 : " + lt +", " +rt);
				answer++;
			}
			*/
			if(inputMap.equals(map)) {
				System.out.println("일치 : " + lt +", " +rt);
				answer++;
			}
			
			//3. 삭제&수정&추가
			tmp = a.charAt(lt);
			inputMap.put(tmp, inputMap.get(tmp)-1 );
			
			if(inputMap.get(tmp)==0 ) {
				inputMap.remove(tmp);
			}
			lt++;
		}
		int count = 1;
		
		for(int i=0; i<a.length();i++) {
			if(count==1) System.out.printf("%3s %s\n",0,a.substring(i, i+10));
			if(count%10==0) {
				if( i+10-1<a.length() ) {
					System.out.printf("%3s %s" , ""+count,a.substring(i+1, i+1+10) );
					System.out.println();
				}
			}
			count++;
			
		}
		System.out.println("탐색문자 : "+b);
		System.out.println("갯수 : " +answer);
		
	}

	static String init(int size) {
		int[] array = new Random().ints(size, 65, 70).map(n -> {
			if ((int) (Math.random() * 10) % 2 == 0) {
				n += 32;
			}
			return n;
		}).toArray();
		StringBuilder sb = new StringBuilder();
		for (int num : array) {
			sb.append((char) num);
		}
		return sb.toString();
	}
}

결과

일치 : 50, 52
일치 : 116, 118
일치 : 297, 299
  0 cDEDeeDaCd
 10 dbBDCEECEc
 20 EdEBEbcEda
 30 bDAeebEEbe
 40 ABcaAeEabe
 50 ebdDBcBadd
 60 aDeECccBdD
 70 EBDdCBdEDa
 80 EAcbCCCcba
 90 DEbACcECda
100 aCABAdBCea
110 abeCCCedbB
120 BEDEEddcaa
130 DccEaEaaCD
140 eabAeBeabE
150 dBCEcDdAAE
160 CDeEdCdDdC
170 EDcDbEaAae
180 acBDCDeCDC
190 EACDDDAAaB
200 aeAAeAbcee
210 cDeEeBccde
220 AeDdCEBcEa
230 AdDeDeACAD
240 bebbcaeeBE
250 baCCCDCcbb
260 EaEcCeadad
270 BcaeCcBeCb
280 cdaCdaAaDb
290 BEDEdDaebd
탐색문자 : ebd
갯수 : 3

 

'자료구조&알고리즘 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비' 카테고리의 다른 글

선택정렬  (0) 2022.12.02
후위연산  (0) 2022.12.01
K번째 큰 수  (0) 2022.11.27
연속된 자연수의 합  (0) 2022.11.25
연속부분수열  (0) 2022.11.23

코드

import java.util.*;
import java.util.stream.IntStream;
// n 값이 될 수 있는 연속된 자연 수 합 구하기
class 연속된자연수합 {

	public static void main(String[] args) {
		int n = 1000;
		int answer = 0, sum = 0;
		int m = n / 2 + 1; //2개 이상의 연속된 자연수의 합은 절반 정도만 필요
		int[] arr = IntStream.rangeClosed(1, m).toArray();
		
		//rt를 담당하는 외부 반복문
		for (int rt = 0,lt = 0; rt < m; rt++ ) {
			sum+= arr[rt];
			//lt를 담당하는 내부 반복문
			//n보다 sum이 크거나 같을때.
			while(n<=sum) {
				//sum이 n과 같다.
				if(sum==n) {
					prettyPrint(arr, lt, rt);
					answer++;
					sum-=arr[lt++];
				//sum이 n보다 크다.
				}else {
					sum-=arr[lt++];
				}
			}
		}
		System.out.println(answer);
	}
	static void prettyPrint(int[] arr, int lt, int rt) {
		System.out.print("[lt="+lt+" rt="+(rt)+"]");
		Arrays.stream(arr, lt, rt+1).forEach(n->System.out.print(n+","));
		System.out.println();
	}
}

결과

[lt=27 rt=51]28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,
[lt=54 rt=69]55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,
[lt=197 rt=201]198,199,200,201,202,
3

여기서 while은 특정 조건에만 반복한다. 따라서 시간복잡도는 이중반복문과는 다르다.

'자료구조&알고리즘 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비' 카테고리의 다른 글

모든 아나그램 찾기  (0) 2022.11.30
K번째 큰 수  (0) 2022.11.27
연속부분수열  (0) 2022.11.23
교집합  (0) 2022.11.20
두배열합치기  (0) 2022.11.17

코드

import java.util.*;
class 교집합_ {	

	public static void main(String[] args){
		ArrayList<Integer> answer = new ArrayList<>();
		ArrayList<Integer> answer2 = new ArrayList<>();
		int [] a = new Random().ints(20, 0, 100).sorted().toArray();
		int [] b = new Random().ints(20, 0, 100).sorted().toArray();
		
		int p1=0,p2=0,count1=0,count2=0;
		while(p1<a.length&&p2<b.length) {
			if(a[p1]==b[p2]) {
				answer.add(a[p1]);
				p1++;
				p2++;
			}else if(a[p1]<b[p2]) {
				p1++;
			}else {
				p2++;
			}
			count1++;
		}
		
		
		for(int i=0;i<a.length;i++) {
			for(int j=0;j<b.length;j++) {
				count2++;
				if(a[i]==b[j]) {
					answer2.add(a[i]);
					break;
				}
			}
		}
		
		System.out.println(Arrays.toString(a));
		System.out.println(Arrays.toString(b));
		
		System.out.println(answer);
		System.out.println(answer2);
		
		System.out.println(count1);
		System.out.println(count2);
		
	}
}

결과

[1, 7, 10, 10, 13, 22, 26, 31, 32, 34, 44, 48, 57, 57, 66, 69, 79, 82, 88, 92]
[2, 6, 8, 19, 31, 33, 35, 40, 49, 59, 60, 60, 61, 63, 65, 73, 78, 88, 90, 99]
[31, 88]
[31, 88]
37
383

 


반복 횟수 차이가 극명하다....

 
 

가져오기 java.util.*;
교집합_ {

공개 정적 무효 메인(문자열[] 인수){
ArrayList<정수> 답변 = 새로운 ArrayList<>();
ArrayList<정수> answer2 = 새로운 ArrayList<>();
int [] a = 새로운 Random().ints(20, 0, 100).sorted().toArray();
int [] b = 새로운 Random().ints(20, 0, 100).sorted().toArray();

정수 p1=0,p2=0,count1=0,count2=0;
동안(p1<a.length&&p2<b.length) {
if(a[p1]==b[p2]) {
답변.add(a[p1]);
p1++;
p2++;
} else if(a[p1]<b[p2]) {
p1++;
}또 다른 {
p2++;
}
카운트1++;
}


for(int i=0;i<a.length;i++) {
for(int j=0;j<b.length;j++) {
카운트2++;
if(a[i]==b[j]) {
answer2.add(a[i]);
부서지다;
}
}
}

System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));

System.out.println(답변);
System.out.println(답변2);

System.out.println(count1);
System.out.println(count2);

}
}

 

'자료구조&알고리즘 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비' 카테고리의 다른 글

연속된 자연수의 합  (0) 2022.11.25
연속부분수열  (0) 2022.11.23
두배열합치기  (0) 2022.11.17
중복문자제거  (0) 2022.11.14
격자판 최대합  (0) 2022.11.12

+ Recent posts