Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Alternating Sums
alternating 은 교대라는 뜻입니다. 즉, 이 문제는 교대로 합을 구해라.
문제를 보시면 대강 감이 옵니다..
사람들이 한줄로 서있다. 그리고 그 사람들을 두 팀으로 나눌껀데, 순서대로 번갈아가면서 1팀, 2팀으로 나눌것임.
주어진 배열은 사람들의 몸무게를 나타낸다.
나눠진 팀대로 몸무게를 합하여 길이 2짜리 배열로 리턴을 시켜라.
... 이게 문제의 내용입니다.
답안코드를 볼까요.
매우 간단하죠??
먼저, return값이 될, 배열을 선언해줍니다. 다행히도(?) 리턴값의 배열길이는 2니깐. 그렇게 설정하여 선언.
다음은..
for반복문을 활용하는 것은 다들 예상하시겠지만, 문제는 어떻게 교대로 나누느냐 입니다.
여기서 그 방법을 간단한 코드 한줄로 표현이 가능합니다.
sum[i & 1] += a[i]; |
이 코드 한줄의 의미는 &연산자를 활용해서 두 팀중 하나로 배열 a 의 값들이 들어가게 만드는 겁니다.
즉, sum [i&1] = sum[i&1] + a[i]; 라는 의미입니다.
여기서 i & 1 의 의미가 재밌는데요. 바로 비트연산을 하는 것입니다.
i값이 1과 같으면 1을 내보내고, 그렇지 않다면 0을 반환하게 하는 것입니다.
그러면 sum 의 인덱스는 0 과 1 밖에 없으니 자연스럽게 교대로 들어가게 되는 겁니다.
비트연산이 생각이 안난다? 일단 아래 링크 참조해주세요. 일단 감을 잡아볼께요.
http://fendee.egloos.com/9022534
자 일단 감을 잡긴했는데, 저처럼 이해가 잘 안된다면 쉽게 설명드릴께요.
배열 test1 | 50 | 60 | 60 | 45 | 70 |
인덱스(i값) | 0 | 1 | 2 | 3 | 4 |
인덱스의 비트값 | 0 | 1 | 10 | 11 | 100 |
비교될 비트값(1) | 1 | 1 | 01 | 01 | 001 |
return | 0 | 1 | 0 | 1 | 0 |
구분되는 팀 | A | B | A | B | A |
자 위의 표가 이해가 되시나요?
잘보면, 인덱스로 비트연산을 진행하는 것입니다.
& 논리연산 AND는 둘다 1 값이라면 1을 리턴하고 둘중하나라도 1이 아니면 0을 리턴하는 것입니다.
기준이 되는 비교값이 1이기 때문이고, 이 기준값을 바꿔준다면 배열의 흐름도 바꿀수 있겠죠?
다시 표를 보시면, 50의 값의 인덱스는 0 이고 비교값은 1 이니깐. 둘은 아예 같지가 않죠? 그러니깐 리턴은 0입니다.
이런 식으로 모든 값들을 비교해나가면, 0 1 0 1 0 이런식으로 교대로 리턴값이 나옵니다.
이렇게 되면 자동으로 배열의 요소들을 교대로 가져오게 되는 것이죠.
어차피 sum 의 인덱스도 0 과 1 이니깐, 알아서 A팀 B팀으로 나눠져서 들어가게 되고,
또 합이니깐, =+ 를 해주어 a[i] 값들이 0부턴 순서대로 번갈아 들어가니 ,,, 자동으로 두 팀 각각 몸무게의 합이 생성되어 sum의 인덱스 0 과 1 에 자동으로 축적이 됩니다.
그렇게 되면, 간단하게 return sum; 을 해주면 완성입니다. ^^
'Algorithm > Java' 카테고리의 다른 글
#15_Code Signal Arcade >> Add Border (0) | 2019.11.16 |
---|---|
#13_Code Signal Arcade >> Reverse In Parentheses (0) | 2019.11.07 |
#12_Code Signal Arcade >> Sort By Height (0) | 2019.10.22 |