진수를 변환하는 알고리즘을 사용하면 간단하게 풀리는 문제들이 있습니다.

그래서 진수 변환하는 방법을 정리해보도록 하죠

 

1. 10진수 -> 2진수 변환

public void DecimalTobinary(int num) {
		StringBuffer sb = new StringBuffer(); // 거꾸로 출력하기 위한 버퍼 생성
		String answer="";
		while(num>0) {
			answer += num%2;
			num = num/2;
		}
		sb.append(answer); // 버퍼에 answer 저장하고
		System.out.println(sb.reverse()); // 거꾸로 출력하기
	}

 

2. 10진수 -> 8진수 변환

public void DecimalToOctal(int num) {
		StringBuffer sb = new StringBuffer();
		String answer="";
		while(num>0) {
			answer += num%8;  //8로 나눈 나머지 저장
			num = num/8; // 8 나누기
		}
		sb.append(answer);
		System.out.println(sb.reverse());
	}

이제 특징이 보이나여??
10진수 -> N진수로 변환하고 싶으면 원하는 숫자를 0이 될때까지 N으로 나눈 나머지를 출력하면 된다는 것!
(단, N은 1< N < 10을 만족하는 정수)

 

// 2 -> 10
// 8 -> 10
// 16 -> 10 , 10 -> 16 등등 모두 정리하기

3. 

'알고리즘 공부 > 코딩테스트 준비' 카테고리의 다른 글

DFS/BFS 탐색 알고리즘 (행렬 구현)  (0) 2019.06.03
피보나치 수열  (0) 2019.05.20
행렬의 회전  (0) 2019.05.20

피보나치수열을 알면 1분컷 모르면 난이도 헬이 되는 문제들이 많죠

피보나치 수열 문제는 구현이 어렵지 않습니다.
이 문제를 피보나치로 풀 수 있느냐 아니냐를 판단할 수 있는 능력이 더욱 중요할 것 같습니다.

 

시작!

 

1. 피보나치 수열

피보나치는 f(n) = f(n-1) + f(n-2) 라는 공식을 갖는 수열입니다.

f(1) = 1, f(2) = 1 이라고 가정하게 되면 수열은 아래와 같이 진행됩니다.

1 -> 1 -> 2 -> 3 -> 5 -> 8 -> 13 -> 21 -> 34 -> 55 -> 89 -> 144 .....

대표적으로 타일링 문제가 피보나치 수열을 사용하는 문제 중 하나죠.

피보나치를 구현하는 방법은 다양합니다만 오늘 다룰 방식은 1)재귀함수 방식, 2)for문을 이용한 방식
이렇게 2가지로 구현하여 정리 해 볼 예정입니다.

 

2. 재귀함수를 이용하여 피보나치 수열 구현하기

public int fibo_Recursive(int num) {
		//1,1,2,3,5,8,13,21,34,55,89,143 ...
		if(num == 1) {return 1;}
		else if(num == 2) {return 1;}
		else
			return fibo_Recursive(num-2) + fibo_Recursive(num-1);
	}

코드는 간단합니다.

그럼 피포나치 수열 중 6번째 수를 구하는 과정을 보도록 하겠습니다. (1, 1, 2, 3, 5, 8 ...)

그림 1. 피보나치 순환 구조

 

6번째 값을 구하는 과정을 보면 위 그림과 같이  f(5) -> f(4) -> f(3) -> f(2),f(1) 순서로 함수를 호출하며 값을 더해 갑니다.

그런데 이 경우 구현은 쉽지만 재귀함수 특성상 메모리를 많이 사용하기 때문에 코딩테스트에서 사용하기엔 적합하지 않습니다.

그래서 두 번째 방법 반복문을 이용하여 피보나치를 구현하는 것 입니다.

 

2. 반복문을 이용하여 피보나치 수열 구현하기

코드를 먼저 보도록 하겠습니다.

