코드


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.*;
class K번째큰수_ {	
	public static void main(String[] args){
		int[] arr = new Random().ints(100, 1, 101)
		            .toArray();
		
		int k = 4; //번째 큰수
		int n = arr.length;
		int count =0;
		
		// 역순 정렬을 위해 직접 Comparator 구현
		TreeSet<Integer> set = new TreeSet<>((a,b)->Integer.compare(b, a));
		
		for(int i = 0;i<n;i++) {
			for(int j=i+1;j<n;j++) {
				for(int z=j+1;z<n;z++) {
					set.add(arr[i]+arr[j]+arr[z]);
					count++;
				}
			}
		}
		//사이즈를 넘어선 k는 예외발생
		if(set.size()<k) {
			System.out.println("-1 not found");
		}
		int cnt = 1;
		int sum = 0;
		
		for(Iterator<Integer> it = set.iterator();it.hasNext() ;cnt++) {
			sum = it.next();
			System.out.print(sum+",");
			if(cnt==k) {
				System.out.println("\n"+k+"번째 큰 수 : "+ sum);;
				break;
			}
		}
		System.out.println("경우의 수 : " +count);
	}
}

결과

292,291,290,289,
4번째 큰 수 : 289
경우의 수 : 161700

List를 써서 해도 되지만, 해시가 더 빠르다.

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

후위연산  (0) 2022.12.01
모든 아나그램 찾기  (0) 2022.11.30
연속된 자연수의 합  (0) 2022.11.25
연속부분수열  (0) 2022.11.23
교집합  (0) 2022.11.20

코드

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.*;

// n개 == arr.length , 연속된 arr 배열 수 합이 m인 경우가 몇회인가?
class 연속부분수열 {

	public static void main(String[] args) {
		int 배열크기 = 50;
		int 합계 = 30;
		int[] arr = new Random().ints(배열크기, 1, 11).toArray();//1~10
		int answer = 0;
		System.out.println(Arrays.toString(arr));
		//핵심은 값을 증감 후 같을 수 있으니 검증로직을 한 번 더 태우는 것이다.
		for (int rt = 0, sum = 0, lt = 0; rt < arr.length;) {
			if (sum <= 합계) {
				if (sum == 합계) {
					prettyPrint(arr, lt, rt);
					answer++;
					sum -= arr[lt++];
				}
				
				sum += arr[rt++];
				
				if (sum == 합계) {
					prettyPrint(arr, lt, rt);
					answer++;
					sum -= arr[lt++];
				}
			} else {
				sum -= arr[lt++];
			}
		}
		System.out.println("총 카운트 = "+answer);
	}
	static void prettyPrint(int[] arr, int lt, int rt) {
		System.out.print("[lt="+lt+" rt="+(rt-1)+"]");
		Arrays.stream(arr, lt, rt).forEach(n->System.out.print(n+","));
		System.out.println();
	}
	
}

결과

[2, 9, 1, 3, 6, 4, 7, 4, 10, 4, 9, 10, 4, 6, 5, 2, 2, 5, 6, 3, 5, 10, 1, 8, 5, 9, 3, 8, 1, 5, 8, 6, 8, 2, 10, 8, 6, 8, 6, 1, 1, 7, 6, 5, 7, 7, 7, 9, 1, 3]
[lt=1 rt=6]9,1,3,6,4,7,
[lt=12 rt=18]4,6,5,2,2,5,6,
[lt=17 rt=22]5,6,3,5,10,1,
[lt=28 rt=33]1,5,8,6,8,2,
[lt=35 rt=40]8,6,8,6,1,1,
[lt=44 rt=47]7,7,7,9,
총 카운트 = 6

 

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

K번째 큰 수  (0) 2022.11.27
연속된 자연수의 합  (0) 2022.11.25
교집합  (0) 2022.11.20
두배열합치기  (0) 2022.11.17
중복문자제거  (0) 2022.11.14

코드

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

코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;

public class 두배열합치기_ {
	public static void main(String[] args) {
		
		int[] is1 = new Random().ints((int)(Math.random()*5000), Integer.MIN_VALUE, Integer.MAX_VALUE)
					.toArray();
		int[] is2 = new Random().ints((int)(Math.random()*5000), Integer.MIN_VALUE, Integer.MAX_VALUE)
					.toArray();
		
		int[] copyOf1 = Arrays.copyOf(is1, is1.length);
		int[] copyOf2 = Arrays.copyOf(is2, is2.length);
		
		
		StopWatch sw = new StopWatch();
		
		ArrayList<Integer> list1 = new ArrayList<Integer>();
		int p1=0,p2=0;
		
		sw.start();
		Arrays.sort(is1);
		Arrays.sort(is2);
		
		while(p1<is1.length && p2<is2.length) {
			if(is1[p1]<is2[p2] ) {
				list1.add(is1[p1++]);
			}else {
				list1.add(is2[p2++]);
			}
		}
		while(p1<is1.length) {
			list1.add(is1[p1++]);
		}
		while(p2<is2.length) {
			list1.add(is2[p2++]);
		}
		sw.stop();
		System.out.println("소요시간 : " + sw.time());
		
		sw.start();
		
		IntStream.concat(IntStream.of(copyOf1), IntStream.of(copyOf2))
		         .sorted()
		         .toArray();
		sw.stop();
		
		System.out.println("소요시간 : " + sw.time());
		
	}
}

