Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고,
추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Message From Binary Code
2진법 코드 메세지
문제는 간단합니다. 주어진 2진법의 문자열이 입력되고, 그것을 알파벳 문자열로 해석해달라는 것입니다.
힌트가 있습니다. The first 8 characters of the code ... 이것을 보아하니 8글자로 2진법 문자열을 자르면 되는 것 같다는 느낌이 들었습니다.
보니, 8글자가 한 문자를 뜻하고 있군요.
즉, 8글자 단위로 2진법 문자열을 잘라서 문자로 변환 시킨뒤, 리턴해주면 되는 문제입니다.
코드를 보겠습니다.
String messageFromBinaryCode(String code) {
StringBuilder sb = new StringBuilder();
Arrays.stream(code.split("(?<=\\G.{8})")).forEach(s -> sb.append((char)Integer.parseInt(s, 2)));
return sb.toString();
}
StringBuilder sb = new StringBuilder(); 를 선언해줍니다.
다음은 Stream 기법을 활용합니다.
Arrays.stream(code.split(정규식)).forEach(s -> sb.append((char)Integer.parseInt(s, 2)));
이 코드가 핵심이고, 저도 기억하기 위해 자세히 설명하겠습니다.
구분 | 설명 |
Arrays.stream() | 먼저, 스트림을 사용해야 하기 때문에 선언해줍니다. 스트림은 간편하게 코드를 줄이기 위한 수단이라고 보면됩니다. 이해가 되기 시작하면 이보다 편한 방법이 없습니다. |
code.split() | 입력된, Code를 split()함수를 통해 배열로 잘라줍니다. split은 사용하다 보면, 원하는 문자로 문자열을 잘라서 배열로 만들어 주는 함수 입니다. 물론, 이 안에는 정규식이 들어가면 그 정규식의 조건에 맞춰서 잘라줍니다. |
정규식
"(?<=\\G.{8})" |
정규식 입니다. 이 정규식의 의미는 \G가 핵심입니다. \G의 의미는 이전 매치의 끝을 나타냅니다. ?는 해당 문자열을 의미한다고 보면 됩니다. 즉 Code이겠죠. 이 입력값을 .{8} 8글자 씩 끊어 달라는 정규식이라고 보면 됩니다. |
forEach() | 이러한 배열의 각 요소를 한개씩 가져와서 ()안에 뭔가 행위를 넣어 작업을 하겠다는 의미입니다. |
s -> sb.... | sb는 StringBuilder입니다. Stringbuilder는 문자열을 손쉽게 주물럭 할 수 있는 객체입니다. 이것을 활용해서 .... 이하 생략된 부분의 작업을 할 것이고, 그 안에는 s라는 변수가 활용되어 진행이 될겁니다. 그 S의 값을 선언해주고 Sb안에 넣는다 생각하시면 됩니다. |
append() | append()함수는 당연히 Stringbuilder에 사용되는 함수로 ()안에 있는 작업의 결과물을 sb에 붙여준다는 의미입니다. |
Integer.parseInt() | integer.parseInt() 딱봐도 뭔가 숫자로 바꾸라는 의미겠죠. 중요한 것은 ()안에 코드 입니다. s, 2 라고 적혀 있습니다. 이 의미는 s는 아까 배열의 나눈 각 요소의 값이라고 가정한 것입니다. 그 요소를 2진법 수이면, 10진법 숫자의 형태로 변화하겟다는 옵션인 것이죠. 2 대신 8 이오면 8진법 다른 수가 오면 해당 수의 진법이 됩니다. |
- Integer.parseInt() 에 대한 설명 참고
정규식이 좀더 이해되기 위해서는 아래와 같은 코드를 추가해주세요.
이 코드를 sb 선언문 밑에 넣어주세요.
String messageFromBinaryCode(String code) {
StringBuilder sb = new StringBuilder();
System.out.println(Arrays.toString(code.split("(?<=\\G.{8})")));
Arrays.stream(code.split("(?<=\\G.{8})")).forEach(s -> sb.append((char)Integer.parseInt(s, 2)));
return sb.toString();
}
혹시 몰라서 이렇게 다 올려둘께요. 이거 복사해서 테스트 돌려보세요~
INPUT:
OUTPUT:
그렇게 하시면 콘솔에 이런식으로 출력이 나옵니다.
이해가 되시나요? 딱 8글자씩, 잘라서 배열로 만들어집니다.
마지막으로 sb.toString()을 해주면 완료입니다.
이제 엘리트 분들의 답안을 감상하자...
JAVA
String messageFromBinaryCode(String code) {
return new String(new BigInteger(code, 2).toByteArray());
}
한줄입니다. 하핳;; BigInteger 저런 것도 있나요.. toByteArray()라는 함수도 있군요.
신기했습니다.
좀더 공부를 해야겠군요.
역시 2진법 세상은 ;;;
Python3
def messageFromBinaryCode(code):
return "".join([chr(int(code[8*i:8*i+8],2)) for i in range(len(code)//8)])
파이썬은 list의 변형이 쉬워서, 간편하게 join을 통해 만들어내는 군요.
JS
function messageFromBinaryCode(code) {
return code.match(/.{8}/g).reduce((a,b)=>a+String.fromCharCode(parseInt(b,2)),"")
}
js도 마찬가지로 함수가 있다니.. match를 통해 뭔가 저랑 비슷하게 한거 같긴한데 reduce? 저런건 뭔지 저도 잘...
공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
'Algorithm > Java' 카테고리의 다른 글
#59_Code Signal Arcade >> Spiral Numbers (0) | 2020.07.20 |
---|---|
#57_Code Signal Arcade >> File Naming (0) | 2020.07.14 |
#56_Code Signal Arcade >> Digits Product (0) | 2020.07.12 |