devlog of ShinJe Kim

[javascript] 프로그래머스|Level1|평균 구하기

|

문제 설명 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

제한 조건

  • arr은 길이 1 이상, 100 이하인 배열입니다.
  • arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.

나의 풀이

function solution(arr) {
    var answer = 0;
    for(var i=0; i<arr.length; i++){
        answer += arr[i];
    }
    return answer/arr.length;
}

다른 사람의 풀이 1.

function solution(arr) {
    var answer = 0;
    for(var value of arr){
        answer += value;
    }
    return answer/arr.length;
}

다른 사람의 풀이 2.

function solution(arr) {
    return arr.reduce((a, b) => a + b) / arr.length;
}


새롭게 알게된 것

  • for … of 의 사용법
  • reduce 함수

[알고리즘] 프로그래머스 Level2. 행렬의 곱셈(풀이중)

|

문제

행렬의 곱셈은, 곱하려는 두 행렬의 어떤 행과 열을 기준으로, 좌측의 행렬은 해당되는 행, 우측의 행렬은 해당되는 열을 순서대로 곱한 값을 더한 값이 들어갑니다. 행렬을 곱하기 위해선 좌측 행렬의 열의 개수와 우측 행렬의 행의 개수가 같아야 합니다. 곱할 수 있는 두 행렬 A,B가 주어질 때, 행렬을 곱한 값을 출력하는 productMatrix 함수를 완성해 보세요.

풀이

A행렬의 0,0과 B행렬의 0,0을 곱하여 answer의 0,0에 넣는다.

  1. for문으로 A행렬의 i,j와 B행렬의 i,j를 하나씩 곱한 값을 변수 a에 대입
  2. 여기서 풀이가 진행이 되질 않는다.. 일단 정해진 시간이 다 되어가므로 문제풀이를 올리고 계속 풀어봐야겠다.
public class ProductMatrix {
	public int[][] productMatrix(int[][] A, int[][] B) {
		int[][] answer = null;
		
		for(int i=0; i<A.length; i++) {
			for(int j=0; j<A[i].length;j++) {
				int a = A[i][j] * B[i][j];	
			}
		}		
		return answer;
	}

	public static void main(String[] args) {
		ProductMatrix c = new ProductMatrix();
		int[][] a = { { 1, 2 }, { 2, 3 } };
		int[][] b = { { 3, 4 }, { 5, 6 } };
      // 아래는 테스트로 출력해 보기 위한 코드입니다.
      System.out.println("행렬의 곱셈 : " + c.productMatrix(a, b));
	}
}

클린코드 밋업 복습 (1) - 코드 리팩토링

|

삼성SDS에서 주최한 클린코드를 위한 TDD 기반의 리팩토링 워크샵 복습

  • Eclipse에 Eclemma를 설치 후 사용함
  • 아래 소스에서 Java 폴더가 사용한 예제
  • https://github.com/emilybache/GildedRose-Refactoring-Kata
  • 원하는 부분의 코드에 커서를 대고 ctrl+1 을 누르면 자동으로 리팩토링을 할 수 있음
  1. 숫자/문자는 상수로 바꿈
  2. 지역 변수를 전역 변수로 바꿈..?(불확실함, 다시 확인 후 수정 필요)
  3. !if -> if 긍정문으로 바꿈
  4. or 조건문은 분리함
  5. Dead Code 삭제
  6. 동일한 조건 삭제
  7. else+if -> else if
  8. 중복되는 조건문은 밖으로 빼서 상위에서 비교

[알고리즘] 프로그래머스 Level2. 최솟값만들기(풀이중)

|

문제

자연수로 이루어진 길이가 같은 수열 A,B가 있습니다. 최솟값 만들기는 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱한 값을 누적하여 더합니다. 이러한 과정을 수열의 길이만큼 반복하여 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. 예를 들어 A = [1, 2] , B = [3, 4] 라면 A에서 1, B에서 4를 뽑아 곱하여 더합니다. A에서 2, B에서 3을 뽑아 곱하여 더합니다. 수열의 길이만큼 반복하여 최솟값 10을 얻을 수 있으며, 이 10이 최솟값이 됩니다. 수열 A,B가 주어질 때, 최솟값을 반환해주는 getMinSum 함수를 완성하세요.

<나의 접근="" 방법=""> - 두 개의 수열에서 각각 1개의 숫자를 뽑음 => 두 개의 변수 - 두 수를 곱한 값의 최종 누적 값이 최소가 되어야 함 => 수열 A는 가장 작은 숫자부터, 수열 B는 가장 큰 숫자부터 매칭되어 곱해져야 함 <문제점(풀이 진행중)> - 수열 B를 내림차순으로 정렬하기 위해 자바 컬렉션의 내림차순 정렬 라이브러리를 사용하였다(가장 먼저 생각나는 방법이어서 이것으로 시도해 보았다) - list로 변환한 array를 다시 array로 변환하려고 하니 에러가 발생하였다. 구글링한 글에서는 모두 가능했는데 내가 하니 에러가 난다. - 일단 시작한 방법으로 끝까지 풀어본 뒤, 라이브러리를 최대한 사용하지 않는 방향으로 풀어보아야겠다.

package Level2;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class GetMinSum {
	public int getMinSum(int[] A, int[] B) {
		int answer = 0;
		int len = A.length;

		int num1[] = new int[len];
		int num2[] = new int[len];

		Arrays.sort(A);

		List<int[]> bList = Arrays.asList(B);
		Collections.reverse(bList);
        
        //여기서 막혔다
		//B = bList.toArray(new int[bList.size()]);

		for (int a = 0; a < len; a++) {
			num1[a] = A[a];
		}
		for (int b = 0; b < len; b++) {
			num2[b] = B[b];
		}

		return answer;
	}

	public static void main(String[] args) {
		GetMinSum test = new GetMinSum();
		int[] A = { 1, 2 };
		int[] B = { 3, 4 };
		System.out.println(test.getMinSum(A, B));

	}
}