Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Even Digits Only
짝수 숫자 만 오게 하자.
문제를 보면, 주어진 숫자의 모든 자릿수 하나하나 검사해서 모두 짝수 인지 확인해주는 알고리즘이다.
짝수의 조건 ; 2의 배수여야 하며, 0도 짝수라고 칩니다.
입력값의 자릿 수마다 다 짝수인지 확인해주는 과정이 필요합니다.
전체값을 반복문을 통해서 한 자리값마다 값이 나오게 합니다. 그리고, 그 값들이 짝수인지 확인해주면 됩니다.
중간에 홀수가 나와버리면 바로 false로 리턴합니다.
답안을 볼까요?
boolean evenDigitsOnly(int n) {
int length2 = (int)(Math.log10(n)+1);
boolean result = true;
int next = 0;
for(int i =1 ; i<= length2; i++) {
next = n%10;
n /= 10;
if(next % 2 == 0 ){
continue;
}else if(next % 2 != 0){
return result = false;
}
}
return result;
}
먼저, 입력값이 배열이 아니라, 숫자형입니다.
이것의 길이를 구해줘야하는데요. 그 방법은 아래와 같습니다.
int length2 = (int)(Math.log10(n)+1);
//test
System.out.println("n의 길이 = "+ length2);
Math.log10(n) 이 보이시나요?
먼저 log 계산을 하여, 각 자리수의 갯수를 구해주고, 거기에 +1 을 해줍니다. 그렇게 되면 자연스럽게 숫자형의 길이가 출력됩니다. 단, 여기서 int로 형변환 을 잊으시면 안됩니다.
다음은 리턴값과 각 자리를 비교해줄 변수를 선언해줍니다.
boolean result = true;
int next = 0;
이제 준비는 끝났습니다.
밙복문을 통해서 한자리 한자리 찾아가며 짝수인지 확인을 해줍니다. 아래와 같이요.
for(int i =1 ; i<= length2; i++) {
next = n%10; //입력값의 끝에 한자리 값
n /= 10; //입력값의 끝에 한자리를 뺀 값
if(next % 2 == 0 ){
continue;
}else if(next % 2 != 0){
return result = false;
}
}
어떻게 배열도 아닌데, 한자리씩 검사를 하는가?
바로 간단한 % 계산을 통해서 구합니다. 아시다시피 %는 나머지를 구하는 연산자입니다.
이 수를 반복적이게 진행하면, 항상 나머지 값은 1의 자리수가 나오게 됩니다.
그리고나서, 다시 입력값을 / 연산자로 10을 나눠버리면, 아까 나온 1의자리는 사라지고 10의 자리가
1의 자리로 이동합니다. (배열보다 효율적이다...뭔가? )
간단하게 % 와 / 의 연산으로 숫자의 1의 자릿수를 출력하게 되면, 반복문을 통해서 각 자리의 값들의 검사를 진행하면됩니다.
if 조건문을 통해서 아까 말한 짝수의 조건대로 검사를 하는 것이죠. 당연히 리턴값은 t / f 로 해주구요.
2로 나눠지거나 0이면 짝수이니깐,
next % 2 == 0 의 조건으로 실행합니다. 그외에 값들은 false로 진행하고요.
이상입니다.
이제 다른 답안을 확인해 볼께요.
JAVA
boolean evenDigitsOnly(int n) {
return Integer.toString(n).matches("(0|2|4|6|8)*");
}
어처구니가 없었습니다.
한줄이라니!!!
이분은 정규식을 통해서 값들을 비교해주었습니다.
Integer 로 형변환을 해주고,
toString(n) 스트링으로 받아서,
mathces( ) 을 통해서, 정규식의 조건과 합치되는 것만 리턴해줍니다. matches 는 참고로 맞으면 t 다르면, f를 리턴합니다.
정규식의 조건은 "(0|2|4|6|8)*" 이었습니다.
이말은 들어오는 숫자에서 0,2,4,6,8 의 값이 아무거나 겹쳐도 상관없고 있다면, true로 리턴합니다.
*의 의미는 없거나 여러개일수 있다는 의미입니다.
비슷하지만, 이렇게 해도 되구나 했던 코드도 올리겟습니다.
boolean evenDigitsOnly(int n) {
if (n == 0) {
return true;
}
if (n % 2 != 0) {
return false;
}
return evenDigitsOnly(n / 10);
}
JS
function evenDigitsOnly(n) {
return !(n+'').match(/[13579]/)
}
자바스크립트는 비슷합니다.
Python3
def evenDigitsOnly(n):
return all([int(i)%2==0 for i in str(n)])
파이썬도 간단하네요. 반복문을 통해서 각 자릿수를 검사해준것으로 보입니다.
'Algorithm > Java' 카테고리의 다른 글
#27_Code Signal Arcade >> Variable Name (0) | 2019.12.02 |
---|---|
#25_Code Signal Arcade >> Array Replace (0) | 2019.11.28 |
#24_Code Signal Arcade >> Mine Sweeper (0) | 2019.11.27 |