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 ( 문자의 아스키 코드 값을 돌려주는 함수) 역시,,, 갓 파이썬인가요...
JS
function bishopAndPawn(bishop, pawn) {
return Math.abs(bishop[0].charCodeAt()-pawn[0].charCodeAt())===Math.abs(bishop[1]-pawn[1])
}
비슷하군요 js는...
공감 버튼♥ 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
'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 |