본문 바로가기
Programming/Algorithm

swe 1225 암호생성기

by OKOK 2018. 4. 2.

1. 예전에는 이런 문제가 별로 라고 생각했는데, 지금은 꼼꼼함을 기를 수 있는 중요한 문제라고 생각됩니다.

어떻게하면 메모리를 축소시킬 수 있는지, 시간을 단축할 수 있는지를 명확히 할 필요가 있습니다. 시간 복잡도와 메모리 복잡도를 계싼할 수 있는 실력이 되도록 합니다.


라인에서의 경험은 정말 큰 자산이 되었습니다. 새로운 문제에 대해서 대처할 수 있는 능력이 필요하다고 생각됩니다. 


톱니바퀴때 스왑을 못했던 것을 생각하면,

몇 일안에 연결 요소 그래프를 한번 찾아보도록 하겠습니다.

저는 잘 할 수 있습니다.



/*

2018.04.01.1003 시작하겠습니다.


암호생성기 1225 문제시작.


끝나는 부분은 0보다 작아지거나 0일 경우 0으로 저장되며,

해당 숫자 배열이 암호가 됩니다.

그리고 칸 미루는 것은 swap 을 사용하도록 하겠습니다.


8칸을 1,2,3,4,5 씩 빼다가, 0이 되면 그때까지만 하도록 합니다.


한 사이클 씩 검사를 하도록 하겠습니다.

아니다. 그냥 5뭉텅이인데, 스왑도 계속해주도록 합니다.


5개씩 짜면, 뭉텅이를 짠 다음에 낱개로 짜야 하기 때문에 귀찮아 집니다.

*/


#include <iostream>

#include <algorithm>

using namespace std;

#define SIZE 8


int map[SIZE];

int map_store[SIZE];

int flag;


void problemIn() {

for (int i = 0; i < 8; i++) {

cin >> map[i];

}

}


void copy_map(int a[SIZE], int b[SIZE]) {

for (int i = 0; i < 8; i++) {

b[i] = a[i];

}

}


void turn() {

for (int i = 0; i < 8; i++) {

map_store[i] = map[(i + 5) % 8];

}

}


void turn_end(int index) {

for (int i = 0; i < 8; i++) {

map_store[i] = map[(i + index + 1) % 8];

}

}


void solve() {


while (flag != 1) {

for (int i = 1; i <= 5; i++) {

map[i-1] = map[i-1] - i;

if (map[i-1] <= 0) {

map[i-1] = 0;

turn_end(i-1);

flag = 1;

break;

}

}

if (flag) {

copy_map(map_store, map);

break;

}

turn();

copy_map(map_store, map);

}

}


int main() {

for (int i = 0; i < 10; i++) {

int tc;

cin >> tc;

problemIn();

solve();


cout << "#" << tc << " ";

for (int i = 0; i < 8; i++) {

cout << map[i] << " ";

}

cout << endl;


flag = 0;

}

return 0;