Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Almost Increasing Sequence
거~~의 증가하는 시퀀스! 를 만들어라! 이런느낌이다.
주어진 조건을 성립하면 증가하는 연속된 수가 되는 배열이 되면 True 그 반대면 False..
문제에서 보면,, detemine whether it is possible to obtain a strictly increasing sequence by removing no more than one element from the array. 라고 적혀있다.
연속된 수로 상승? 커지는 수 배열을 만드는데, 만약 그 요건이 제약된다면, 하나의 배열요소를 없애서 증가하는 시퀀스를 만들어보라는 것이다. 그게 되면 true를 반환하고 그렇지 않으면 False를 반환하라는 것이다.
저번에 풀었던 방식에서 배운것처럼 일단 배열을 sort시킨 후, 시작하는것인가..?
그런데 이번에는 그냥 입력된 배열에 제약되는 것을 한 개! 제거 했을 때 요건에 성립해야한다.
그럴려면 어떻게 코드를 만들어줘야 할까..
머리통이 나빠서 답지를 봐버렸다.. 내 수듄..
봐도 모르겠는건 무엇???
boolean almostIncreasingSequence(int[] sequence) {
int l = sequence.length;
int p = -1;
int c=0;
for (int i = 1; i < l; i++)
if (sequence[i-1]>=sequence[i]){
p=i;
c++;
}
if (c > 1) return false;
if (c == 0) return true;
if (p == l-1 || p == 1) return true;
if (sequence[p-1] < sequence[p+1]) return true;
if (sequence[p-2] < sequence[p]) return true;
return false;
}
일단 답지는 이렇게 나와있다. sort따위 있지도 않구요~~ (머쓱타드)
ㅋㅋ
가만히 보니, 기본적으로 배열요소 하나하나를 다음수와 비교를 해준다. 마지막까지는 안가고 총 n개라면 n-1까지가 i값이 되므로 마지막 수와 그전수까지 비교가 된다. 흐음.. 일단 이해됐고요... 후...힘들군(벌써?)
그다음은 p =i; c++; 이부분이다.. 뭥미.. 뭐야 이건 고민고민 보다가 알아낸 느낌!
밑에 if문이 여러개 있다.
For반복문은 어찌보면 배열 검사기라고 할수 있다. 즉, for 문에서 배열을 검사해주면 p, c 의 값이 달라진상태로
배출되거나 아무런 변화도 없으면 기본의 p 와 c 의 값으로 내려오고, 바로 if 문들이 실행된다.
자 그러면 어찌 저찌 배열 검사기 (for문) 가 진행되었다.
다음은 If문들 인데,
if (c > 1) return false; | n번째 요소가 n+1번째 요소보다 크다면 c가 +1된다. 그런데, 그것도 c >1이라 그런식으로 뒤에수가 앞에수보다 큰 경우 2번이나 반복되면 걍 false를 반환하는 것이다!! 이해되심? |
if (c == 0) return true; |
이거는 c가 그대로니깐.. 즉 for 문이 안돌아갔다는 것이겠죠? 예를들어 sequence = [ 1, 3] 이라면 당연히 뒤에수가 앞에수보다 작으니깐 for문 조건에 안들어가서 아무런 변화없이 그대로 C=0 이 반환되니깐.. true로 리턴 |
if (p == l-1 || p == 1) return true; | p는 원래 -1인데, p=1이려면 분명 for문에서 작용하여 p=i라는 것이 진행되었을 것이다. 즉, p =1 인경우는 i=1일때, for문에서 나왔다는 뜻! S[0] >= S[1] 라는 것이 성립해버려서! 나온거니 시작부터 뒤에수가 앞에수보다 커버린 어처구니 없는 상황이 되버린당. |
if (s[p-1] < s[p+1]) return true; | 이거슨.. 뭔가 했는데, 이것을 제외시키고 돌리면 16번 테스트가 오류가 난다. [1,2,3,4,3,6] 의 배열인데, if조건에 해당하는 것이 하나도 없어서 바로 False가 나버린다. 이 배열에서 6뒤에 3이 빠진다면 조건은 성립한다. 즉, 이조건은 4와 3 수가 작아지는 부분에서 해당되는 부분의 뒤에수가 없어지면 성립된다는 조건이다. |
if (s[p-2] < s[p]) return true; | 반대로, [1,2,3,4,99,5,6] 이라고 가정하면, 99와 5가 수가 뒤에수가 앞에수보다 큰 경우인데 이경우에는 뒤에 해당하는 5보다 99가 없어져야만 성립된다. 이 조건은 그러한 경우 앞에수를 제거 해주면 성립된다는 것을 입증해주는 조건이다. |
return false; |
이제 슬슬 코드 한줄 한줄 다시 테스트 해가면서 무슨 의미인지 알아가는 것같다.
더 어려워지고 있는데 아직까지도 easy수듄이라닝 슬프군..
다른 유저의 해답도 퍼왔는뎅 참고만 하시길
공유하는 이유는 다양한 코드의 해결과 간결성을 보여주고자 함이다. 그런데,
인상깊은점은 피차일반 이해가 바로 되지는 않는다. 정확한 알고리즘의 원리를 이해해야 맹목적으로 같은 목표로
끌고 가는 코드를 파악할 수 있는거 같다.
즉, 본인이 생각을 하고 연습해보고 테스트 해보지 않는다면 아무리 간결한 코드라도 이해하기 어렵다는 것을 이
알고리즘을 통해 알게 되었다. ㅎㅎ
boolean almostIncreasingSequence(int[] sequence) {
boolean flag=true;
int seq1=0;
int seq2=0;
for(int i=0;i<sequence.length-1;i++){
if(sequence[i]>=sequence[i+1]) seq1++;
}
for(int k=0;k<sequence.length-2;k++){
if(sequence[k]>=sequence[k+2]) seq2++;
}
if(seq1+seq2>2) flag=false;
return flag;
}
이 코드는 ulises_c1의 코드이다. 참고하시길..
언제나 그랬듯이 정답은 이 링크에
https://github.com/greenhelix/CodeFights-Arcade/blob/master/Intro/Edge%20of%20the%20Ocean/almostIncreasingSequence/code.java
'Algorithm > Java' 카테고리의 다른 글
#08_Code Signal Arcade >> Matrix Elements Sum (0) | 2019.10.03 |
---|---|
#06_Code Signal Arcade >> Make Array Consecutive 2 (0) | 2019.09.29 |
#05_Code Signal Arcade >> Shape Area (0) | 2019.09.29 |