public int fobo_loop(int num) {
		int cur = 1;  // 현재 값
		int next = 1; // 다음 값
		int answer = 0; // 합을 저장할 변수
		
		for(int i=1; i<=num; i++) {
			cur = next;
			next = answer;
			answer = next + cur;
		}
		return answer;
	}

 

for문으로 구현할 경우
1) 현재 값을 저장할 변수 cur 다음 값을 저장할 next, 그리고 두개의 합을 저장할 변수 answer을 생성하고
2) 첫째항부터 원하는 위치까지 하나씩 더하는 과정을 반복 합니다.

6번째 항을 구하는 과정을 그림으로 봅시다.

그림 2. 피보나치 수열 반복문 구조

그림에서 보듯이 첫째 항 : cur = 1,  둘째 항 : next = 2로 두고, 이 두개를 더한 값을 answer에 저장합니다.
처음에 6번째 수를 구하고자 하였으니 6번을 반복하게 되면 원하는 값인 8이 출력되게 됩니다.

반복문으로 구현하게 되면 기대 되는 시간 복잡도는 O(n)이 되기 때문에  재귀함수에 비해 효율적으로 사용할 수 있어 코딩테스트를 할때 사용하기 편리합니다.

 

이상!

'알고리즘 공부 > 코딩테스트 준비' 카테고리의 다른 글

DFS/BFS 탐색 알고리즘 (행렬 구현)  (0) 2019.06.03
진수 변환  (0) 2019.05.20
행렬의 회전  (0) 2019.05.20

코딩 테스트를 준비할때 알아두면 시험볼때 편리 할 코드들을 정리하겠습니다.

 

1.  행렬의 순환

여기서 포스팅하려는 행렬의 순환은 N x M 행렬이 주어지고,
아래 그림과 같이 한 방향으로 순환을 하는 코드를 말합니다.

그림으로 예를 보자면

그림 1. 3 x 3 행렬 순환 하기 (1)

 

1) 코드를 한 번 실행하면 아래 그림과 같이 (1,2)에 있는 동그라미가 (1,3)으로 이동

그림 2. (1,2) 에서 (2,3)으로 이동

 

2) 한번 더 실행하면 (1,3)에 있는 동그라미가 (2,3)으로 이동

그림 3, (1,3)에서 (2,3)으로 이동

 

3) 이것을 반복하면 행렬의 가장자리를 순환하게 됩니다.

이와 같은 행렬의 순환 코드를 정리 해보도록 하겠습니다.

 

2. 가장자리를 한칸 씩 이동하기

여기서 구현해 볼 코드는 그림 1 -> 그림 2 에서 볼때 처럼 (1,2)에 있는 동그라미를 삭제하고
(1,3)에 입력 해서 한번만 수행하는 것이 아닌,
아예 한번 실행하면 (1,1) 부터 가장자리만 한 칸씩 이동하도록 구현해 보겠습니다!!

그림으로 보자면 아래와 같습니다.

1) 한바퀴 돌면 아래 그림과 같이 가장자리를 1칸씩 이동합니다.

그림 4. 가장자리 순환 (1)

2) 한바퀴 더 돌면 아래 그림과 같아집니다.

그림 5. 가장자리 순환 (2)

 

3. 코드로 구현하기

이제 코드로 구현해보겠습니다.

package codingTest_concept;

public class Matrix_circulation {
	
