개발 무지렁이

[문제풀이] B2564 경비원 본문

코딩 테스트/문제풀이

[문제풀이] B2564 경비원

Gaejirang-e 2023. 6. 20. 18:42

경비원


  🪅. if-else if문을 쓸 때는 '명확한 기준'에 의해서 나눠야한다. => 되도록 &&를 쓰지 않는다, 헷갈린다.
  🪅. if문으로 나누기보단 'Math.min( , )'을 자주 이용하자.
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.util.Arrays;
  import java.util.StringTokenizer;

  public class B2564_경비원 {
      static int w;
      static int h;
      static int num;
      static int[][] coords;
      static int x;
      static int y;
      static int[] result;
      public static void findClosest(int idx, int direc, int dist) {
          //현재위치와 상점의 방향이 같을 때
          if(x == direc) {
              result[idx] = Math.abs(dist - y);
              return;
          }

          //방향이 같지 않을때
          if((x == 1 && direc == 2) || (x == 2 && direc == 1)) {//북남
              result[idx] = h + Math.min(y+dist, (w-y)+(w-dist));
          } else if((x == 3 && direc == 4) || (x == 4 && direc == 3)) {//서동
              result[idx] = w + Math.min(y+dist, (h-y)+(h-dist));
          } else {//북서, 북동, 남서, 남동 
              if(x == 1) {
                  if(direc == 3) {//북서
                      result[idx] = y + dist;
                  }
                  if(direc == 4) {//북동
                      result[idx] = (w-y) + dist;
                  }
              }else if(x == 2) {
                  if(direc == 4) {//남동
                      result[idx] = (w-y) + (h-dist);
                  }
                  if(direc == 3) {//남서
                      result[idx] = y + (h-dist);
                  }
              } else if(x == 3) {
                  if(direc == 1) {//서북
                      result[idx] = y + dist;
                  }
                  if(direc == 2) {//서남
                      result[idx] = (h-y) + dist;
                  }
              } else if(x == 4) {
                  if(direc == 1) {//동북
                      result[idx] = y + (w-dist); 
                  } 
                  if(direc == 2) {//동남
                      result[idx] = (h-y) + (w-dist);
                  }
              }
          }
      }
      public static void init() throws IOException {
          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          StringTokenizer token = new StringTokenizer(br.readLine(), " ");
          w = Integer.parseInt(token.nextToken());
          h = Integer.parseInt(token.nextToken());
          num = Integer.parseInt(br.readLine());
          coords = new int[num][2];
          result = new int[num];
          for(int i = 0; i < num; i++) {
              token = new StringTokenizer(br.readLine(), " ");
              coords[i][0] = Integer.parseInt(token.nextToken()); //1:북 2:남 3:서 4:동
              coords[i][1] = Integer.parseInt(token.nextToken());
          }
          token = new StringTokenizer(br.readLine(), " ");
          x = Integer.parseInt(token.nextToken());
          y = Integer.parseInt(token.nextToken());
      }
      public static void main(String[] args) throws IOException {
          init();
          //solution
          for(int i = 0; i < num; i++) {
              findClosest(i, coords[i][0], coords[i][1]);
          }

          int sum = 0;
          for(int i = 0; i < num; i++) {
              sum += result[i];
          }

          System.out.println(sum);
      }
  }

💡.문제 접근 과정
: 경비원이 위치한 방향상점이 위치한 방향에 따라서 크게는 방향이 같을 때와 아닐 때로 나눠야겠다고 생각했다.
특히, 아닐 때는 마주보는 '북남' or '동서'에 있을 때와 아닐 때로 나눠야겠다는 생각이 들어서,
초반에 조건을 Math.abs(경비원방향-상점방향) == 1 로 (1:북 2:남 3:서 4:동) 주었고,
이 조건에 '남서'가 포함되지 않도록 && 연산자를 이용해서 조건을 추가했지만,
이렇게 하니까 헷갈리고 답이 맞지도 않았다.(기준이 명확하지 않아 실수가 있었을 듯,,)
그래서 && 연산자를 빼고 '북남'일 때의 조건을 (x == 1 && direc == 2) || (x == 2 && direc == 1)
이런 식으로 명확하게 주었다.
즉, 조건을 설정할 때 예외인 조건을 &&연산자를 통해 빼는 것이 아니라, 딱 조건에 맞는 데이터만 들어가게끔
설정하는 것이 중요한 듯 싶다.

Comments