Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Matrix Elements Sum
매트릭스 행렬의 요소들의 합을 구하라
뭔가 싶은데, 대충 내용은 유령이 들어있는 곳은 0 인 곳이다. 거기 아래의 칸은 구해지지 않는다.
즉 열을 기준으로 봤을때, 위에서 아래로 내려가면 유령이 있다 그러면 밑에 숫자가 있든 없든 그 열은 버린다.
그렇지 않고 숫자가 있다면 더해준다. 그러다가 유령이 나타난다? 그러면 나머지 밑에 칸의 숫자는 버린다.
시작 전에 이중행렬? 갸우뚱하다면 이 링크로 가서 먼저 감을 잡고 가자. (기본적인 이중 다중 행렬에 대해 잘 설명되어있다. )
자, 다시 시작해보자.
예를들어 matrix[ 3 ], [ 4 ] 인, 이중행렬있다고 치자.
[
[1,2,3,0],
[1,2,0,0],
[1,2,0,0]
]
이런식으로 말이다.
문제에서는 이런 이중행렬에서 어떠한 요소가 0이라면 거기에는 유령이 있어서(?) 그 아래칸은 버린다는 것이고 그렇지 않다면 거기에 있는 수를 차곡차곡 더해주라는 것이다.
즉, 이런식으로 아래칸으로 내려가면서 검증을 해주고, 만약 그 열에 0 이 있다면 그 아래칸은 다 무시한다.
왼쪽그림을 보면, 예시가 저 라인은 1 1 1 이므로 다 더해주는 total에 쌓아두자.
다음 열도 마찬가지다. 저 라인은 2 2 2 이므로 다 total쌓아준다.
다음은 세번째열이다.
[
[1,2,3,0],
[1,2,0,0],
[1,2,0,0]
] 요래 생겼었으니깐, 3 0 0 이다.
그렇다면 0이 등장하는데, 3은 쌓아두고 그 다음 등장하는 0은 break해준다. 저 아래 칸 matrix(2,2)는 만약 0이 아니였더라도 버리는 것이다. 바로 빠져나와서 matrix(0,3)으로 가야한다.
마지막 열이다. 이중행렬 예시를 봐도 저 열은 0 0 0 이다. 그렇다면 다 제낀다. break.
이렇게 모든 검사가 끝나면, total에 쌓아둔 수를 모두 더해진 값이 output으로 나와야 한다.
이런식으로 초록색 부분만 total에 쌓이게 되어 최종적으로 output 은
1 + 1 + 1 + 2 + 2 + 2 + 3 = 12 가 된다.
이렇게 정상적으로 테스트가 완료된당.
코드로 보면 아래와 같다.
int matrixElementsSum(int[][] matrix) {
// 일단 더하는 장소를 만들어준다.
int total = 0;
// 모든 matrix[0]의 길이는 열의 갯수이다. 그러므로 int j 는 0~length-1까지 들어간다.
// 단순히 열의 길이임. 기준이 아니다.
for(int j=0; j<matrix[0].length; j++)
// 기준이되고 비교를 시작하고 조건이 들어가는 for문
// 단순히 행의 길이임.
for(int i =0; i<matrix.length; i++){
if(matrix[i][j]==0)
//0이면, 그냥 나간다. 그 열을 그리고 다음 행으로 간다.
break;
else
// 0 이 아니면 차곡차고 쌓아준다.
total += matrix[i][j];
}
return total;
}
코드를 보면 for문이 두개가 나온다.
For( j ) 는 오른쪽으로 이동하는 열이라고 보면된다.
For( i ) 는 아래쪽으로 이동하는 행이라고 보면된다.
for ( j ) 에서 length 를 matrix[0].length로 나타나있는데, 위에 예시를 봐도
[
[1,2,3,0],
[1,2,0,0],
[1,2,0,0]
]
이런식으로 제일 밖에는 [대괄호] 로 감싸주고 있다. 즉, matrix[0]이라 하면, 예를들어, [1,2,3,0]이라고 볼수 있다. 그래서 length는 4 가 된다.
그리고, 바로 아래 for ( i ) 는 matrix.length라고 적혀있다. 즉 전체의 행을 나타낸다. 예시에서는 3이므로, 그 아래를 보면
matrix[ i ] [ j ] 로 되어있는 것을 볼 수 있다.
그래서 여기서 matrix [ i ] [ j ] == 0 조건이 성립되면, break로 빠져나와 바로 다음 열로 이동하는 것이다.
이동하게 되면 자연스럽게 j = 0 에서 j = 1 이 된다. 만약, matrix [ i ] [ j ] 가 0 이 아니라면, 또 i ++되어 다음 행으로 내려가서 0인지 아닌지 확인해주는 것이다.
이런식으로 0이 아니라면, total += matrix[ i ] [ j ] 를 통해 Total에 숫자를 차곡차곡 쌓아주는 것이다.
그러면 끄읕....
점점 알고리즘을 볼수록 멀미가 나지만,,, (답지없으면 어쩄을꼬..).
자바를 그냥 배우는 것보다 스스로 찾아가면서 문제를 풀고 답을 보고도 어떤식으로 로직이 이뤄졌는지 이해하고 바로 또 설명을 해야 하니 공부가 되는 것 같다. ^^
겉핡기 식으로 배운 자바를 빠삭하게 다시 이해하기 시작한 것 같아서 좋다.
언제나 그랬든 답지는 아래 링크에 있습니다.~
https://github.com/greenhelix/CodeFights-Arcade/blob/master/Intro/Edge%20of%20the%20Ocean/matrixElementsSum/code.java
'Algorithm > Java' 카테고리의 다른 글
#09_Code Signal Arcade >> All Longest Strings (0) | 2019.10.05 |
---|---|
#07_Code Signal Arcade >> Almost Increasing Sequence (2) | 2019.10.02 |
#06_Code Signal Arcade >> Make Array Consecutive 2 (0) | 2019.09.29 |