혼종 꼬지마루
[백준] 17140 - 이차원 배열과 연산 본문
삼성전자 19년 상반기 기출이라고 해서 예~~~~전부터 풀어보려고 했지만.....귀찮아서 미루고 미루다가 드디어 풀어보았다 ㅋㅋㅋ
어려워 보이고, vector를 쓰면 편할 것 처럼 보이지만 범위가 명확하고, 굳이 vector를 쓰지 않아도 될 것 같아서 그냥 풀었다
1. 입력되는 확인할 target 좌표와 3x3행렬을 입력받는다.
2. 함수는 총 5개를 만들었다. target좌표를 확인할 함수, 행렬을 한줄씩 계산하고 바꿔줄 함수, R, C에 들어갈 각각의 함수를 만들었다.
3. for문으로 dab을 count하게 만들었고, for문이 돌 때 가장 먼저 target좌표의 답을 확인
4. R, C의 길이를 확인하여 CalR, CalC함수를 호출
5. CalR기준으로, 행을 순회하며 열의 값을 tmp_arr배열을 만들어 map의 값을 index로 삼아서 count를 올려준다
6. Cal함수를 호출하여 길이와 tmp_arr함수를 변수로 던져준다
7. Cal함수에서는 구조체 배열에 tmp_arr에 담겨있는 index와 cal을 저장하고, count가 있는 것만 넣어준다
8. 이것을 조건에 맞게 정렬하여, tmp_arr에 다시 저장하여 길이와 함께 갱신하여 함수 종료
9. 리턴된 길이와, tmp_arr의 값을 map에 저장한 후, 최대 C의 길이를 갱신하며 저장한다
10. 모든 프로세스가 종료되면, 각 행마다 길이만큼을 저장한 후, 그 이후의 map안의 요소들을 모두 0으로 바꾸어준다.
11. CalC와 CalR을 조건에 맞게 반복하며 target좌표가 k와 동일한지 검사하며 반복
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include <iostream> #include <algorithm> #define MXSIZE 102 using namespace std; struct CNT { int num, cnt; }tmp[MXSIZE]; int map[MXSIZE][MXSIZE]; int R, C, r, c, k; bool com(const CNT i, const CNT j) { return (i.cnt < j.cnt) || (i.cnt == j.cnt && i.num < j.num); } int checkdab() { return map[r][c]; } void Cal(int *len, int arr[]) { int ed = 0, cnt = 0; for (int i = 0; i <= 100; i++) if (arr[i]) { tmp[ed].num = i; tmp[ed++].cnt = arr[i]; } sort(tmp, tmp + ed, com); for (int i = 0; i < ed; i++) { arr[cnt++] = tmp[i].num; arr[cnt++] = tmp[i].cnt; } (*len) = cnt; } void CalR() { int C_ = C; int len_map[MXSIZE] = { 0, }; for (int i = 0; i < R; i++) { int cnt = 0; int tmp_arr[MXSIZE] = { 0 }; for (int j = 0; j < C; j++) if (map[i][j]) tmp_arr[map[i][j]]++; Cal(&cnt, tmp_arr); cnt = cnt > 100 ? 100 : cnt; for (int j = 0; j < cnt; j++) map[i][j] = tmp_arr[j]; len_map[i] = cnt; C = cnt > C ? cnt : C; } for (int i = 0; i < R; i++) for (int j = len_map[i]; j < C; j++) map[i][j] = 0; } void CalC() { int R_ = R; int len_map[MXSIZE] = { 0, }; for (int i = 0; i < C; i++) { int cnt = 0; int tmp_arr[MXSIZE] = { 0 }; for (int j = 0; j < R; j++) if (map[j][i]) tmp_arr[map[j][i]]++; Cal(&cnt, tmp_arr); cnt = cnt > 100 ? 100 : cnt; for (int j = 0; j < cnt; j++) map[j][i] = tmp_arr[j]; len_map[i] = cnt; R = cnt > R ? cnt : R; } for (int i = 0; i < C; i++) for (int j = len_map[i]; j < R; j++) map[j][i] = 0; } int main(void) { cin >> r >> c >> k; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) cin >> map[i][j]; r--; c--; R = C = 3; int dab; for (dab = 0; dab<=101; dab++) { if (dab == 101 || checkdab() == k) break; if (R >= C) CalR(); else CalC(); } cout << (dab > 100 ? -1 : dab) << endl; return 0; } | cs |
'Algorithms > SIMULATION' 카테고리의 다른 글
[벡준] 3954 - Brainf**k 인터프리터 (2) | 2019.10.09 |
---|---|
[백준] 17144 - 미세먼지 안녕! (2) | 2019.04.21 |
[백준] 17143 - 낚시왕 (4) | 2019.04.21 |
[백준] 12793 - 블록 게임 (0) | 2019.04.13 |
[백준] 13337 - 트럭 (0) | 2019.04.12 |