	public void circulation(String[][] matrix) {
		
		int start_h = 0;
		int start_w = 0;
		String temp_1 = matrix[start_h][start_w];
		String temp_2 = "";
		
		//오른쪽 이동
		while(start_w != matrix.length-1) {
			temp_2 = matrix[start_h][start_w+1];
			matrix[start_h][start_w+1] = temp_1;
			temp_1 = temp_2;
			start_w = start_w+1;
		}
		//아래로 이동
		while(start_h != matrix.length-1) {
			temp_2 = matrix[start_h+1][start_w];
			matrix[start_h+1][start_w] = temp_1;
			temp_1 = temp_2;
			start_h = start_h+1;
		}
		//왼쪽으로 이동
		while(start_w != 0) {
			temp_2 = matrix[start_h][start_w-1];
			matrix[start_h][start_w-1] = temp_1;
			temp_1 = temp_2;
			start_w = start_w-1;
		}
		//위로 이동
		while(start_h != 0) {
			temp_2 = matrix[start_h-1][start_w];
			matrix[start_h-1][start_w] = temp_1;
			temp_1 = temp_2;
			start_h = start_h-1;
		}
		
		//출력
		for(int i=0; i<matrix.length; i++) {
			for(int j = 0; j<matrix[i].length; j++ ) {
				System.out.print(matrix[i][j]+" ");
			}
			System.out.println();
		}
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Matrix_circulation m = new Matrix_circulation();
		
		String[][] matrix = {{"A","B","C"},{"H"," ","D"},{"G","F","E"}};
		
		m.circulation(matrix);
		System.out.println();
		m.circulation(matrix);
		

	}

}

 

 

4. 코드 설명

코드가 어떻게 돌아가는건지 그림으로 정리해보져

1. 첫번째로 temp_1, tmep_2를 생성한 후, temp_1에는 시작 위치의 값을 저장합니다.
그리고 오른쪽 이동 while문으로 진입합니다. 그리고 temp_2에 그 오른쪽 위치의 값을 저장합니다.

그림 6. while문 오른쪽 이동 (1)

2. 그 다음 temp_1에 저장된 값을 오른쪽 위치에 저장하고, 현재 위치를 한칸 이동합니다.
(여기까지가 while문 오른쪽 이동 1바퀴 입니다.)

그림 7. while문 오른쪽 이동(2)

3. 다시 1번 부터 반복하게 됩니다.
1)temp_2에 현위치 기준 오른쪽 값을 저장하고,
2)오른쪽 위치에 temp_1에 저장된 값을 삽입합니다.
3) temp_1에 temp_2 값을 저장합니다.
4)그리고 현재 위치를 오른쪽으로 +1 하여 이동시킵니다.
5) 현재 위치가 행렬크기와 같아짐으로 while문을 빠져나옵니다.

그림 8. while문 오른쪽 이동 (3)

 

- while문 아래쪽
오른쪽 이동이 완료되었으니, 아래쪽으로 이동 while문을 시작합니다.
1) temp_2에 현 위치 기준 아래쪽 위치의 값을 저장합니다.
2) temp_1에 저장되어있던 값을 아래쪽 위치에 저장합니다.

그림 9. while문 아래쪽 이동(1)

3) 그리고 아래 그림과 같이 현재 위치를 아래로 한 칸 이동합니다.
(이렇게 하면 아래쪽 while문 한바퀴를 돌게 됩니다.)

그림 10. while문 아래쪽 이동(2)

그림 9, 그림 10 과정을 아래쪽 위치가 행렬의 h 크기와 동일해질때까지 반복합니다.

그림 11. while문 아래쪽 이동(3)

 

그림 12. while문 아래쪽 이동(4)

이렇게 되면 현재 위치와 행렬의 h값과 동일해짐으로 while문을 빠져나옵니다.

그 다음은 왼쪽 이동 while로 진입하게 됩니다.

왼쪽 이동은 오른쪽 이동 반대로, 위쪽 이동은 아래쪽 이동 반대로 진행되기에 그림은 생략하겠습니다.
(귀찮은거 아님)

 

 

왼쪽이동 while을 끝내고 위쪽이동 while을 끝내면 아래 그림과 같이 마무리가 됩니다!

그림 13. while문 위쪽 이동 마지막

 

이렇게 메서드를 실행하면 한바퀴를 돌게 되는 것이죠!

움직이는 미로 탈출이나, 광고판 시뮬레이션 문제를 풀게될때, 이용하면 좋을 것 같아 정리해보았습니다.


