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;
}