greenhelix
greenhelix
greenhelix
06-22 11:06
  • All (229)
    • Algorithm (118)
      • Algorithm (17)
      • Graph (0)
      • Core (6)
      • Python (18)
      • PythonSnippet (4)
      • Java (59)
      • Kotlin (14)
    • Project (0)
    • Study (8)
      • License (5)
      • EIP (3)
    • Programming (63)
      • Android (41)
      • Flutter (1)
      • Bugs Life (21)
      • Linux (0)
    • Tech (32)
      • Tech (17)
      • Drone (4)
      • Hacking (11)
    • Life (6)
      • INGRESS (1)
      • 심시티빌드잇 (0)
250x250

티스토리

hELLO · Designed By 정상우.
greenhelix

greenhelix

#29_Code Signal Arcade >> Chess Board Cell Color
Algorithm/Java

#29_Code Signal Arcade >> Chess Board Cell Color

2019. 12. 4. 12:00

Code Signal -Arcade

코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당. 

주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...

되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!


Chess Board Cell Color 

체스판 칸의 색상 

 

이 문제는 체스판을 활용한 문제인게 딱 보이죠. 문제는 주어진 입력값이 두개의 위치를 찍어준다고 합니다. 

이럴때, 이 각 위치의 색상이 같은 색깔의 칸인지 확인해달라는 문제입니다. 

 

답안을 보겠습니다. 

 

boolean chessBoardCellColor(String cell1, String cell2) {
//입력값을 분해 
        char hor1 = cell1.charAt(0); 
        String ver1 = cell1.substring(1);       
        int hori1 =(int)hor1;
        int vert1 = Integer.parseInt(ver1);
    
        char hor2 = cell2.charAt(0); 
        String ver2 = cell2.substring(1);
        int hori2 =(int)hor2;
        int vert2 = Integer.parseInt(ver2); 

 //체스판.
    String [][] chess = new String [8][8] ; 
    
    for(int i =0 ; i< chess.length; i ++){

        for(int j =0; j< chess[0].length; j++){
            
            if(i%2 == 0){
                if(j%2 == 0){
                    chess[i][j] = "ON"; }
                else{
                    chess[i][j] = "OFF"; 
                }
            }else{
                  if(j%2 == 0){
                    chess[i][j] = "OFF"; }
                else{
                    chess[i][j] = "ON"; 
                }
            }
        }
    }
  
    int [][] cell = {{'A','B','C','D','E','F','G','H'},
                        {1,2,3,4,5,6,7,8}};
     // 최종 리턴값 변수 선언.
     boolean result = true; 
     //최종결과값을 저장하는  string 선언.
     String result1 = ""; 
     String result2 = ""; 
    // cell1 값을 확인하는 반복문
    for(int i =0; i<8; i++){
        for(int j=0; j<8; j++){
                //cell1의 값들이  cell배열의 값과 같다면, 
                if(hori1 + vert1 == cell[0][i]+cell[1][j]){
                    // 그 값은 페스판의 각 한개의 값이 된다. 
                    result1 = chess[i][j]; 
                }   
        }                                                          
    }
    // cell2 값을 확인하는 반복문 
    for(int i =0; i<8; i++){
        for(int j=0; j<8; j++){
                //cell1의 값들이  cell배열의 값과 같다면, 
                if(hori2 + vert2 == cell[0][i]+cell[1][j]){
                    // 그 값은 페스판의 각 한개의 값이 된다. 
                    result2 = chess[i][j]; 
                }    
        }                                                          
    }
    // 최종값 확인 출력
    System.out.println("result1 = "+result1 +" result2 = "+ result2); 

    return result = result1 == result2 ? true:false;   
}

결론부터 말씀드리자면 이거 노답 답안. 일단 제가 푼거니깐.. 기록은 남기지만 너무 극혐입니다. 

맨아래 앨리트 분들의 코드를 참고하셔요 저는 약간 길게 설명하는 느낌이고 앨리트 분들은 간단하게 끝내버리십니다.

 

일단 코드를 보겠습니다. 

 

//입력값을 분해 
        char hor1 = cell1.charAt(0); 
        String ver1 = cell1.substring(1);       
        int hori1 =(int)hor1;
        int vert1 = Integer.parseInt(ver1);
    
        char hor2 = cell2.charAt(0); 
        String ver2 = cell2.substring(1);
        int hori2 =(int)hor2;
        int vert2 = Integer.parseInt(ver2); 

