Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
한동안 업로드가 늦어졌지만, 문제를 푸는속도가 느린거같아서 진도를 먼저 나가고 풀이를 쓰는식으로 하려구요.
아래를 보시면 알겠지만 다 풀었습니다.. 너무 극혐이였음..
아무튼 들어가 볼까요? (지옥으로)
Is Lucky
운좋아...
뭔 그지같은 문제인지 모르겠지만, 이 문제는 답지를 참고했음에도 답안이 이해가 안가서 참고만하고
저만의 코드를 만들었습니다. ... 너무 슬픔 힘들..
일단 문제를 읽어볼까요.
짧아서 만만히 봤지요.. 껄껄 그렇지만 문제를 읽엇는데 이해가 안가더군요.
티켓번호가 있는데 보통 짝수 홀수 번호들의 조합으로 되어있지요. (당연한거아냐..?)
그런데, 그게 운이 좋은 뭐시기가 있다는데, 자릿수가 딱 반반으로 나눠 졌을때,
반의 합 또 다른 반의 합이 같으면 운이 좋답니다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
뭐 아무튼 그렇다... 일단 답안을 먼저 볼까요?
boolean isLucky(int n) {
int c = 0;
int t = 0;
int m = n;
int a = 0, b = 0;
while(n != 0){
c++;
t+=n%10;
n/=10;
}
if(t % 2 != 0) return false;
for(int i = 0; i < c/2;i++){
a += m%10;
m/=10;
}
for(int i = 0; i < c/2;i++){
b += m%10;
m/=10;
}
return b == a? true: false;
}
와.............................
지금에서야 대충이해가 되지만, 처음에 문제도 잘 이해가 안갔을 당시에는 진짜 답없었습니다.
일단 제 코드보다는 훨씬 간단합니다!
보기에는 말이죠, 그치만 잘 이해가 안간다는 단점이 있는거 같아요. 뭔가 변수를 선언해주는 과정에서부터
복잡. 이 변수가 어떠한 역할을 하는지 하나도 1도 모르겠더군요.
그래도 눈이 빠져라 쳐다 봤습니다.
if(t % 2 != 0) return false; |
힌트는 이부분이었던 것(?) 같습니다.
2로 나눈 나머지가 0이 아니라면 False를 리턴시켜버려라?
여기서 문제의 반반 극혐 운 치기의 기억이 떠오르면서 힌트를 얻었습니다.
' 아 반반으로 숫자들을 쪼개지는지 먼저 확인해서 걸러야겠네' 이렇게 말이죠.
일단 그부분부터 생각하면서 뻗어나가다 보니 일단 들어오는 input 숫자 값을 배열로 만들어줘야 겠다고 생각했습니다.
물론, 답안에서는 그렇게 안했지만,
while(n != 0){
|
이 부분을 보면 input값에 10으로 나눈 나머값을 t에 쌓아가면서 while문으로 계속 돌려줍니다.
그러면 결국 input값의 숫자들을 하나씩 다 더하는 꼴이 되어 t값이 나오게 됩니다. 그것을 활용해서 2로 안나눠지면
False를 반환하게 해놨습니다. (수학을 좋아하긴 하지만 이러한 것도 어렵네요 저한텐)
이렇게 저렇게 생각해보니 점점 감을 찾아서 코드를 적어 봤습니다.
input 된 n 을 string 형으로 변환 시켜줍니다.
그리고 나서 다시 그 string 의 길이만큼 int [] test로 비어있는 배열의 크기로 만들어줍니다.
For 반복문을 통해서, string인 input값을 charAt()메서드를 활용하여 넣어줍니다. 그리고 출력으로 테스트!
(테스트 시에는 return true; 를 설정해둬야 output 됩니다. )
이렇게 하면 주석에서 볼 수 있듯이 입력값들이 배열의 상태로 들어가게 됩니다.
다음은, 반반 합을 넣어줄 sum1, sum2 를 선언해줍니다.
그리고 if 문으로 조건들을 넣어주는데요.
저는 if 조건문에 입렵값의 길이가 짝수라면 for문으로 들어가게 해주었습니다.
만약 그렇지 않고 홀수 자리라면, 바로 false를 반환해주는 겁니다.
for문을 보면, 첫번째 for 와 두번째 for 의 차이가 보일 겁니다.
첫번째 for문은 조건이 input의 길이를 반으로 나눠서 sum1 에 차곡 차곡 쌓았습니다.
두번째 for 문은 조건의 시작점이 다릅니다. 앞의 For에서 반으로 이미 나눠 더했으니
나머지 반의 시작점을 반에서부터 끝까지의 합을 sum2에 쌓으라고 하는 겁니다.
그리고 나서 마지막에 return에다가 sum1 과 sum2 가 같은지를 확인해주면 됩니다!!
return b == a? true: false; |
원래 답안의 마지막 부분에서 힌트를 또 얻은 것인데요.
문제에서도 반반 해서 같은지 물었으니, b ==a ? 가 그것을 의미하는 것이라고 생각했습니다.
아무래도 맞았나 싶네요.. 아무튼 이렇게 해서 풀이를 완료했습니다.
딱히 메서드를 활용안하고 수학적인 공식을 이용하여 풀이한 듯 보입니다. 간단한 코드처럼 보이지만
막상 직접 해보지 않으면 이해하기 쉽지 않아 당황스러웠습니다.
직관적이게 이해하는 것은 제 코드가 더 좋다고 보입니다. (주석이 붙어 있으니,,,,)
Is Lucky 풀이를 마칩니다...........(힘들오)
https://github.com/greenhelix/CodeFights-Arcade/blob/master/Intro/Smooth%20Sailing/isLucky/code.java
제 코드입니다.
https://app.codesignal.com/arcade/intro/level-3/3AdBC97QNuhF6RwsQ/drafts
'Algorithm > Java' 카테고리의 다른 글
#12_Code Signal Arcade >> Sort By Height (0) | 2019.10.22 |
---|---|
#10_Code Signal Arcade >> Common Character Count (0) | 2019.10.14 |
#09_Code Signal Arcade >> All Longest Strings (0) | 2019.10.05 |