기술/TIL(Today I Learned)

[TIL] 2018.11.06 Today I Learned

leatherjean 2018. 11. 5. 22:07

코딜리티 문제

알고리즘 연습차원에서 코딜리티에서 나온 Group별 시험 테스트 케이스 통과 확인을 통한 점수 계산 문제를.

성장 포인트

 public int solution(String[] T, String[] R) {
         Map<Integer, List<String>> table = new HashMap<>();
         int maxInteger = 0;
         int okGroupCount = 0;
 
         for (int i = 0; i < T.length; i++) {
             T[i] = T[i].replaceAll("[^0-9]", "");
             maxInteger = maxInteger > Integer.parseInt(T[i]) ? maxInteger : Integer.parseInt(T[i]);
 
             if (table.containsKey(Integer.parseInt(T[i]))) {
                 table.get(Integer.parseInt(T[i])).add(R[i]);
             } else {
                 table.put(Integer.parseInt(T[i]), new ArrayList<>());
                 table.get(Integer.parseInt(T[i])).add(R[i]);
             }
         }
 
         for (int i = 1; i <= maxInteger; i++) {
             boolean isOkay = true;
 
             for (String s : table.get(i)) {
                 if (!s.equals("OK")) {
                     isOkay = false;
                     break;
                 }
             }
 
             if(isOkay) {
                 okGroupCount++;
             }
         }
         return (okGroupCount * 100) / maxInteger;
     }
 
     @Test
     public void solutionTest() {
         String[] T = {"sds1","dsds2a", "sdfsd2b"};
         String[] R = {"OK", "OK", "NOT"};
         assertThat(solution(T,R), is(50));
     }
}
  • Map<Integer, List<String>> 맵을 사용하여 한 그룹에 여러 종류의 테스트 결과물을 넣을 수 있도록 하였다.

  • 이 문제에서 필요한 것은 각 그룹의 번호이고, 순차적이라고 하였으므로 map에 넣어서 나중에 for문으로 탐색하게 한다.

  • map으로 구현하면 key값의 최대를 알기 힘드니까 maxInteger를 두고 값을 넣을 때 마다 maxInt값을 기록한다.

  • 테스트를 통과하지 못한 것이 한개라도 있으면 무조건 0점이므로 OK인지만 확인해서 거르면 된다.




알고리즘 연습차원에서 코딜리티에서 나온 주사위 정육면체 문제를 풀어보았습니다.

성장 포인트

 public int solution(int[] A) {
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < A.length; i++) {
            int count = 0;
            for (int j = 0; j < A.length; j++) {
                if (i != j) {
                    for (int k = 1; k <= 6; k++) {
                        if (A[i] == k) {
                            if (A[j] == k) {
                                continue;
                            } else if (A[j] == 7-k) {
                                count = count + 2;
                            } else {
                                count++;
                            }
                        }
                    }
                }
            }
            min = min > count ? count : min;
        }
        return min;
    }

    @Test
    public void solutionTest() {
        int[] input = {1,2,3};
        assertThat(solution(input), is(2));
    }

    @Test
    public void solutionTest2() {
        int[] input = {1,1,6};
        assertThat(solution(input), is(2));
    }

    @Test
    public void solutionTest3() {
        int[] input = {1,6,2,3};
        assertThat(solution(input), is(3));
    }    
  • 주사위는 마주보는 면의 합이 7이고, 이 게임에서는 던져진 각 주사위들을 한 면씩 굴려서 모두 같은 면이 나오게 하는 최소값을 출력하는 문제다.

  • 각 주사위를 순위하면서 지금 현재 인덱스의 주사위로 나머지 주사위들의 숫자들이 맞춰지면 count가 얼마나 나올까로 접근했다. 그리고 그 count를 max와 비교하여 집어넣는 방식의 코딩을 했다.

  • 보통 문제를 풀다보면 함수만 써서 제출하는 형태의 요구사항이 있는데, IDE로 작업하다보면 Main을 만들어야 테스트가 가능해서 그동안 매우 비효율적인 작업을 했다. 하지만 같은 클래스에 @Test JUnit을 사용하여 테스트코드를 작성해서 하면 비효율적인 방식이 줄어들게 된다.

  • 문제의 요구사항을 잘 파악하자. 주사위 숫자의 합이 7일때를 이용하면 모든 경우를 For문으로 묶어낼 수 있다.