CodeWars 일흔 여덞 번째 문제
Updated:
Street Fighter 2 - Character Selection
public static String[] streetFighterSelection(String[][] fighters, int[] position, String[] moves){
String[] result = new String[moves.length];
for(int i = 0; i < moves.length; i++) {
if("up".equals(moves[i])) {
if(position[0] == 1) {
position[0] = position[0] - 1;
}
} else if("down".equals(moves[i])) {
if(position[0] == 0) {
position[0] = position[0] + 1;
}
} else if("right".equals(moves[i])) {
if(position[1] == fighters[0].length -1) {
position[1] = 0;
} else {
position[1] = position[1] + 1;
}
} else {
if(position[1] == 0) {
position[1] = fighters[0].length -1;
} else {
position[1] = position[1] - 1;
}
}
result[i] = fighters[position[0]][position[1]];
}
return result;
}
- 이번 문제는 내가 너무 간단하게 생각한 것 같다.
- 확실히 딱봐도 if문이 너무 많아 리펙토링이 필해야 보이는 문제다.
- up이 down의 경우 생각해보면 up하면 무조건 0번째 행에 있는거고 down하면 무조건 1에 있는 거다.
- 저렇게 굳이 if을 넣을 이유가 없다.
- 그리고 left, right의 경우에는 조금만 생각하면 되는건데… 열의 크기를 넘어가면 다시 0으로 넘어 온다는 것은 열의 크기를 나누었을 때 나머지를 생각하면 결국 순환한다는 거다.
- right의 경우 + 1(left의 경우 +5)을 해서 나누기 6을 했을 때 나머지가 그 위치이다.
- 어쨌든 위의 코드를 리펙토링(?)을 해서 아래와 같이 고쳤다.
- 문제에서는 2X6 행렬이라고 했는데 나는 그냥 확장성을 고려해서 열의 크기로 나누었다.
- 왜냐하면 5kyu로 행렬이 일정하지 않은 문제가 있었기 때문에 추후를 고려했다.
public static String[] streetFighterSelection(String[][] fighters, int[] position, String[] moves) {
String[] result = new String[moves.length];
for(int i = 0; i < moves.length; i++) {
if("up".equals(moves[i])) {
position[0] = 0;
} else if("down".equals(moves[i])) {
position[0] = 1;
} else if("right".equals(moves[i])) {
position[1] = (position[1] + 1) % fighters[0].length;
} else {
position[1] = (position[1] + 5) % fighters[0].length;
}
result[i] = fighters[position[0]][position[1]];
}
return result;
}