class StopWatch{
	long startTime;
	long endTime;
	
	
	public long start() {
		return this.startTime = System.nanoTime();
	}
	
	public long stop() {
		return this.endTime = System.nanoTime();
	}
	
	public long time() {
		if(startTime == 0 && endTime == 0) {
			return -1;
		}
		return endTime - startTime;
	}
	
}

결과

소요시간 : 1521800
소요시간 : 1803400

1번째는 두포인터를 사용한 배열합치기(문제의도) , 2 번째는 궁금해서 해봤다.

 

두배열을 합친 결과를 정렬해야한다고 가정하고, 

소요시간이 엎치락 뒤치락한다...

 

데이터 건 수가 많으면 앞도적으로 스트림이 빠르다.

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

연속부분수열  (0) 2022.11.23
교집합  (0) 2022.11.20
중복문자제거  (0) 2022.11.14
격자판 최대합  (0) 2022.11.12
숫자뒤집기  (0) 2022.11.10

코드

import java.util.Arrays;

public class 중복문자제거_ {
    public static void main(String[] args) {
        String value = "112233112ㅁㄴㅇㅁㄴㅇ2334551123";
        String answer = "";
        
        int len = value.length();
        for(int i = 0 ; i<len ;i++) {
            //indexOf 는 가장 앞에 존재하는 문자를 반환한다.
            //charAt 은 특정 위치 char를 반환한다. 
            //따라서 아래 조건문은 첫 번째 존재하는 문자와 인덱스 위치만 참이된다.
            if(value.indexOf( value.charAt(i)) == i )  {
                answer += value.charAt(i);
            }
        }
        System.out.println(answer);
        
        Character[] array = value.chars()
                                 .distinct()
                                 .mapToObj(num->((char)num))
                                 .toArray(Character[]::new);
        System.out.println(Arrays.toString(array));
        
    }
}

결과

123ㅁㄴㅇ45
[1, 2, 3, ㅁ, ㄴ, ㅇ, 4, 5]

중복 문자 제거는 indexOf 메서드 동작방식에 의존한다.

indexOf()는 주어진 문자에 해당하는 가장 첫 번째 위치 인덱스를 리턴한다.

즉, 대상이 첫 번째 위치로 특정되어 있다. 

이를 활용해 반환된 인덱스와 배열을 순회하는 인덱스가 같으면 중복을 제거할 수 있다.

 

 

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

교집합  (0) 2022.11.20
두배열합치기  (0) 2022.11.17
격자판 최대합  (0) 2022.11.12
숫자뒤집기  (0) 2022.11.10
봉우리  (0) 2022.11.09

코드

import java.util.*;
import java.util.stream.IntStream;

class 격자판최대합 {	
	public static void main(String[] args){
		int max = Integer.MIN_VALUE;
		int n = 10;
		
		int[][] arr = IntStream.range(0, n)
				               .mapToObj(index->{
			    	               return new Random().ints(n, 1, 100)
			    			                          .toArray();
			                   }).toArray(int[][]::new);
		prettyPrint(arr);
		
		int rowSum, colSum, cSum1=0,cSum2=0;
		
		for(int i= 0; i<n; i++) {
			rowSum=0;
			colSum=0;
			//핵심 같은 반복문이라도 구조가 유사하니
			//j , i 위치만 바꾸면 한방에 해결
			//구조 i==j , i+j == length-1 , [고정][순회], [순회],[고정]
			for(int j= 0; j<n ;j++) {
				rowSum += arr[i][j]; //같은 행 합
				colSum += arr[j][i]; //같은 열 합
			}
			cSum1+=arr[i][i];     //좌상우하 대각선 for문 1개만 필요
			cSum2+=arr[i][n-1-i]; //우상좌하 대각선
			
			// 내가 틀린 부분 기존 값이 신규 값보다 더 클 수 있다는 것을 간과
//			max = rowSum<colSum ? colSum : rowSum;
			max = max < rowSum ? rowSum 
			    : max < colSum ? colSum : max ;
		}
		max = max < cSum1 ? cSum1 
			: max < cSum2 ? cSum2 : max;
		
		System.out.println(max);
		
	}
	static void prettyPrint(int[][] arr, boolean isIndex) {
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr[i].length;j++) {
				if(isIndex) System.out.printf("%2d,%2d ", i,j);
				else System.out.printf("%2d" + (j==arr[i].length-1? "":",") ,arr[i][j]);
			}
			System.out.println(isIndex?"\n":"");
		}
	}
	static void prettyPrint(int[][] arr) {
		prettyPrint(arr, false);
	}
}

