inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

5-O

5-O

502

자르트

작성한 질문수 60

0

http://boj.kr/a56d875c729140559ebb3e3fadf75479

 

게시판, 문제 제공 테케 전부 돌려보고 제가 직접 생각해서

큰돌님께 배운대로

최소, 최대 이런 것들을 나름고려해서 테케를 짜서 돌려봤는데도 이상이 없어보였는데 1%에서 틀립니다... 혼자 최대한 해결해보려 했는데 한 문제를 2일 동안 붙잡으니 진도가 안나가서요...

질문이 많아 죄송합니다...ㅠㅠ

c++ 코딩-테스트

답변 2

0

자르트

아닙니다 큰돌님! 제 질문에 많은 시간 써주셔서 감사합니다..!! 큰돌님 풀이를 최대한 똑같이 이해하는 방향으로 해당 문제 해결해보겠습니다! 항상 감사드려요 :)

0

큰돌

안녕하세요 자르트님 ㅎㅎ

제가 이 코드 사실 여러번 디버깅을 해봤는데요..

잘 모르겠습니다..

잘 돌려지고 min_y, max_y 하신것도 괜찮습니다.

 

다만 걸리는 것은 ret을 해당 테스트케이스마다 최솟값으로 하는게 맞아서.

1 경우의 수 중 min > 1a

2 경우의 수 중 min > 2a

...

min(1a, 2a..) 를 출력하는 문제라 이 코드가 옳긴 옳은데요. (ret, ret2 분리)

#include<bits/stdc++.h>
using namespace std;

struct triple {
    int r, c, s;
};
int min_y;
int max_y;
int min_x;
int max_x;
int dir;
int n, m, k, ret = 987654321, ret2 = 987654321;
vector<triple> v;
vector<int> idx;
int a[54][54];
int origin[54][54];
// 위 오른쪽 아래 왼쪽
int dy[] = { 0,1,0,-1 };
int dx[] = { 1,0,-1,0 };
vector<pair<int, int>> vv;

void print(int arr[54][54]) {
    cout << '\n';
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << arr[i][j] << ' ';
        }
        cout << '\n';
    }
}

void go(int y, int x) {
    if (x == max_x && y == min_y)dir++;
    if (x == min_x && y == max_y)dir++;
    if (x == max_x && y == max_y)dir++;
    int ny = y + dy[dir];
    int nx = x + dx[dir];
    if (!(min_y <= ny && ny <= max_y && min_x <= nx && nx <= max_x))return;
    vv.push_back({ ny,nx });
    go(ny, nx);
}

void _rotate() {
    while (min_y != max_y) {
        int startY = min_y;
        int startX = min_x;
        dir = 0;
        vv.push_back({ startY,startX });
        go(startY, startX); 
        vv.pop_back();
        vector<int> b;
        for (pair<int, int>p : vv)b.push_back(a[p.first][p.second]);
        rotate(b.rbegin(), b.rbegin() + 1, b.rend());
        int cnt = 0;
        for (pair<int, int>p : vv)a[p.first][p.second] = b[cnt++];
        vv.clear();
        min_x++; max_x--; min_y++; max_y--;
    }
    for (int i = 0; i < n; i++) {
        int sum = 0;
        for (int j = 0; j < m; j++) {
            sum += a[i][j];
        }
        ret = min(ret, sum);
    }
}

int main() {
    cin >> n >> m >> k;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)cin >> a[i][j];
    }
    memcpy(origin, a, sizeof(origin));
    for (int i = 0; i < k; i++) {
        triple t; cin >> t.r >> t.c >> t.s;
        idx.push_back(i);
        v.push_back(t);
    }
    do {
        ret = 987654321;
        for (int i = 0; i < v.size(); i++) {
             min_y = v[idx[i]].r - v[idx[i]].s - 1;
             max_y = v[idx[i]].r + v[idx[i]].s - 1;
             min_x = v[idx[i]].c - v[idx[i]].s - 1;
             max_x = v[idx[i]].c + v[idx[i]].s - 1;
            _rotate();
        }
        ret2 = min(ret2, ret);
        print(a);
        memcpy(a, origin, sizeof(a));

    } while (next_permutation(idx.begin(), idx.end()));
    cout << ret2 << '\n'; 
    
}

 

이것도 틀렸다고 나오네요..

도움이 못되어서 죄송합니다.

 

감사합니다.

코딩살구클럽 가입 요청 확인부탁드립니다

0

11

2

5-S 테스트 케이스 질문

0

27

2

코살 문제풀이 환경

0

44

2

2 - T 오큰수 문제가 있는 것 같습니다.

0

40

1

추천 추가문제들

0

39

2

프로그래머스 코테 환경 관련해서 질문드립니다.

0

42

2

해당 문제에 대한 채점이 코딩살구클럽에서 올바르게 처리되지 않습니다.

0

37

2

균형 이진 트리 설명 시 높이 숫자

0

29

2

4-H 질문드립니다.

0

35

2

1-K 질문드립니다.

0

39

2

대기업 인적성 시험 질문

0

40

2

4-C 질문드립니다

0

41

2

[수학숙제 / BOJ 2870] 채점 서버 오작동

0

36

1

코테 준비 질문

0

48

1

살구클럽가입 요청드려요

0

38

2

1-I 문제 질문

0

39

2

코딩살구클럽 가입

0

55

2

AI 코딩 도구 사용 시 학습 방법 조언

0

50

2

코딩살구클럽 오류

0

60

2

코살클 [3-F 괄호 추가하기] 프라이빗 9번 제보

0

45

1

코딩살구클럽 테스트 케이스 오류 제보

0

52

2

삼성 코딩테스트

0

60

2

틀린 이유를 못찾겠습니다

0

47

2

시간은 이상 , 미만 질문 드립니다.

0

35

1