저는 일단 입력값들을 분해하였습니다. ( 극혐의 시초...) 

너무 어캐해야할지 모르기 때문에, 일단, 입력값을 두개씩 쪼개기로 마음을 먹었어요. 

가로축 /// 세로축 // 이런식으로요.. 

 

그리고, 또 웃긴게 이것을 그냥 똑같은 형으로 선언해서 때어낸 것이아니라, 압글자는 Char형으로 뒤에 글자는 숫자이기때문에 String으로 때어냈습니다. 

왜인지는 아래에 나옵니다. 

그리고, 또 웃기게  horizontal 을 나타내는  hori 와 vertical을 나타내는 vert가 있습니다. 

이건 딱봐도 가로 세로를 뜻하고 있습니다. 

 

 //체스판.
    String [][] chess = new String [8][8] ; 
    
    for(int i =0 ; i< chess.length; i ++){

        for(int j =0; j< chess[0].length; j++){
            
            if(i%2 == 0){
                if(j%2 == 0){
                    chess[i][j] = "ON"; }
                else{
                    chess[i][j] = "OFF"; 
                }
            }else{
                  if(j%2 == 0){
                    chess[i][j] = "OFF"; }
                else{
                    chess[i][j] = "ON"; 
                }
            }
        }
    }

 자 이건.. 언젠가 또 쓰이는 날이 오겠죠.. 라는 생각으로 만들어 버렸습니다. 

저는 빡대가리라.. 이런거 만들어야 이해가 되는 듯해요.. (슬픔) 

아무튼 시키는대로  색깔이 있고 없고 의 체스판을 직접 만들엇습니다. 

색이 있으면  On  없으면 off 로 말이죠. 

