Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요! \
Extract Each Kth
각 K번째 것들을 빼내라?
읏흠.. 문제를 볼까요?
예시를 보면 이해가 됩니다. 주어진 배열이 있고, k의 값의 배수들 위치!에 해당되는 수들을 제거하라는 문제입니다.
답을 볼께요.
int[] extractEachKth(int[] inputArray, int k) {
//k배수 자리의 배열 요소를 제거하라.
int j = k-1; //배수를 표현해줄 int선언
int x = 1; //배수를 진행해줄 값
int y =0; //마지막 배열로 바꿀때, 배열크기가 되줄 값 선언
ArrayList<Integer> hey = new ArrayList<>(); // int형 선언과 동시에 list선언.
for(int a : inputArray){hey.add(a);} // list에 array값 넣기.
for(int i=0 ; i < hey.size(); i++){ //배수 자리 제거
if(i == j && i>0){
hey.remove(i);
x++;
j = (k-1)*x;
}else if(j == 0 ){
hey.clear();
}
}
int [] out = new int[hey.size()]; //list 를 array로 변환
for(int last : hey){
out[y++] = last;
}
return out;
}
약간 고수들 따라해볼라고 좀 간단하게 변수들을 선언해주고 들어갔습니다.
그리고, 값을 빼고 앞으로 땡겨주는 걸로는 list가 짱이죠? 그래서 선언.
int j = k-1; //배수를 표현해줄 int선언
int x = 1; //배수를 진행해줄 값
int y =0; //마지막 배열로 바꿀때, 배열크기가 되줄 값 선언
ArrayList<Integer> hey = new ArrayList<>();
이렇게 해준다음
반복문을 통해 일단 inputarray값을 hey라는 리스트 안에 넣어줄께요. 빠바박
그리고 또 반복문을 통해서 배수 위치의 수들을 제거.
for(int i=0 ; i < hey.size(); i++){ //배수 자리 제거
if(i == j && i>0){
hey.remove(i);
x++;
j = (k-1)*x;
}else if(j == 0 ){
hey.clear();
}
}
list의 사이즈로 설정해주고, if문을 통해서, j = k-1이니깐, i와 일치하는 경우 그 자릿수를 제거!! 왜 k-1인지는 대충 감이 오시죠? index값이 한자리씩 작으니깐 그렇죠 뭐
그렇게 편안하게 remove()를 통해서 제거제거~~ 그리고 j를 다시 설정해줄 필요가 있죠잉
왜냐하면 우리는 위치를 찾는 거니깐 j가 고정되면 안되니깐요. 그래서 k-1 에다가 그대로 x를 ++해준뒤 곱해주면 자연스럽게 그 배수들이 j로 선언이 됩니다. 그러면 끝.
혹여나, j = 0인 경우는 test2 를 보시면 이해됩니다.
바로 이런경우인데요.
예시와 같이 1인경우 j는 0이 되버림.
어차피 답없으니깐요. list를 깨끗히 비워줘야겠죠?
그럴때, clear()를 사용합니다.
자 이제 완료 되었죠. 뭔가 더 쉬운 방법이 있는듯 하지만, 전 노가다로 다시 array에다가 넣어주겠습니다.
배열 하나 선언해준뒤, 반복문을 통해 hey값을 쭈욱 넣어줍니다.
int [] out = new int[hey.size()]; //list 를 array로 변환
for(int last : hey){
out[y++] = last;
}
자 이렇게 return out하면 끝!
어떠세요 이해가 되시나요? 매우 직관적이라 이해되실거라 믿습니다. ㅎㅎ
엘리트분들의 ㅋ 더 좋은 방법을 알아볼까요?
JAVA
int[] extractEachKth(int[] inputArray, int k) {
return IntStream.range(0, inputArray.length).filter(i -> ((i + 1) % k) != 0).map(i -> inputArray[i]).toArray();
}
역시나 깔끔하구요~ filter를 통해서 걸러주고, map()을 통해 다시 inputarray에 넣어주는 건가보네요. 신기합니다.
Python3
def extractEachKth(inputArray, k):
del inputArray[k-1::k]
return inputArray
역시 파이썬. 위에 사용된 배열 방법에 대해 잘 설명된 곳을 찾았습니다. 참고하세요. (저도 마찬가지)
JS
function extractEachKth(inputArray, k) {
return inputArray.filter((x, i) => (i+1) % k)}
js 는 역시 자바랑 비슷하군요. 간결하네요.
공감 버튼 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
'Algorithm > Java' 카테고리의 다른 글
#35_Code Signal Arcade >> First Digit (0) | 2020.02.19 |
---|---|
#33_Code Signal Arcade >> Strings Rearrangement (0) | 2020.01.14 |
#32_Code Signal Arcade >> Absolute Values Sum Minimization (0) | 2020.01.12 |