greenhelix
greenhelix
greenhelix
07-19 05:55
  • 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

#42_Code Signal Arcade >> Bishop And Pawn
Algorithm/Java

#42_Code Signal Arcade >> Bishop And Pawn

2020. 3. 9. 00:00

Code Signal -Arcade

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

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

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


Bishop and Pawn 

비숍과 폰 

 

비숍과 폰.. 

체슬 둬 봤다면, 좀 이해가 쉬운데요. 

비숍은 좌우상항 대각선으로 이동이 가능한 말이고, 폰은 기본적인 쫄로서 앞으로 이동 하는 말입니다. 

 

주어진 화이트 비숍과 블랙 폰이 있습니다. 서로 적이죠. 

그렇다면, 입력값은 각 비숍과 폰의 위치를 알려줍니다. 이런 경우,

비숍의 위치에서 폰을 잡을 수 있는 위치인지 t/f로 리턴해달라고 하는 문제. 

 

답안을 보겠습니다. 

boolean bishopAndPawn(String bishop, String pawn) {
//비숍의 위치
int bishopPosition = (bishop.charAt(0) + bishop.charAt(1));
// 쫄의 위치.
int pawnPosition = (pawn.charAt(0) + pawn.charAt(1)); 
int test = 0; 
int x = 2;
    
    //  좌상우하 대각선 
    if(bishopPosition == pawnPosition) {
        System.out.println("pawn capture! left diagonal"); 
        return true; }
    
    // 좌하우상 대각선 
    for(int i = 1; i<8; i++){
        x*=i; 
        if(bishopPosition-x== pawnPosition){
            if(bishop.charAt(0)-i == pawn.charAt(0) && bishop.charAt(1)-i == pawn.charAt(1)){
               System.out.println("pawn capture! right diagonal!"); 
               return true;}
        }else if(bishopPosition+x== pawnPosition){
            if(bishop.charAt(0)+i == pawn.charAt(0) && bishop.charAt(1)+i == pawn.charAt(1)){
               System.out.println("pawn capture! right diagonal!"); 
               return true;}
        }
        x = 2; //reset x 
    }
    System.out.println("not capture pawn...");    
    return false ;     
}

제 코드는 항상 뭔가 직역하는 듯한 느낌이죠. 

//비숍의 위치
int bishopPosition = (bishop.charAt(0) + bishop.charAt(1));
// 쫄의 위치.
int pawnPosition = (pawn.charAt(0) + pawn.charAt(1)); 

먼저 각 말들의 위치를 좀 보기 편하게 숫자로 바꿔 줍니다. 

string값이니,, 각 자리의 숫자혹은 알파벳을 형변환하여 int에 담아서 일정한 숫자의 값으로 변형해줍니다.

이런식으로 charAt() 을 사용하면, 각 자리의 아스키코드로 숫자로 나오거나 문자로 출력이 가능한데, +를 해주는 순간 

자연스럽게 아스키 코드로 합을 내줍니다. 

 

그리고 나서,, 

    //  좌상우하 대각선 
    if(bishopPosition == pawnPosition) {
        System.out.println("pawn capture! left diagonal"); 
        return true; }

먼저. 좌상우하 라는 말이 무슨 말이지 아시겠나요? 

각 대각선들의 위치값을 int로 봤을때 일치하는 것을 확인할 수 있습니다. 

즉, 왼쪽위에서 부터 오른쪽아래로 내려가는 대각선들! 이 지역의 칸들의 합은 다 똑같습니다. 

그래서 그것을 포인트로, 만약 비숍과 폰의 int위치가 같다면 같은 좌상우하 대각선 안에 있는 것이므로 t를 리턴합니다.

 // 좌하우상 대각선 
    for(int i = 1; i<8; i++){
        x*=i; 
        if(bishopPosition-x== pawnPosition){
            if(bishop.charAt(0)-i == pawn.charAt(0) && bishop.charAt(1)-i == pawn.charAt(1)){
               System.out.println("pawn capture! right diagonal!"); 
               return true;}
        }else if(bishopPosition+x== pawnPosition){
            if(bishop.charAt(0)+i == pawn.charAt(0) && bishop.charAt(1)+i == pawn.charAt(1)){
               System.out.println("pawn capture! right diagonal!"); 
               return true;}
        }
        x = 2; //reset x 
    }

다음 좌하 우상 대각선이 문제입니다.. 

보시다시피 약간의 규칙성은 보입니다. +2씩 우측상단으로 커지는 것이죠... 

그래서 일단 int x = 2 로 설정하여,, 이 반복문에 넣어서 활용합니다..

x *= 1... 이것은 아마 각 칸의 높이? 위치에 맞게 기준값에서 더해주거나 빼줘서 같은 선상에 있는 것인지 확인해주는 기준이 될겁니다.

if문을 통해 조건을 걸어줍니다.

비숍포지션에서 -x를 했을때 그 값이 폰위치와 같다? 

그러면 일단 또 확인을 해봐야합니다. 왜냐하면 같은 선상일 수도 있고 바로 직각으로 위에 있는 수일 수도 있으니깐요. 

 

i의 범위는 총 체스판 한 면의 길이인 8로 잡아주고 실시합니다. 

그렇게 해서 위쪽이면 + , 아래쪽이면 - 로 좌하우상하는 대각선들의 경우를 확인해줍니다. 

이렿게 하고나서 반드시 다시 반복하기 위해, x = 2 로 초기화를 해줍니다. 

이렇게 되면 끝이고 그 외의 경우는 false로 리턴되도록 합니다. 

끝....

 

좀더 자세한 설명은 댓글로 남겨주세요. 확인하는대로 알려드리도록 하겠습니다.. 아니면 테스틀 해보시는게 확실히 빠릅니다/!!! 

출력 출력 출력 


이제 엘리트 분들의 답안을 감상하자... 

JAVA

boolean bishopAndPawn(String bishop, String pawn) {
    return(Math.abs(bishop.charAt(0) - pawn.charAt(0))) == (Math.abs(bishop.charAt(1) - pawn.charAt(1)));
}

절대 값을 통해서 하는 방법이 있군요.. 저는 이해도가 딸려서 절대값은 상상도 못했네요.. 

이게 젤 빠르겠네요! 앞으로 체스 값 구하는것은 절대값으로!!! 

 

Python3

def bishopAndPawn(bishop, pawn):
    return abs(ord(bishop[0])-ord(pawn[0]))==abs(int(pawn[1])-int(bishop[1]))

python ord ( 문자의 아스키 코드 값을 돌려주는 함수)  역시,,, 갓 파이썬인가요...

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

JS

function bishopAndPawn(bishop, pawn) {
  return Math.abs(bishop[0].charCodeAt()-pawn[0].charCodeAt())===Math.abs(bishop[1]-pawn[1])
}

비슷하군요 js는...

 

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

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

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

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

#43_Code Signal Arcade >> Is Beautiful String  (0) 2020.03.10
#41_Code Signal Arcade >> Digit Degree  (0) 2020.03.08
#40_Code Signal Arcade >> Longest Digits Prefix  (0) 2020.03.07
    'Algorithm/Java' 카테고리의 다른 글
    • #44_Code Signal Arcade >> Find Email Domain
    • #43_Code Signal Arcade >> Is Beautiful String
    • #41_Code Signal Arcade >> Digit Degree
    • #40_Code Signal Arcade >> Longest Digits Prefix
    greenhelix
    greenhelix
    개발에 관한 것들과 개인적인 것을 담는 블로그

    티스토리툴바