테스트를 통해 어떻게 출력되는지 보여드릴게요. (다중배열이기때문에, arrays.deeptoString()을 쓰셔야합니다. 

System.out.println(Arrays.deepToString(chess));

보이시나요? 라인따악 맞춰서 만들었어요~~

하지만 길이 멀답니다. ㅎㅎ

아무튼 이런것을 만들분들 참고 하시면 될거같아요.

 

2로 나눠 나머지 값이  0 이 면 짝수 그렇지 않으면 홀수 지요. 

이개념을 써서 저는 on / off 를 구분해서 넣어주도록 했습니다. 

중복 반복문을 통해서  i 와 j 를 통해서 가로세로 해가지고.. 아무튼 저래저래 해서 했는데, 

지금은 더 간단하게 할 수 있을거 같은데.. 

안할래요. 

 

 

이제 여기서부터가 저는 극혐이였어요. 

이제 이렇게 만들어준 체스판의 값들과 입력값을 어떻게 연결해줘야 하는가... 

 

일단 그래서 위에 변수선언처럼 다 쪼갯습니다. 

그리고 나서 또 이중배열을 선언하여 그 값이 가로축 세로축 과 어디에 일치하고 어디에 맞는지 순서로 찾으려고 했어요.

우리가 그래프에서 좌표를 찍으면 가로축 세로축을 기준으로 판단하듯이요. 진짜 실제로 우리가 생각하는 방식으로 코드를 쓰니 극혐으로 치닫더군요. 

int [][] cell = {{'A','B','C','D','E','F','G','H'},
                        {1,2,3,4,5,6,7,8}};
     // 최종 리턴값 변수 선언.
     boolean result = true; 
     //최종결과값을 저장하는  string 선언.
     String result1 = ""; 
     String result2 = ""; 
    // cell1 값을 확인하는 반복문
    for(int i =0; i<8; i++){
        for(int j=0; j<8; j++){
                //cell1의 값들이  cell배열의 값과 같다면, 
                if(hori1 + vert1 == cell[0][i]+cell[1][j]){
                    // 그 값은 페스판의 각 한개의 값이 된다. 
                    result1 = chess[i][j]; 
                }   
        }                                                          
    }
    // cell2 값을 확인하는 반복문 
    for(int i =0; i<8; i++){
        for(int j=0; j<8; j++){
                //cell1의 값들이  cell배열의 값과 같다면, 
                if(hori2 + vert2 == cell[0][i]+cell[1][j]){
                    // 그 값은 페스판의 각 한개의 값이 된다. 
                    result2 = chess[i][j]; 
                }    
        }                                                          
    }

저도 하면서 헷갈려서 저렇게 주석을 달면서 했던 기억이... 슬프다.. 

아무튼 cell 배열을 보시면, [ 2] [ 8]   의 크기로 되어있습니다. 

이것을 보시면 이해되실꺼에요. 아무튼 이렇게 가로축 세로축을 생각하여 체스판도 만들고 각 좌표를 뽑아줄 크기의 이중배열을 선언햇습니다. 

 

그리고 나서 ,

아래 반복문을 두번 반복하여 입력된 두 값중 하나를 찾아서 그 값이 chess  판에서 어떠한 값을 나타내고 잇는지 찾앗습니다. 

 

 

 

for(int i =0; i<8; i++){
        for(int j=0; j<8; j++){
                //cell1의 값들이  cell배열의 값과 같다면, 
                if(hori1 + vert1 == cell[0][i]+cell[1][j]){
                    // 그 값은 페스판의 각 한개의 값이 된다. 
                    result1 = chess[i][j]; 
                }   
        }                                                          
    }

이거를 두번합니다. resutl 1  ,  result2 를 뽑아내기 위해서 말이죠. 

 

이렇게 하면 최종적으로 

System.out.println("result1 = "+result1 +" result2 = "+ result2); 

    return result = result1 == result2 ? true:false;   

이렇게 출력이 되고, 결과 값은 리턴만 해주면 됩니다. 

 

간단하죠..??

원리는 간단한데,, 코드를 더 줄일까 하다가

포기햇습니다. 일단 진도가 먼저라서..

 

그래도 깔끔하게 출력도 되고 저는 이러한 논리가 맘에 들더군요. ㅎㅎ

 

 

자 이제 앨리트 분들의 답안을 보겠습니다. 

 


JAVA

boolean chessBoardCellColor(String cell1, String cell2) {
return Math.abs(cell1.charAt(0) - cell2.charAt(0)) % 2 == Math.abs(cell1.charAt(1) - cell2.charAt(1)) % 2;
}

저는 이분 코드를 보고 체스판은 공식이 있다는 것을 처음 접했습니다. ㅎㅎ 

Math .abs 를 활용해서 각 값의 차이를 절대값으로 출력하고 그것들의 짝수인지 홀수인지 분석하는겁니다.

생각해보니 

이 칸들을 숫자로 보면, 아스키코드로 해석하여 더해놓으면 홀 짝 홀짝 이더군요. 

왜 이생각을 못했을까 싶었습니다. 

 

아무튼 나중에 또 많이 참고하게 되니 기억하시길..

 

 

이제는 이분 덕에 문자를 숫자로 보는 힘을 키우고 잇습니다. 역시 컴퓨터처럼 생각해야하는듯한.. 

 

 

 

 

 

 

 


JS

//Get the color (0=black, 1=white) for a given cell
var color = s => (Buffer(s)[0] - s[1])%2

var chessBoardCellColor = (a,b) => color(a) == color(b)

이 분은 더 심하게 0 과 1 로 문제를 푸셨어요. 아예 색상은 고려도 안하고 ㅋㅋ 0 은 화이트 1 은 블랙 이런느낌이랄까?


Python 

def chessBoardCellColor(cell1, cell2):
    
    return (ord(cell1[0])+int(cell1[1])+ord(cell2[0])+int(cell2[1]))%2==0

 

이분은 자바분이랑 비슷하구용. 아무튼 재밌네요. 

 

 

 

 

 

공감 버튼 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!

부탁드려요 돈드는거 아니잖아요~

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm > Java' 카테고리의 다른 글

#30_Code Signal Arcade >> Circle Of Numbers  (0) 2019.12.05
#28_Code Signal Arcade >> Alphabetic Shift  (0) 2019.12.03
#27_Code Signal Arcade >> Variable Name  (0) 2019.12.02
    'Algorithm/Java' 카테고리의 다른 글
    • #31_Code Signal Arcade >> Deposit Profit
    • #30_Code Signal Arcade >> Circle Of Numbers
    • #28_Code Signal Arcade >> Alphabetic Shift
    • #27_Code Signal Arcade >> Variable Name
    greenhelix
    greenhelix
    개발에 관한 것들과 개인적인 것을 담는 블로그

    티스토리툴바