Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Are Similar?
비슷한가요?
??????... 일단 문제를 보자.
난이도가 m사이즈~
일단 문제에서 주어진 두개의 배열이 있다.
이 두개의 배열 요소들을 봤을때, 서로 비슷하게 만들어주는 것이다.
만약, 다르다면 한 배열에서 한쌍의 요소(2개)를 다른 배열에 넣어주면 similar 해지는지 확인해준다.
답안을 볼까요?
일단 컨셉은 두 배열을 봤을때, 인덱스와 요소의 값이 서로 다른 것을 걸러내고, 그리고 그 다른 점들 인덱스들이 바꿨을때, 둘은 같은 배열이 되는지 확인해주면 된다.
여기서 적용되는 개념은 Set 과 add containAll 이다. 이 내용에 대해 자세히 다룬 링크를 공유하겠습니다. ^^
https://www.opentutorials.org/course/1223/6446
먼저 두 배열의 차이점을 잡아줄 변수를 선언해줍니다. 여기서는 differ가 되겠지요.
그리고, Set을 활용하여 두 배열의 차이점을 담아줄 공간을 선언해줍니다.
Set s1 = new HashSet(); 이 되겠지요.
여기서 왜 set 을 쓰느냐.. set은 간단히 보면 집합이라고 보면됩니다. List와 비슷하다고 느낄수 있지만, 맞습니다.
그러나 약간의 차이가 존재합니다. set 은 중복이 안되고 list는 중복이 가능합니다. 즉 저 링크에 자세히 나와있지만..
Set는 중복을 허용하지 않고 순서가 없지만, List는 중복을 허용하고 저장되는 순서가 유지된다는 것을 알 수 있다.
그렇다면 뭣하러 Set을 쓰느냐.. 제가 생각을 했을때, 문제의 조건 때문입니다.
if문을 보면 아시겠지만, a배열의 인덱스 순서대로 그리고 b배열의 인덱스 순서대로 서로 비교를 합니다.
이때, 서로 같은 인덱스일때, 요소의 값이 다르다면, 그거에 대해 차이가 발생했다고 느끼고 그 값들을
넣어줄 공간이 필요합니다.
그러나 만약 1,2,2 배열과 2,1,1 배열이 있다고 생각해보면, 이 두배열은 인덱스 순대로 봤을때, 완전히 다른 배열이라고 인식하게 됩니다. 그러나 배열들 안에 요소들 값은 똑같다고 봐도 무방하죠 (즉, 순서때문에 다른 것이지 완전 다른 것이라고 보기 어렵다는 것입니다. )
자 다시 정리하면 우리눈에는 똑같은 배열로 보이지만, 컴퓨터는 다른 배열로 인식하게 되어있다는 것입니다.
이 차이를 극복해주는 방법이 바로 Set인것입니다.
가장 큰 이유는 set 의 장점인 집합연산이 가능하기 때문입니다. 아까 말했듯이 set은 순서가 없고 단지 중복을 불허 합니다.
즉, 어느 저장 공간에 순서 없이 각자 고유의 값들이 널부러져 있는 집합의 느낌을 줍니다.
아래와 같은 느낌인데, 우리가 수학시간에 배운 집합 연산이 가능한 것입니다.
for(int i =0; i < a.length; i++){ if(a[i] != b[i]){ differ ++; s1.add(a[i]); s2.add(b[i]); } } |
즉 set 을 해둔상태로, 이렇게 해두면 각자 알아서 다른 부분을 s1 과 s2에 담습니다.
단, 중복이 안되는 상태로요!
이렇게 되면 딱 다른 값들만 담아줍니다.
그리고 여기에 그 set의 요소들의 갯수와 differ의 값들이 다른지만 확인해주고 조건을 걸어주면
되는 것입니다.
잘 이해가 안됩니다.. ? 그쵸 그러면 test를 통해서 좀더 확인을 해볼께요.
//test
System.out.println("differ= "+ differ);
System.out.println("s1= "+ s1);
System.out.println("s2= "+ s2);
이 부분을 추가해주세요.
이렇게 해두고, 테스트를 돌려보면,
이렇게 테스트가 돌아갑니다.
차이점의 갯수와 차이가 생기는 요소들이 한눈에 보입니다.
이렇게 되었다면, 이제 조건을 걸어서 반환값을 설정해주면 됩니다.
if(differ == 0) return true; |
처음 조건은 differ의 정도가 0이라면 두 배열은 완전히 같은 거겠죠? 바로true 반환.
두번째는, differ가 2개 ! 즉 한쌍이 나왔습니다. 그렇다면 그 다른 것이 서로 같은가 확인해주어야합니다.
왜냐하면 둘의 위치만 바꿔주면 되는 것인지, 알아보고 확인해줘야 둘은 비슷한 배열이 되는 것이죠.
그래서 equals()를 통해 둘이 완전히 같은지 봐줍니다. 만약 같다면 true를 반환.
나머지는 걍 False 를 반환.
볼것도 없습니다.
이렇게 완성.
그러나 다른 앨리트 분들의 답안을 보면 미치도록 간단하고 명료합니다. (내수듄)
저는 힘들게 찾아가면서 했지만.. 답안을 보면 생각보다 간단하게 푸는 경우가 많습니다.
대표적 두개의 답안을 보여드리겠습니다. 확인해보세요.. ㅠ
먼저 이 답안..
이 답안은 다행히도? 저랑 비슷하네요!
단, 이분은 그냥 배열로 때리심.. set 안쓰셔도 될듯.
이 코드는 더 단순합니다. 이해만 되면요.
이 코드를 쓰신분은 저보다 더 나아가서 깊은 이해를 표현해주시는 군요.
이 코드의 의미는 제가 구해둔 그 차이나는 값들의 집합set 과는 비슷합니다. 하지만 set까지 선언을 해주지도 않고
더 간단하게 그 차이들이 발생하고 그 차이들의 요소들이 생겼을 때, 그 차이 요소들의 곱이 같으면 되는 것입니다.
자 너무 확대되긴 했지만,,? 이걸 보면 1*2 는 2 이고, 위아래 둘다 . 그리고 다른 테스트도 2*3도 6입니다. 위아래 같이요.
바로 이부분을 활용하는 것입니다.
그외에 경우는 differ의 수로 조건을 걸어버리고요
differ가 <=2 로 조건을 걸고 그 안에 들면 저렇게 비교를 하는 것입니다.
그리고 최종적으로 그 모든 조건이 성립하면 true 아니면 false를 반환하게 만드는 것입니다.
아주.... 똑똑한 쓰끼... 난 왜 몰랐지.. ㅋㅋ
이 분은 더 간단합니다.
그냥 다른거 없고 sort를 때려서 오름차순으로 배열을 나열해줍니다.
그래놓고 그 두 배열이 같은지 확인해주고 더 나아가 두 배열이 다른 인덱스로 구성되어 있을때, 차이를 sum에 담아서 차이를 확보해둔뒤, 그 차이가 3미만에 두 배열을 정리해놨을때, 같으면 True 다르면 false를 반환하게 해둔 것이죠.
제가 봤을때, 첫번째 두번째 답안보다 이 마지막 답안이 가장 가독성도 좋고.
인식도 빨라서 가장 좋은 코드로 뽑게 되네요. (좋아요 꾸욱...)
나도 이런 생각을 하는 사람이 되고 싶네요. ㅋㅋ
어렵게 생각하지말자. 진짱. ㅜㅜ
'Algorithm > Java' 카테고리의 다른 글
#17_Code Signal Arcade >> Array Change (0) | 2019.11.19 |
---|---|
#15_Code Signal Arcade >> Add Border (0) | 2019.11.16 |
#14_Code Signal Arcade >> Alternating Sums (0) | 2019.11.14 |