본문 바로가기

알고리즘 문제 풀이/Baekjoon

2641 - 다각형 그리기

반응형
SMALL

 

 

2641번: 다각형그리기

모눈종이에 다각형을 그리려고 한다. 그리는 방법은 모양수열로 표시된다. 모양수열은 1과 4사이의 숫자가 연속되어 나열된 것으로 1은 오른쪽으로, 2는 위쪽으로, 3은 왼쪽으로, 4는 아래쪽으로

www.acmicpc.net

 

머리가 굳고, C 언어가 안 짜진다.

 

일부러 쉬운 문제 골라서 했는데, 왤케 머리가 뿌얘

 

#include <stdio.h>

int N, M;
int CORR_ARR[50 + 5];
int TEST_ARR[100 + 10][50 + 5];
int REVS_ARR[100 + 10][50 + 5];
int DIR[5] = {0, 3, 4, 1, 2};

int R;
int RS[100 + 10][50 + 5];

void init() {
  R = 0;

  // freopen("input.txt", "r", stdin);
  scanf("%d", &N);

  for (int n = 0; n < N; ++n) {
    scanf("%d", &CORR_ARR[n]);
  }

  scanf("%d", &M);

  for (int m = 0; m < M; ++m) {
    for (int n = 0; n < N; ++n) {
      scanf("%d", &TEST_ARR[m][n]);

      REVS_ARR[m][N - (n + 1)] = DIR[TEST_ARR[m][n]];
    }
  }
}

void set_flag(int m) {
  for (int n = 0; n < N; ++n) {
    RS[R][n] = TEST_ARR[m][n];
  }

  R++;
}

void compare(int m) {
  int flag = 1;

  for (int n = 0; n < N; ++n) {
    if (CORR_ARR[0] == TEST_ARR[m][n]) {
      int idx = n;

      flag = 1;

      for (int p = idx; p < N; ++p) {
        if (CORR_ARR[p - idx] != TEST_ARR[m][p]) {
          flag = 0;
          
          break;
        }
      }

      for (int o = 0; o < idx; ++o) {
        if (CORR_ARR[N - idx + o] != TEST_ARR[m][o]) {
          flag = 0;

          break;
        }
      }

      if (flag) {
        set_flag(m);
        
        break;
      }
    }
  }
}

void compare_rev(int m) {
  int flag = 1;

  for (int n = 0; n < N; ++n) {
    if (CORR_ARR[0] == REVS_ARR[m][n]) {
      int idx = n;

      flag = 1;

      for (int p = idx; p < N; ++p) {
        if (CORR_ARR[p - idx] != REVS_ARR[m][p]) {
          flag = 0;
          
          break;
        }
      }

      for (int o = 0; o < idx; ++o) {
        if (CORR_ARR[N - idx + o] != REVS_ARR[m][o]) {
          flag = 0;

          break;
        }
      }

      if (flag) {
        set_flag(m);

        break;
      }
    }
  }
}

void print() {
  printf("%d\n", R);
  for (int r = 0; r < R; ++r) {
    for (int n = 0; n < N; ++n) {
      printf("%d ", RS[r][n]);
    }

    printf("\n");
  }
}

int main(void) {
  init();

  for (int m = 0; m < M; ++m) {
    compare(m);

    compare_rev(m);
  }

  print();

  return 0;
}

 

삼성식 주입 교육이 도움이 된 거라는 걸 깨달았다.

 

그 때가 좋았지

반응형
LIST

'알고리즘 문제 풀이 > Baekjoon' 카테고리의 다른 글

10867 - 중복 빼고 정렬하기  (0) 2023.12.19
10808 - 알파벳 갯수  (0) 2023.12.18
시간 복잡도 느린 정렬 모음 - python  (0) 2023.06.16
2243 - 사탕상자  (0) 2021.10.31
17404 - RGB 거리 2  (2) 2021.10.25