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
이분은 자바분이랑 비슷하구용. 아무튼 재밌네요.
공감 버튼 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
'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 |