2016.03.10 모임 50

이제부터 모임은 목요일에 합니다.

  • 활동 일시: 03월 10일 (목) 18:32 - 20:20
  • 모임 장소: 강남 R&D 캠퍼스 1층 회의실
  • 활동 주제: 쉬어가는 문제

문제 링크

  1. Matrix Rotation
  2. 알고스팟 SUSHI

코드

좌표를 pair<int, int> 로 표현해서 만든 코드입니다.
버그가 있는 상태 그대로 올립니다.
누가 수정해 주세요 ㅠ

#include <iostream>
#include <vector>

using namespace std;

int row, col, R;
int in[300][300];
int result[300][300];

void input() {
    cin >> row >> col >> R;
    for (int r = 0; r < row; r++)
        for (int c = 0; c < col; c++)
            cin >> in[r][c];
}

void rotate(int rbegin, int rend, int cbegin, int cend) {
    vector<pair<int,int>> v;

    for (int c = cbegin; c <= cend; c++) {
        v.push_back(make_pair(rbegin, c));
    }

    // rbegin, cend
    for (int r = rbegin+1; r <= rend; r++) {
        v.push_back(make_pair(r, cend));
    }

    for (int c = cend-1; cbegin <= c; c--) {
        v.push_back(make_pair(rend, c));
    }

    for (int r = rend-1; rbegin <= r+1; r--) {
        v.push_back(make_pair(r, cbegin));
    }

    vector<pair<int,int>> out(v.size());

    int size = v.size();
    for (int i = 0; i < size; i++) {
        out[i] = v[(i+R)%size];
    }

    /////////////////////////////////////////////////
    int index = 0;
    for (int c = cbegin; c <= cend; c++, index++) {
        auto &p = out[index];
        int &rr = p.first;
        int &cc = p.second;

        result[rbegin][c] = in[rr][cc];
    }

    // rbegin, cend
    for (int r = rbegin+1; r <= rend; r++, index++) {
        auto &p = out[index];
        int &rr = p.first;
        int &cc = p.second;

        result[r][cend] = in[rr][cc];
    }

    for (int c = cend-1; cbegin <= c; c--, index++) {
        auto &p = out[index];
        int &rr = p.first;
        int &cc = p.second;

        result[rend][c] = in[rr][cc];
    }

    for (int r = rend-1; rbegin <= r+1; r--, index++) {
        auto &p = out[index];
        int &rr = p.first;
        int &cc = p.second;

        result[r][cbegin] = in[rr][cc];
    }
}

void solve() {
    int rbegin(0), rend(row-1), cbegin(0), cend(col-1);
    while (rbegin < rend && cbegin < cend) {
        rotate(rbegin, rend, cbegin, cend);
        rbegin++; cbegin++;
        rend--; cend--;
    }

    for (int r = 0; r < row; r++) {
        for (int c = 0; c < col; c++) {
            cout << result[r][c] << " ";
        }
        cout << endl;
    }
}

int main() {
    input();
    solve();
    return 0;
}

아래는 두 번째로 다시 작성한 코드입니다.

#include <iostream>
#include <vector>

using namespace std;

int row, col, R;
int in[300 *300];
int result[300 *300];

void input() {
    cin >> row >> col >> R;
    for (int r = 0; r < row; r++)
        for (int c = 0; c < col; c++)
            cin >> in[r*col + c];
}

void rotate(int rbegin, int rend, int cbegin, int cend) {
    vector<int> v;

    int index = rbegin*col + cbegin - 1;
    for (int c = cbegin; c <= cend; c++) {
        index++;
        v.push_back(index);
    }

    for (int r = rbegin+1; r <= rend; r++) {
        index += col;
        v.push_back(index);
    }

    for (int c = cend-1; cbegin <= c; c--) {
        index--;
        v.push_back(index);
    }

    for (int r = rend-1; rbegin+1 <= r; r--) {
        index -= col;
        v.push_back(index);
    }

    int size = v.size();
    for (int i = 0; i < size; i++) {
        int aaa = v[(i+R) % size];
        int target = v[i];

        // target <--- aaa
        result[target] = in[aaa];
    }
}

void solve() {
    int rbegin(0), rend(row-1), cbegin(0), cend(col-1);
    while (rbegin < rend && cbegin < cend) {
        rotate(rbegin, rend, cbegin, cend);
        rbegin++; cbegin++;
        rend--; cend--;
    }

    int index = 0;
    for (int r = 0; r < row; r++) {
        for (int c = 0; c < col; c++) {
            cout << result[index++] << " ";
        }
        cout << endl;
    }
}

int main() {
    input();
    solve();
    return 0;
}

사진

사진 사진


Written on February 19, 2016