Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- go
- hadoop
- 파이썬
- golang struct
- 백준 12761번
- domain driven develop
- 백준 사이트
- 12761 돌다리
- 정렬
- String 함수
- 백준
- golang
- 자바 디자인패턴
- MongoDB Realm
- 우분투
- 12761번 돌다리
- 고 배열
- 자바 디자인 패턴
- 도메인 주도 개발
- 자바
- 하둡
- flask
- 백준 파이썬
- http 완벽가이드
- 몽고디비 렘
- 백준 12761
- 도메인 주도 개발 시작하기
- 트리 순회
- ddd
- http 개념
Archives
- Today
- Total
개발바닥
BOJ_17140 [ 이차원 배열과 연산 ] 본문
반응형
문제
https://www.acmicpc.net/problem/17140
문제 해결 방법
행과 열 개수를 계속 비교하면서 로직을 수행해야 되기때문에 행의 길이와 열의 길이를 전역 변수로 두고
시뮬레이션이 끝날 때마다 업데이트해주었습니다.
1. 행의 길이 >= 열의 길이
1-1 각 행마다 숫자를 카운트 합니다. ( 입력받을 수 있는 숫자가 100미만이므로 1차원 배열로 선언 후 카운트를 해주었습니다.)
1-2 set 컨테이너를 활용해서 중복되는 숫자를 제거하였습니다.
1-3 해당되는 행에 set에서 꺼내면서 카운트 값도 집어 넣어줍니다.
1-4 길이가 100이 넘으면 break로 빠져 나옵니다.
1-5 행을 작업했기 때문에 열(row)의 길이가 변했으므로 전역 변수 row 최대 길이와 비교 후 값을 업데이트 해줍니다.
2. 열의 길이 > 행의 길이
행 작업과 동일하게 진행합니다.
소스 코드
https://github.com/jokerKwu/BOJ_Algorithm/blob/master/Brute%20force/boj_17140.cpp
#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<set>
#include<string>
using namespace std;
#define MAX 106
int board[MAX][MAX];
int r, c, k,answer=-1;
int len_r, len_c;
typedef pair<int, int> pii; //수의 개수 , 수
bool cmp(pii &a, pii &b) {
if (a.first > b.first)return false;
else if (a.first == b.first) {
if (a.second > b.second)return false;
else return true;
}
else return true;
}
void solve(int type) {
//print();
set<int> tmp;
vector<pii> v_arr;
//모든 행에 대해서 정렬을 수행한다.
if (type == 1) {
for (int i = 1; i <= len_c; i++) {
int arr[MAX];
memset(arr, 0, sizeof(arr));
//각 행에 대해서 값을 다 넣었고
for (int j = 1; j <= len_c; j++) {
if (board[i][j] != 0) {
arr[board[i][j]]++; //숫자 개수를 카운트
tmp.insert(board[i][j]);
}
}
//정렬을 한다. set 컨테이너를 이용해서 중복을 제거한다.
set<int>::iterator iter;
for (iter = tmp.begin(); iter != tmp.end(); iter++) {
v_arr.push_back(make_pair(arr[*iter], *iter));
}
sort(v_arr.begin(), v_arr.end(),cmp);
int index = 1;
for (int j = 1; j <= len_c; j++) board[i][j] = 0;
for (int j = 0; j < v_arr.size(); j++) {
int num_cnt = v_arr[j].first;
int num = v_arr[j].second;
board[i][index++] = num;
if (index > 100) break; //100개를 초과하면 for문을 종료한다.
board[i][index++] = num_cnt;
if (index > 100)break;
}
len_r = max(len_r, index-1); //열에 크기를 업데이트 해준다.
//초기화
tmp.clear();
v_arr.clear();
}
}
//모든 열에 대해서 정렬을 수행한다.
else {
for (int i = 1; i <= len_r; i++) {
int arr[MAX];
memset(arr, 0, sizeof(arr));
for (int j = 1; j <= len_r; j++) {
if (board[j][i] != 0) {
arr[board[j][i]]++;
tmp.insert(board[j][i]);
}
}
//정렬을 한다.
set<int>::iterator iter;
for (iter = tmp.begin(); iter != tmp.end(); iter++) {
v_arr.push_back(make_pair(arr[*iter], *iter));
}
sort(v_arr.begin(), v_arr.end(), cmp);
int index = 1;
for (int j = 1; j <= len_r; j++) board[j][i] = 0;
for (int j = 0; j < v_arr.size(); j++) {
int num_cnt = v_arr[j].first;
int num = v_arr[j].second;
board[index++][i] = num;
if (index > 100) break;
board[index++][i] = num_cnt;
if (index > 100)break;
}
len_c = max(len_c, index - 1);
//초기화
tmp.clear();
v_arr.clear();
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> r >> c >> k;
len_c = 3, len_r = 3;
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
cin >> board[i][j];
}
}
for (int time = 0; time <= 100; time++) {
if (board[r][c] == k) {
answer = time;
break;
}
//행의 개수 >= 열의 개수
if (len_c >= len_r) {
solve(1);
}
//행의 개수 < 열의 개수
else {
solve(2);
}
}
cout << answer << '\n';
return 0;
}
반응형
'[ Algorithm ] > [ BOJ ]' 카테고리의 다른 글
BOJ_17828 [ 문자열 화폐 ] (0) | 2020.04.08 |
---|---|
BOJ_18809 [ 수 찾기 ] (0) | 2020.04.08 |
BOJ_2251 [ 물통 ] (0) | 2020.04.08 |
BOJ_18808 [ 스티커 붙이기] (0) | 2020.04.08 |
BOJ_18809 [ Gaaaaaaaaaarden ] (0) | 2020.04.07 |
Comments