while문의 순서를 바꾸면 반 시계방향으로 돌릴 수 있고, 한번 실행 시 2칸씩 이동한다는 조건이 있으면, 위 메서드를 2번 실행시키면 됩니다.

물론, 효율성 문제를 따지는 문제라면 다른 방식을(?) 찾아봐야겠지만요.

 

'알고리즘 공부 > 코딩테스트 준비' 카테고리의 다른 글

DFS/BFS 탐색 알고리즘 (행렬 구현)  (0) 2019.06.03
진수 변환  (0) 2019.05.20
피보나치 수열  (0) 2019.05.20

예제를 볼때는 트리를 이용해서 DFS/BFS 탐색 이론을 배운다.

그리고 다음과 같은 예제 보고 "각자 BFS/DFS 탐색 방식 구현해보는 실습하세요~"라고 하면 멘붕

사진 1. 트리 예제

 

이론을 알겠는데, 막상 구현해볼라하면 어떻게 하지? 라는 생각이 든다. 
(수업할때 나 빼고 다 아는것 같았음.. 난 몰랐어서 정리 ㅎ)

 

일반적으로 트리를 표현할 때에는 인접행렬 혹은 인접리스트 이렇게 2가지 방식으로 구현한다.

 

1. 인접행렬

인접행렬? 말 그대로다. 2차원 배열로 구현하는 것이다. 

사진 2. 트리 - 인접행렬

	int[][] arr = {{0,1,1,0,0}, {1,0,0,0,0}, {1,0,0,1,1}, {0,0,1,0,0}, {0,0,1,0,0}};

너무 당연한가?  ㅋㅋㅋㅋㅋ (1,1)~(5,5) 대각선 기준으로 대칭이 되는 것을 볼 수 있다.

 

2. 인접리스트

인접리스트는 그래프를 이용하여 구현한다. 인접 행렬에 비해 눈으로 보고 이해하기 더 쉽다. (개인적인 의견임)

package java_BFS_DFS_basic;
import java.util.LinkedList;
/*
 * DFS - 그래프를 이용하여 구현
 * 그래프 구현방법 - 인접행렬 / 인접리스트 방식 중 
 * 인접리스트를 이용하여 구현
*/

public class Graph {
	 	private LinkedList<Integer>[] adj; //인접 리스트 생성
	    private int v; //vertex - 정점
	    
	    // 그래프 생성 및 초기화
	    Graph(int v){
	    	this.v = v; //정점 개수 초기화
	    	//visit = new boolean[v]; // 체크를 위한 값 생성
	    	adj = new LinkedList[v+1]; // v로 하면 0부터 시작하니까, 보기 쉽게 1부터함. 0은 공백으로 둠
	    	//인접리스트 초기화 작업
	    	for(int i=0; i<v+1; i++) {
	    		adj[i] = new LinkedList();
	    	}
	    }
	    
	    // 그래프 인자끼리 연결하기
	    void addEdge(int v1, int v2) {
	    	adj[v1].add(v2);
	    	adj[v2].add(v1);
	    }
	 
	    
	    public static void main(String args[]) {
	    	Graph dfs_g = new Graph(5);
	  
	        dfs_g.addEdge(1, 2);
	        dfs_g.addEdge(1, 3);
	        dfs_g.addEdge(3, 4);
	        dfs_g.addEdge(3, 5);
	        
	        //인자값 1부터 출력
	        for(int i=1; i<dfs_g.adj.length; i++) {
	        	System.out.println(i+" : "+dfs_g.adj[i]);
	        }   
	    }
}


출력결과 :
1 : [2, 3]
2 : [1]
3 : [1, 4, 5]
4 : [3]
5 : [3]

코딩 테스트에서 구현할때는 주로 행렬 형태로 많이 주니까, 행렬로 연습하는 것이 좋을 듯 싶다.
근데 최단경로 간선에 값이 추가된다면 인접리스트로 구현하고 푸는것이 나을수도 있다는 생각이듬

