[JAVA] 코딩 테스트 : 로또의 최고 순위와 최저 순위

준우·2021년 11월 19일
0

코딩 테스트

목록 보기
1/3
post-thumbnail

로또의 최고 순위와 최저 순위

프로그래머스 에서 Level 1 의 로또의 최고 순위와 최저 순위 코딩 테스트를 풀어보았다.

문제 시나리오

작성 코드

import java.util.*;
class Solution {
    public int[] solution(int[] lottos, int[] win_nums) { 
        
        int[] answer = new int[2];
        
        String strLottos[]  = new String[6];
        String strWinNums[] = new String[6];
        
        for (int i=0; i<lottos.length; i++){
             strLottos[i] = Integer.toString(lottos[i]);
            strWinNums[i] = Integer.toString(win_nums[i]);
        }
        
        int notZero = 0;
        int zeroCnt = 0;
        
        for(int i=0;i<lottos.length; i++){
           if(Arrays.asList(strWinNums).contains(strLottos[i])){
                notZero += 1;
            } else if (strLottos[i].equals("0")) {
                zeroCnt += 1;              
            } 
        }
        
        answer[0] = getResult(notZero + zeroCnt);
        answer[1] = getResult(notZero);
        
        return answer; 
        
    }
    
        public int getResult(int num){
            switch(num){
                case 0 : case 1: return 6;
                case 2 : return  5;
                case 3 : return  4;
                case 4 : return  3;
                case 5 : return  2;
                case 6 : return  1;
                default: return  0;
            }
        }
}

실행 결과

느낀 점

프로그래머스에 처음 제출한 코드는 스위치문도 두번 쓰고, 변수 이름도 엉망으로 지었다. 프로그래머스 처음이라 몰랐는데, 내가 제출한 코드는 내 이름으로 올라가고 모두가 볼 수 있더라. 그래서 최대한 깔끔하게 다시 작성하고자 중복 됐던 스위치문을 메서드로 만들었고 변수명도 가독성있게 수정했다.

그리고 제출했는데 이전에 더럽던 코드보다 점수가 낮아서 내 새 답변이 반영되지 않았다... 😢 보기에는 좋지 않았지만 아무래도 메서드를 추가하고 배열값에 직접 넣은 것 때문에 속도가 이전 보다 느려졌거나 메모리를 더 할당했나보다. 그래도 나는 이 코드가 훨씬 마음에 든다. 다른 사람이 봤을 때 조금이라도 더 읽기 편한 코드를 짜고 싶다.

그리고 다른 사람들이 작성한 코드도 봤는데 어떤 사람은 다섯줄 정도를 써서 해결한 것을 보고 육성으로 감탄을 내뱉었다. 그런데 실행시켜보니 속도가 많이 느려서 코드가 짧은 것이 절대적으로 좋은 것은 아니구나 깨달았다.

외에도 정말 멋있는 코드가 많았는데 내가 아직 모르는 HashMap, HashSet, 람다함수를 활용한 경우가 대부분이었다. 요즘 인프런에서 호눅스님의 java 강의 만들어 가면서 배우는 JAVA 플레이그라운드
를 듣고 있는데, 이론 먼저 공부하고 프로그래밍을 하기보다도 프로그래밍을 하면서 이론을 공부하는 게 좋다는 말씀에 의심의 여지 없이 동의하며 실천하고 있지만서도 일단 무엇이 있는지는 알아둬야 찾을 수도 있겠다는 당연하면서도 몰랐던 사실을 깨닫고 일단 자바 기본서는 1회 이상 정독하는 것이 기본 소양이겠구나 느꼈다.

오늘은 휴가날이었는데 해가 지는 줄도 모르고 책상에 반나절을 앉아서 노트북만 붙잡고 있었다. 나를 이렇게 몰입하게 만드는 게 있다니! 🤭 프로그래밍 공부는 싫은데 코딩테스트는 너무 너무 재미있다.

아쉬운 점

int형 배열에서 인덱스를 찾고자 구글링을 해서 IntStream().anyMatch() 라는 것을 새로 알게 되었다. 그래서 열심히 적용해보았으나 IntStream을 사용하는 과정에서 만난 오류들을 해결하지 못했다. 결국 내가 원래 알고 있던 방법대로 String 배열을 선언하고, 형변환하느라 for문을 쓰며 코드 줄을 늘린 게 많이 아쉽다. for문도 향상된 for문을 쓰도록 노력해야겠다.

마냥 코드 줄을 줄이고 싶은게 아니라, 내 부족함 때문에 비효율적으로 코드를 낭비하게 된 것 같아 아쉬움이 남는다. 그래도 내가 뭘 모르는지 알게 돼서 좋은 경험이었다.

다음에는 완성을 목적으로 두지 말고 시간이 더 걸리더라도 더 좋은 방법은 또 뭐가 있을지 고민하고 찾아보고 공부하는 것을 목표로 할 것이다.

배운 점

  • JAVA는 ArrayList 자료구조에서만 indexOf() 사용이 가능하다.
  • 배열에서 indexOf를 사용하려면 asList()를 사용해야 한다.
  • 나는 Set 인터페이스, Map 인터페이스, 람다 함수, Stream API를 사용할 줄 모른다!
  • 처음에는 문제가 너무 어렵게 느껴졌는데 막상 시작하니 조금씩 답이 보였다.
    문제를 잘게 쪼개서 쉽게 생각하는 것이 좋은 것 같다.

0개의 댓글