결과

 

92,70,45,49,49,56,60,93,58,72
20,49,49,71,50,25,41,70,86,89
29,33,69,31,11,33,57, 4,90,75
74,14,22,60,33,42,14,94,37,15
70,64,12,17, 6,23,90,52,65,45
96,90, 5,53,84,50,32,61,70,68
84,74,80,79,83,92, 6,32, 2,22
95,14,81,26,84, 9,25,55,89,93
51,84,84,66,11,46,20,33,92,87
97,12,89,13, 9,10,16,11,72,32
661

정사각형 배열의 경우 i, j 길이가 같기 때문에 [i][j] ,  [j][i] 이렇게 바꿔주면 행 합, 열 합을 구할 수 있다.

대각선의 경우, 인덱스가 같으면 좌상우하 대각선이다.

우상좌하 대각선의 경우 j 자리에  "크기-1-i" 를 하면 값을 쓰면 된다.

다른 방법으론 "i+j == 크기-1"   식을 사용하면 된다

 
 

import java.util.*;
import java.util.stream.IntStream;

class 격자판최대합 {
public static void main(String[] args){
int max = Integer.MIN_VALUE;
int n = 10;

int[][] arr = IntStream.range(0, n)
.mapToObj(index->{
return new Random().ints(n, 1, 100)
.toArray();
}).toArray(int[][]::new);
prettyPrint(arr);

int rowSum, colSum, cSum1=0,cSum2=0;

for(int i= 0; i<n; i++) {
rowSum=0;
colSum=0;
//핵심 같은 반복문이라도 구조가 유사하니
//j , i 위치만 바꾸면 한방에 해결
//구조 i==j , i+j == length-1 , [고정][순회], [순회],[고정]
for(int j= 0; j<n ;j++) {
rowSum += arr[i][j]; //같은 행 합
colSum += arr[j][i]; //같은 열 합
}
cSum1+=arr[i][i]; //좌상우하 대각선 for문 1개만 필요
cSum2+=arr[i][n-1-i]; //우상좌하 대각선

// 내가 틀린 부분 기존 값이 신규 값보다 더 클 수 있다는 것을 간과
// max = rowSum<colSum ? colSum : rowSum;
max = max < rowSum ? rowSum
: max < colSum ? colSum : max ;
}
max = max < cSum1 ? cSum1
: max < cSum2 ? cSum2 : max;

System.out.println(max);

}
static void prettyPrint(int[][] arr, boolean isIndex) {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
if(isIndex) System.out.printf("%2d,%2d ", i,j);
else System.out.printf("%2d" + (j==arr[i].length-1? "":",") ,arr[i][j]);
}
System.out.println(isIndex?"\n":"");
}
}
static void prettyPrint(int[][] arr) {
prettyPrint(arr, false);
}
}

 

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

두배열합치기  (0) 2022.11.17
중복문자제거  (0) 2022.11.14
숫자뒤집기  (0) 2022.11.10
봉우리  (0) 2022.11.09
등수구하기  (0) 2022.11.05

코드

public class 숫자뒤집기 {
	public static void main(String[] args) {
		int value = 12345;
		int rest = 0;
		int count = 0;
		//value의 일의 자리를 계속 자르고 맨 앞으로 보낸다.
		while(value>0) {
			int units = value % 10 ; // 일의 자리 구하기
			// 일의 자리를 계속 10곱하기 반복, 결국 뒤집기가 된다.
			rest = rest * 10 + units;
			System.out.println(value+" "+ ++count + "회 " + rest  
					+" | 일의 자리를 *10 하다보면 뒤집어진다.");
			value = value / 10;		 // 십의 자리만큼 제거
		}
		value = rest;
	}
}

결과

12345 1회 5 | 일의 자리를 *10 하다보면 뒤집어진다.
1234 2회 54 | 일의 자리를 *10 하다보면 뒤집어진다.
123 3회 543 | 일의 자리를 *10 하다보면 뒤집어진다.
12 4회 5432 | 일의 자리를 *10 하다보면 뒤집어진다.
1 5회 54321 | 일의 자리를 *10 하다보면 뒤집어진다.

핵심은 일의 자리를 때고 10씩 곱하다보면 숫자가 뒤집힌다.

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