아무튼 방법은 2가지 이고, 경우에 따라 효율적이라고 생각하는 방식으로 만들어서 풀면 될 듯 하다.

 

 

DFS를 이용하는 문제를 예로 들자면 주로 넓이 구하는 문제/ 길찾기 문제일 것입니다.

그 중 부분적인 넓이를 구하는 문제를 풀면서 정리를 좀 해보져

 

1. 문제

다음과 같은 행렬이 있다고 하자

사진 1. 행렬 영역 구하기 문제

그리고 오른쪽에 표시한 것과 같이 3부분으로 나뉘고 각각 넓이는 6/2/8 이다.

이렇듯 행렬의 각각의 영역의 넓이를 구하는 문제를 DFS를 활용하여 풀어본다.

 

2. 문제풀이

풀이 방법은 0,0 부터 탐색한다.
1. 0,0부터 시작해서 상하좌우로 움직이며 1인 곳만 탐색
2. 0을 만나면 끝내기
(DFS인데 Stack을 이용 안한 이유는 재귀함수를 이용할 경우 재귀함수 불릴때마다 메모리에 스택으로 쌓이고 처리하기 때문에 따로 Stack 만들진 않았다.)

 

3. 자바 코드

package java_BFS_DFS_basic;
import java.util.ArrayList;
/*
 * DFS를 이용하여
 * (NxN)인접행렬 넓이 구하기
 * */
public class adjMatrics_DFS {
	 private static int[] X = {-1,0,1,0}; // X축의 상하좌우 이동을 위한 배열 
	 private static int[] Y = {0,1,0,-1}; // Y축의 상하좌우 이동을 위한 배열 (x,y 짝만 맞추어주면 상하좌우든 하좌우상 이든 순서 상관x)
	 private static int[][] map;
	 private static int cnt=1;
	 
	 
	 public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<Integer> arr = new ArrayList<Integer>(); //각 영역의 넓이를 저장할 ArrayList 생성
		adjMatrics_DFS b = new adjMatrics_DFS(); 
		int[][] map = {{1,1,1,0,1},
					   {1,1,0,0,1},
					   {1,0,1,1,0},
					   {0,0,1,1,1},
					   {0,0,1,1,1}};
		boolean[][] check = new boolean[map.length][map[0].length]; //방문한 곳을 체크하기 위한 배열 행렬 생성
		
		for(int i=0; i<map.length; i++) {
			//System.out.println("다음 찾기 시작");
			//(0,0) 부터 탐색 시작 후 1을 만나면 넓이 구하기 시작
			for(int j=0; j<map[i].length; j++) {
				if(map[i][j] == 1) {
					b.dfs(i,j,check,map);
					arr.add(cnt);
					cnt = 1;
				}
			// 아닌경우 continue
				else
					continue;
			}
		}
	//	System.out.println("프로그램 종료");
		System.out.println("arr : "+ arr);
	}
	 
	 public void dfs(int x, int y, boolean[][] ck,int[][] map) {
		 
		 System.out.println(x+","+y);
		 ck[x][y] = true;
		 map[x][y] = 0;
		 
		 for(int i=0; i<4; i++) {
			 int nextX = x + X[i];
			 int nextY = y + Y[i];
			//상,하,좌,우 이동 중 범위가 넘어서는 경우 continue
			if(nextX <0 || nextY<0 || nextX>=ck.length || nextY>=ck.length) {continue;}
			//방문한곳은 continue
			if(ck[nextX][nextY]){continue;}
			//0은 벽이라서 이동할 경로가 벽이면 continue
			if(map[nextX][nextY] == 0) {ck[nextX][nextY] = true; continue;}
			
			dfs(nextX,nextY,ck,map);
			cnt++;
		 }
		 //System.out.println("END");
		 //System.out.println();
	 }
}

 

출력 결과 :  arr : [6, 2, 8]

 

DFS / BFS 이론은 알겠는데, 문제를 풀다보면 어떻게 구현하지? 라는 생각이 많이 든다.
그래서 다음글엔 DFS / BFS를 어떻게 구현할지 정리해 본다.

