Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
벌써 세번째 입니다.. smooth sailing 파트까지왔어요
할 문제는 많지만 그래도 이제 슬슬 스피드가 붙어나기시작... 이해도 좀더 빨라진듯한..
하지만 아직까지는 답지가 필수입니다. ㅜㅜ 비슷한 패턴임에도 역시 어렵군요
All Longest Strings
가장 긴 문자열을 뽑아주는 알고리즘 문제입니다.
문제에서는 주어진 문자열 배열에서 각 요소별로 보았을때, 가장 긴 문자열을 따로 뽑아서 배열로 만들어 리턴해주라는 겁니다. 일단 간단하죠 ...?
하지만 저는 코알못이기에 바로 답지 확인.. 생각을 해도 답이 안나옴
답지를 보니 아래와 같았습니다.
String[] allLongestStrings(String[] inputArray) {
// max lenght 을 나타내는 숫자형 객체 생성
int mL = 0 ;
// 배열 각 요소를 돌면서 가장 긴 요소가 무엇이고 그것의 길이가 몇인지 알아내는 반복문
for(int i =0; i < inputArray.length; i++){
if(mL<inputArray[i].length())
mL = inputArray[i].length();
}
//최종적으로 제일 긴 글자를 찾아내면 그 길이를 longest에 고정으로 박는다.
final int longest = mL;
System.out.println("mL ="+longest);
// 그리고, 기존 배열에서 가장 긴 아까 longest의 수에 해당하는 길이를 가진
// 요소를 찾아내서 그것들만 따로 다시 새로운!
// 배열로 생성해서 리턴한다.
return Stream.of(inputArray)
.filter(s -> s.length()==longest)
.toArray(String[]:: new);
}
코드를 보아하니 언제나 그랬듯이 모를만한 이유가 있었네요.. 코드를 보면 일단 For문으로 무언가 반복해주고,
특이하게 return부분이 극혐으로 적혀있는것이 보입니다..
천천히 보면서 나름 분석했느데, 여기서 사용된 개념이 Stream 이더군요.
그렇다면 stream? 왓더뻑 이게 뭘까? 바로 구글링을 했습니다.
그랬더니 여러개를 읽어본 결과 아래의 링크 블로거 님이 젤 이해되게 정리를 해두셔서 읽어보았습니다.
https://jeong-pro.tistory.com/165
자바 스트림(Stream) API 정리, 스트림을 이용한 가독성 좋은 코드 만들기(feat. 자바 람다, 함수형 프로그래밍, 자바8)
Java Stream 자바 공부를 하면서 Stream이 무엇인지, 어떻게 사용되고 있는지 인지는 하고 있었으나 실제 코드로 타이핑해보지 않았다. 그러던 중 이번에 가볍게 API 훑어보는 식으로 공부를 하면서 코드를 쳐보면..
jeong-pro.tistory.com
내용은 간단히 하면 배열을 따로 스트림 형태로 만들어서 그 안에 여러 조건을 갖다 붙여서 조건식을 푸는 형식입니다.
그렇지 않으면 for 문 if 문으로 반복 해서 풀어야 하기 때문에 매우 불필요한 코드가 생긴다고 팁까지 알려주었습니다. ㅎㅎ
한수 배우고 갑니다. 자세히 읽어보니 전 배열의 ㅂ자도 모르는 사람이었네요.
다시 코드를 보면
가장먼저 문자배열 안에 제일 긴 단어가 뭔지 찾아줘야하는 거였습니다.
mL 은 그 젤 긴 문자열이 무엇인지 length를 통해 구해내기 때문에 숫자를 담을 객체로 하나 만들어주는 겁니다.
그리고나서 For 문을 통해 쓰윽 inputArray를 하나하나 파헤쳐봅니다.
그렇게 파헤치다 보면 일단 각 배열안의 요소의 길이를 inputArray[ i ] .length() 를 통해 숫자로 만든뒤 그것을 mL과 비교하여 제일 큰놈이 뭔지 mL에 담아두게 만듭니다.
그리고나서 다 돌았으면 for문을 빠져 나옵니다.
따끈따끈한 mL을 들고 나왔으니, 바로 final로 굳혀 버립니다. (바뀌지말라고? 왜지)
아무튼 final 로 굳혀주고 그걸 또 longest로 이름 붙여줍니다.
불안한 맘에 system.out 은 제가 한번 해본겁니다. 없어도 됨. 암튼 저렇게 해보니 mL 이 젤 큰 숫자로 반환되어 있었습니다.
이제 마지막 부분, stream부분인데요.
저기 주석에 주저리 주저리 붙여 놓은 것처럼
stream은 특이합니다. Array.stream() 도 있고 Stream.of() 도 있고 뭐 다양합니다.
아무튼 대충 stream 의 형태로 배열을 바꿔줘야하니 Stream.of(배열)을 해서 스트림형으로 바꿔줍니다.
그리고 바로 . 을 붙여서 그대로 옵션들을 막 갖다붙여주는 겁니다. !!이게 졸라 좋은거라합니다. (잘 모르겠지만 아무튼 한줄로 나오니깐 편하다고 보는듯함. )
단골 손님이 바로 filter입니다. filter는 말그대로 필터.. 걸러주는 겁니다.
스트림으로 된 배열에 s 라는 필터를 껴서 s.length() ,, s의 길이를 == longest라고 붙여서 필터를 돌린다~~이말입니다.
즉 아까 배열에 제일 긴 문자열의 길이를 필터의 기준으로 s길이로 딱 박아버린다음 그 필터 쪽으로 stream된 inputArray를 갈아버리는 겁니다. 그러면 쭈욱 걸러지겠죠? 그러면 끝이냐,? 그게 아니였습니다.
언제나 그랬듯 젤 형변환 이 중요합니다. ( 모든 에러의 근본 원인이죠 이거 뺴먹으녀 ㅈ 됩니다.)
. toArray(String[ ] :: new) 이렇게 붙여서 새로운 배열로 반환되게 만듭니다. 즉 새로운 제품이 나왔느데 그냥 나가면 안되니 라벨을 붙여서 내보느내는 듯한 느낌입니다.
그러면 자연스럽게 정답이 됩니다.
또 나 자신에게 이해가 되기 쉽게 하려고 그림을 남깁니다.
아무튼 이래 저래 필터를 통해 깔꿈하게 나오게하는 것 같았습니다.
후 오늘도 하나 풀었다.
답지는 아래의 링크에 있습니다. 언제나 ^^
greenhelix/CodeFights-Arcade
Efficient Solutions to 100+ problems in CodeFights Arcade written in c++, python, java , c#, JavaScript - greenhelix/CodeFights-Arcade
github.com
'Algorithm > Java' 카테고리의 다른 글
#10_Code Signal Arcade >> Common Character Count (0) | 2019.10.14 |
---|---|
#08_Code Signal Arcade >> Matrix Elements Sum (0) | 2019.10.03 |
#07_Code Signal Arcade >> Almost Increasing Sequence (2) | 2019.10.02 |