-
프로그래머스 스킬체크 레벨1 풀어보기Algorithm 2022. 4. 10. 23:36
알고리즘 문제를 틈틈히 풀다가, 프로그래머스 사이트에 이런게 있어서 도전해봤다.
물론 나는 입문 1주일차 조렙중의 조렙이기 때문에 당연히 레벨1로ㅎㅎ..
두 문제를 40분 안에 푸는 건데 시간 제한은 넉넉했다.
1. 배열에서 연속된 값 제거하기
정수 배열이 주어지고, 연속된 숫자가 있으면 제거하라는 문제였다.
처음엔 그냥 중복제거하란거네~~ set쓰면 되겠네 하고 풀었다가 빨간줄의 쓴맛을 맛보았다...
다시보니까 연속된 숫자만 제거하란 뜻이었고 연속되지만 않으면 중복이 되든 상관하지 않는단 뜻이었다.
import java.util.ArrayList; public class Solution { public int[] solution(int []arr) { ArrayList<Integer> list = new ArrayList<>(); list.add(arr[0]); for(int i=0; i<arr.length - 1; i++) { if(arr[i] != arr[i+1]) { list.add(arr[i+1]); } // if } // for int[] answer = new int[list.size()]; for(int i=0; i<answer.length; i++) { answer[i] = list.get(i); } // for return answer; } // solution } // end class
Arraylist를 사용해서 배열의 바로 다음 요소와 비교해 다를 때만 list에 add해 주는 방식으로 풀었다.
왜 Arraylist를 사용했냐 하면.. 기본타입 배열은 크기를 미리 정해줘야하는데 이 문제는 크기를 예상할 수 없어서였다.
그냥 생각난게 이 방법뿐이었다...
반복문을 돌리기 이전에 가장 첫번째 값은 필수로 있어야하니 0번째 인덱스 값을 추가해주고,
메소드의 return타입이 기본타입배열로 고정이라 Arraylist에 있던 값을 꺼내 다시 answer에 넣어줬다.
뭔가 너무 이상하게 푼 것 같지만 딱히 더 생각나는 것도 없다ㅋㅋㅎㅎ!
2. a 와 b 사이의 수 모두 더하기
정수 a, b가 주어지면 그 사이의 정수를 모두 더한값을 출력하는 문제.
1번에서 오... 했는데 2번은 너무 쉬워서 오... 했다.
약간의 함정이 있다면 a가 b보다 클 때도 있다는 것.
class Solution { public long solution(int a, int b) { long answer = 0; if(a > b) { a = a + b; b = a - b; a = a - b; } // if for(int i = a; i<= b; i++) { answer += i; } // for return answer; } // solution } // end class
a가 b보다 큰 경우 a랑 b 값을 바꿔준 다음 합을 구했다.
시간제한을 두고 문제를 푼 적은 처음인데, 여기서 느낀 점이 꽤 많다.
하나는 화면 밑에서 흐르는 시간이 생각보다 매우 거슬린다는 것.
오늘은 레벨1이었지만 훗날 코딩테스트를 보게될 경우,
어려운 문제 앞에서 가차없이 흐르는 시간이 주는 압박감은 굉장할 것 같다...
나중에 알고리즘에 익숙해지면 시간을 정해놓고 푸는 연습을 해야겠다.
두번째는 생각에 제약이 걸린다는 것.
보통 한 문제를 가지고 더 나은 방법이 있다면 수정하거나, 완전히 새로 작성하기도 했었는데,
시간제한이 있다보니 내가 처음에 선택한 방법대로 문제를 풀게된다.
이런 환경에서 효율적으로 문제를 푸는 건 오로지 연습밖에 없다는 생각이 들었다.
레벨 3를 풀 수 있는 날이 오기를...👊
'Algorithm' 카테고리의 다른 글
[백준] 8979 올림픽 - 자바(Java) (1) 2022.08.03 프로그래머스 스킬체크 레벨2 (0) 2022.05.08