오늘은!!

코딩테스트를 볼때 DFS/BFS를 이용해야 풀 수 있는 문제들이 자주 출제 되기 때문에, DFS / BFS 알고리즘에 관하여 정리하려고 합니다.

시작~

 

목차

  1. DFS 알고리즘이란?
  2. 이진 탐색을 이용한 DFS 탐색 순서 알아보기

 

 

 

 

 

1. DFS(Dept First Search) 알고리즘 이란?

Dept First Search(이하 DFS)는 깊이를 우선 탐색하는 알고리즘 이다.

주로 Stack을 이용하여 구현되며, 코딩 테스트를 이용하여 구현할때는 재귀함수를 이용하여 구현하기도 한다.

주로 2차 행렬 넓이 구하기, 완전 탐색 문제 등에 자주 이용된다.

 

 

2. DFS 탐색 순서 이진 탐색을 이용한 DFS 탐색 순서 알아보기

사진 1. 이진 트리

 

이렇게 이진트리 하나가 있다고 하자. 그럼 DFS는 어떻게 탐색을 하는가?
위의 예시로 진행!

2.1. 1부터 시작할 것이기 때문에 1을 일단 push 한다. 그리고 탐색 한 자리는 탐색했다는
      마커 표시

사진 1-1. DFS 탐색 순서(1)

 

2.2. 1을 pop 한 후 1의 자식노드가 있으면 push한다

사진 1-2 DFS 탐색 순서(2)

 

2.3. 3 pop()하면서 방문체크, 이후 3의 자식이 있으면 자식들 push

사진 1-3 DFS 탐색 순서(3)

 

2.4. 3의 자식노드인 6,7 순서대로 push

사진 1-4. DFS 탐색 순서(4)

 

2.5. 7부터 자식 없으니 pop, 6 자식 없으니 pop

사진 1-5. DFS 탐색 순서(5)

 

2.6.  2 pop 이후 자식도느 push

사진 1-6. DFS 탐색 순서(6)

 

(마지막)2.7. 2의 자식노드 push

사진 1-7. DFS 탐색 순서(7)

 

이렇게 돌아간다. DFS 탐색을 이용하여 전위식 / 중위식/ 후위식을 표현하도록 만들 수 있다.

암튼 개념은 이렇고, 코드로 구현하는건 다음 글에서 진행하겠습니다.

 

[삽입 /선택 / 버블 정렬 구현하기]

JAVA로 구현했습니다.

가끔씩 까먹을 때 한번씩 찾아 보려구 작성했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package pracitce_note;
 
/* 실행시간이 n2인 정렬
 * 오름차순 기준 */
public class Sort {
    
    public void print_array(int[] answer) {
        for(int i : answer) {
            System.out.print(i+" ");
        }
        System.out.println();
        System.out.println();
    }
    