중복문자제거  (0) 2022.11.14
격자판 최대합  (0) 2022.11.12
봉우리  (0) 2022.11.09
등수구하기  (0) 2022.11.05
문자뒤집기  (0) 2022.11.03

코드



import java.util.*;
import java.util.stream.IntStream;
/*
핵심
별도 탐색 배열을 만드는 것
탐색 배열을 이용해 반복문으로 인덱스 보정
보정 값에 조건문
탐색 배열의 이점, 조건문 4번으로 검사해도 되지만, 
만약 좌상,상, 우상, 이렇게 8방향을 검사하라고 하면?
*/
class 봉우리 { 
    public static void main(String[] args){
        //봉우리 크기
        final int LENGTH = 10;
        //봉우리 높이
        final int HEIGTH = 10;
        int answer=0;
        int[][] arr =   IntStream.range(0, LENGTH)
                                 .mapToObj(num->{
                                     return new Random().ints(LENGTH, 0, HEIGTH)
                                                        .toArray();
                                 }).toArray(int[][]::new);
        prettyPrint(arr);
        
        // 타겟[i][j] 위치에 상 우 하 좌 위치 탐색 배열
        int[] dx={-1, 0, 1, 0};
        int[] dy={0, 1, 0, -1};
        
        for(int i=0; i<LENGTH; i++){
            for(int j=0; j<LENGTH; j++){
                
                boolean flag=true;
                //탐색을 위한 반복문 순회
                for(int k=0; k<4; k++){
                    //인덱스 보정   상, 우, 하, 좌
                    int ni=i+dx[k];
                    int nj=j+dy[k];
                    // 보정인덱스는 -1이나 배열크기면 크다고 가정한다. 
                    // 예를들어 [0,0] [마지막][마지막] 배열을 보정하면 배열범위를 초과해 익셉션 발생
                    if(0<=ni && ni<LENGTH && 0 <= nj && nj<LENGTH && arr[i][j]<=arr[ni][nj] ){
                        flag=false;
                        //한 개라도 작거나 같으면 break
                        break;
                    }
                }
                if(flag) {
                    System.out.print("["+i+","+j+"] "+arr[i][j]+(answer%5==4?"\n":""));
                    answer++;
                }
            }
        }
        System.out.println();
        System.out.println(answer);
    }
    static void prettyPrint(int[][] arr, boolean isIndex) {
        for(int i=0;i<arr.length;i++) {
            for(int j=0;j<arr[i].length;j++) {
                if(isIndex) System.out.printf("%2d,%2d ", i,j);
                else System.out.printf("%2d" + (j==arr[i].length-1? "":",") ,arr[i][j]);
            }
            System.out.println(isIndex?"\n":"");
        }
    }
    static void prettyPrint(int[][] arr) {
        prettyPrint(arr, false);
    }
}

결과

 5, 4, 4, 1, 5, 6, 3, 5, 0, 3
 7, 4, 8, 7, 7, 7, 1, 4, 4, 9
 9, 3, 7, 3, 9, 2, 6, 2, 0, 2
 7, 1, 2, 6, 0, 2, 0, 5, 9, 9
 3, 0, 1, 3, 9, 1, 5, 3, 1, 9
 2, 8, 2, 2, 0, 6, 0, 4, 9, 3
 1, 3, 6, 8, 6, 8, 6, 4, 8, 0
 0, 6, 3, 6, 2, 3, 2, 2, 6, 7
 1, 5, 4, 4, 5, 7, 6, 4, 7, 2
 9, 4, 7, 3, 2, 2, 5, 8, 7, 9
[0,7] 5[1,2] 8[1,9] 9[2,0] 9[2,4] 9
[2,6] 6[3,3] 6[4,4] 9[4,6] 5[5,1] 8
[5,8] 9[6,3] 8[6,5] 8[7,1] 6[7,9] 7
[8,5] 7[9,0] 9[9,2] 7[9,7] 8[9,9] 9

20

핵심 구조는 2차원 배열을 순회하는 이중 반복문을 사용하는데 이정된 인덱스[][] 마다 내 상, 하, 좌, 우를 검증하는 반복문을 넣는 것이다.

위 예제를 단순히 삼중 반복문 사용하네!! 이렇게 접근하면 복잡하고 어려워진다.

이차원 배열을 순회하는 이중 반복문 + 지정된 배열[][] 마다 검증로직(반복문)     

이렇게 접근해야 쉬워진다.

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

격자판 최대합  (0) 2022.11.12
숫자뒤집기  (0) 2022.11.10
등수구하기  (0) 2022.11.05
문자뒤집기  (0) 2022.11.03
가위바위보  (0) 2022.10.28

+ Recent posts