Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고,
추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Different Squares
다른 사각형들?
문제를 보겠습니다.
문제를 보시면 주어진 다차원 배열속에서 2*2 짜리 사각형이 다른 것을 찾으라는 문제입니다.
처음에는 뭔말이가 싶었지만, 설명을 보면 이해가 됩니다.
말그대로 2*2로 모든 경우의 수대로 짤라서 비교해보고, 다른 경우의 수를 리턴해달라는 문제입니다.
이 경우를 볼까요. 직관적으로 2*2로 짤라봅니다.
잘라보면, 아래와 같이 총 8가지의 경우가 나옵니다.
[1,2 2,2] |
[2,1 2,2] |
[2,2 2,2] |
[2,2 2,2] |
[2,2 1,2] |
[2,2 2,3] |
[1,2 2,2] |
[2,3 2,1] |
이렇게 봤을때, 색깔이 같은 것이 같은 경우입니다. 초록색과 보라색이 하나씩 더 있네요.
그렇다면 이 중복된 것은 하나로 통합해줍니다.
그렇게 되면 총 경우는 6가지의 경우가 됩니다.
이해가 되셨나요? 이 문제는 이러한 배열의 중복을 발견해주고 중복값을 제거해달라는 문제인 듯합니다.
답안을 보겠습니다.
int differentSquares(int[][] matrix) {
Set <String> squaresSet = new HashSet<String>();
for( int i = 0; i<matrix.length-1 ; i++){
for(int j = 0; j<matrix[0].length-1; j++){
squaresSet.add(String.format("%d%d%d%d",
matrix[i][j],matrix[i][j+1],matrix[i+1][j],matrix[i+1][j+1]));
}
}
return squaresSet.size();
}
저도 좀 짬이 쌓여서 그런지 좋은 객체를 이용하여 문제를 풀게 되더군요. 여러분도 알다시피 이미 언어에는 중복값을 허용하지 않는 객체가 있습니다.
Hash set 입니다. (링크를 누르면 hash set에 대한 자세한 정보를 얻으실 수 있습니다. 한번 보고 가시죠.)
Set <String> squaresSet = new HashSet<String>();
먼저 해쉬set 을 선언해줍니다. string으로 설정한 이유는 정규식을 통해 걸러서 넣을 거라 그렇습니다.
for( int i = 0; i<matrix.length-1 ; i++){
for(int j = 0; j<matrix[0].length-1; j++){
squaresSet.add(String.format("%d%d%d%d",
matrix[i][j],matrix[i][j+1],matrix[i+1][j],matrix[i+1][j+1]));
}
}
다음은 이 반복문 부분입니다. 알고리즘 퀄리티로는 별로지만, 일단은.. 답이 되니깐 볼까요. ㅎㅎ
저 같은 경우는 일단 String.fromat() 메서드를 사용하였습니다.
이렇게 하면, 반복문을 통해서 원하는 요소들을 빼내서 hashset에 add해주게 되는데요.
hashset은 중복이 안되므로 알아서 중복을 제거하고 깔꿈하게 Set이 완료 됩니다.
그리고 리턴을 그 hashset의 size를 리턴해주면! 딱 중복 제거된 리턴값이 나오겠죠?
System.out.println(squaresSet);
return squareSet.size();
궁금하신분은 이 출력 코드를 리턴 상단에 꽂아주시면 좀 직관이 되실 겁니다.
cosole output을 보시면 아무리 큰 배열이라 해도 알아서 2*2로 추출하여 hashset에 넣게 되고,
그 길이만 리턴해주면 원하는 값이 나옵니다. 단순히 경우의 수만 추출하는 것이라 이런식으로 하면 될 것 같네요.
이상입니다~ ㅎ
이제 엘리트 분들의 답안을 감상하자...
JAVA
int differentSquares(int[][] matrix) {
HashSet<String> set = new HashSet<>();
for(int i=0; i<matrix.length-1; i++){
for(int j=0; j<matrix[0].length-1; j++){
String temp = String.valueOf(matrix[i][j]) + ";" +
String.valueOf(matrix[i+1][j]) + ";" +
String.valueOf(matrix[i][j+1]) + ";" +
String.valueOf(matrix[i+1][j+1]);
set.add(temp);
}
}
return set.size();
}
이 분도 비슷한 방법인듯 합니다. 그래도 전 Format()함수를 사용한 것이 더 간단하고 좋네요. ㅎㅎ
Python3
def differentSquares(matrix):
s = set()
for i in range(len(matrix) - 1):
for j in range(len(matrix[i]) - 1):
s.add((matrix[i][j], matrix[i][j+1], matrix[i+1][j], matrix[i+1][j+1]))
return len(s)
파이썬도 set을 사용한 것은 같은가 봅니다. 반복문을 두번 도는 것을 보니 이 방법밖에 없나보네요. ? ㅎㅎ나이쓰....
JS
function differentSquares(a) {
var s = new Set;
for( var i=0; i<a.length-1; i++ ) {
for( var j=0; j<a[0].length-1; j++ ) {
var hash = a[i][j] + 10*a[i][j+1] + 100*a[i+1][j] + 1000*a[i+1][j+1];
s.add( hash );
}
}
return s.size;
}
자바스크립트도 Set입니다. 10, 100, 1000을 곱하는 것을 보니 이런식으로 해도 될 것 같긴하네요.
공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
'Algorithm > Java' 카테고리의 다른 글
#56_Code Signal Arcade >> Digits Product (0) | 2020.07.12 |
---|---|
#54_Code Signal Arcade >> Sum Up Numbers (0) | 2020.07.08 |
#53_Code Signal Arcade >> Valid Time (0) | 2020.07.07 |