    public int[] insert_sort(int[] answer) {
        
        int temp;
        /* insert Array (삽입정렬)
         * i번째 값을 선택 , i값은 answer길이보다 커지면 스탑 
         * j번째 부터 n번째까지 비교
         * 
         * */
        
        for(int i=1; i<answer.length; i++) {
            temp = answer[i];
            for(int j=i-1; j>=0; j--) {
                if(temp < answer[j]) {
                    answer[j+1= answer[j];
                    answer[j] = temp;                    
                }
            }    
            System.out.println(i+"번째 회전 후");
            print_array(answer);
        }
        
        return answer;
        
    }
    
    public int[] slection_sort(int[] answer) {
        int min;
        int temp=0;
        
        /* Selection Sort (선택정렬 )
         * 1) min값을 찾는다 (min 선택)
         * 2) min값을  (i 번째와 바꾼다)
         * */
        
        for(int i=0; i<answer.length-1; i++) {
            min = i;
            for(int j=i+1; j<answer.length; j++) {
                
                if(answer[min]>answer[j]) {
                    min = j;
                }
            }
            temp = answer[i];
            answer[i] = answer[min];
            answer[min] = temp;
            
            System.out.println(i+1+"번째 회전 후");
            print_array(answer);
        }
        
        return answer;
    }
    
    public int[] bubble_sort(int[] answer) {
        
        int temp;
        
        /*
         * 서로 인접한 두 원소를 검사하여 정렬하는 알고리즘
         * j번과 j+1번을 비교해서 j가 더 크면 서로 자리 변경
         * 
         * */
        for(int i=0; i<answer.length-1; i++) {
            for(int j=0; j<answer.length-1-i; j++) {
                if(answer[j] > answer[j+1]) {
                    temp = answer[j];
                    answer[j] = answer[j+1];
                    answer[j+1= temp;
                }
            }
            System.out.println(i+1+"번째 회전 후");
            print_array(answer);
        }
        
        return answer;
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        int[] answer = {4,1,5,3,2};//{2,1,4,3,5};
        
        Sort s= new Sort();
        
        System.out.println("초기 배열 : ");
        s.print_array(answer);
        
        s.insert_sort(answer);        
        //s.bubble_sort(answer);
        //s.slection_sort(answer);
        
        
    }
 
}
 
cs




프로그래머스 lv.1 문제


사실 문제가 어려워서 글을 작성하는 것이 아니고

'자바 - 컬렉션과 제네릭' 파트 부분이 많이 부족하다는 것은 인지 하고 있었지만


제가 10줄이 넘어가게 코드를 짤 동안 이것을 아는 사람들은 1~2줄 만에 끝내버리는 격차를 발견 후

살짝 현타가 와서 정리합니다 ㅋㅋㅋㅋㅋ

늦기 전에 다시 공부하기 ㅠㅠ 컬렉션 제네릭 람다식..


[문제 설명]

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

[제한사항]
  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.
[입출력 예]

arr                  divisor     return

[5, 9, 7, 10] 5              [5, 10]

[2, 36, 1, 3] 1          [1, 2, 3, 36]

[3,2,6]         10          [-1]


[문제 풀이]

1. arr 배열에 있는 수를 divisor로 나누어 떨어지면 ArrayList에 add

2. ArrayList를 다시 asnwer로 옮긴 후 정렬해서 return


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
  public int[] solution(int[] arr, int divisor) {
      //int[] answer = {};
      ArrayList<Integer> arr_list = new ArrayList<Integer>();
      int cnt=0;
      for(int i=0; i<arr.length; i++){
          if(arr[i]%divisor == 0){
              arr_list.add(arr[i]);
          }
      }
      
      if(arr_list.size()==0){
          arr_list.add(-1);
      }
      int[] answer = new int[arr_list.size()];
      for(int j=0; j<arr_list.size(); j++){
          answer[j] = arr_list.get(j);
      }
      Arrays.sort(answer);
      return answer;
  }
}
cs


위의 내용을 이렇게도 풀 수 있습니다!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Arrays;
class Solution {
  public int[] solution(int[] arr, int divisor) {
 
        int[] answer = Arrays.stream(arr).filter(factor -> factor % divisor == 0).toArray();
        int[] answer_null = {-1};
        
        Arrays.sort(answer);
        if(answer.length==0) {
            return answer_null;
        }
        else        
            return answer;
  }
}
cs


오히려 어려운 문제 풀었을 때 보다 이렇게 내가 어리석다는 것을 깨달을 때가 더욱 자극 되는 것 같습니다.

(관련 내용 정리하기 ~)


'알고리즘 공부 > 알고리즘 문제' 카테고리의 다른 글

트리 dfs 탐색  (0) 2021.04.23
백준 (2178) - 미로탐색 (java)  (0) 2019.06.04
문자열 내 맘대로 정렬하기  (0) 2019.03.12
빙고 개수 카운트하기  (0) 2019.01.31
배열 회전 결과값 확인하기  (1) 2019.01.26

+ Recent posts