반응형
포인트
- 배열을 잘 구현을 할 수 있는가? 숫자를 세는 방법을 cnt[] 배열을 이용하여 값으로 하는 방법
- 정렬 방법을 잘 생각하면 간단하게 해결할 수도 있다.
- 구하고자 하는 바를 안다면 잘 구할실 수 있습니다. 전체 데이터를 셋팅을 하고 잘 살펴보시면 됩니다. 천천히 급하다가 구현 부분 놓치니까요
- 문제의 익숙해지는 것이 중요합니다. 모르면 답을 보는 것도 방법 입니다.
🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다.
c++/cpp
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int n, m, k, answer;
int map[101][101];
int cnt[101];
void sorting() {
int a = 0; // 시간
int x = 3; // 높이
int y = 3; //너비
while (1) {
if (map[n][m] == k) { // k를 찾으면 정답을 해당시간으로 하고 종료
answer = a;
return ;
}
if (a > 100) { //100 이상이면 종료
answer = -1;
return ;
}
vector<int> size; // 사이즈를 저장해서 행연산이나 열연산을 하기 위하여
if (x >= y) // 정사각형이거나 세로로긴 형태
{
for (int i = 1; i <= x; i++) {
vector<pair<int, int>> V;
memset(cnt, 0, sizeof(cnt));
for (int j = 1; j <= y; j++) cnt[map[i][j]]++; //값을 센다.
for (int j = 1; j < 101; j++) {
if (cnt[j] == 0) continue; // 카운트한 수가 0이면 0
V.push_back(make_pair(cnt[j], j)); //pair 로 만드어서
}
sort(V.begin(), V.end()); //정렬
for (int j = 1; j <= y; j++) map[i][j] = 0;
int index = 1;
for (auto ele : V) {
map[i][index++] = ele.second; //연산자 주위할 것
map[i][index++] = ele.first;
}
size.push_back(--index); //특히 이 부분
}
sort(size.begin(), size.end());
y = size.back();
} else // 가로로 더 긴꼴
{
for (int i = 1; i <= y; i++) {
vector<pair<int, int>> V;
memset(cnt, 0, sizeof(cnt));
for (int j = 1; j <= x; j++) cnt[map[j][i]]++;
for (int j = 1; j < 101; j++) {
if (cnt[j] != 0) {
V.push_back(make_pair(cnt[j], j));
}
}
sort(V.begin(), V.end());
for (int j = 1; j <= x; j++) map[j][i] = 0;
int index = 1;
for (auto ele : V) {
map[index++][i] = ele.second;
map[index++][i] = ele.first;
}
size.push_back(--index);
}
sort(size.begin(), size.end()); // 사이즈 정렬
x = size.back(); // 끝값을 가져온다.
}
a+=1;
}
}
int main(void) {
cin >> n >> m >> k;
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
cin >> map[i][j];
}
}
if (map[n][m] == k) {
answer = 0;
cout << answer << endl;
return 0;
}
sorting();
cout << answer << endl;
return 0;
}
python
r, c, k = map(int, input().split())
r -= 1
c -= 1
data = [[0] * 100 for _ in range(100)]
def calc() -> int:
"""
r연산과 c 연산을 지속적으로 하는 함수
:rtype: int
"""
time = 1
x = 3
y = 3
while time <= 100:
if x >= y:
# R 연산
max_len = 0
for row in range(x):
counter = dict()
v = []
for col in range(y):
if data[row][col] == 0:
continue
counter[data[row][col]] = counter.get(data[row][col], 0) + 1
data[row][col] = 0
for key, value in counter.items():
v.append([key, value])
v.sort(key=lambda x: (x[1], x[0]))
index = 0
for ele1, ele2 in v:
data[row][index] = ele1
index += 1
data[row][index] = ele2
index += 1
max_len = max(max_len, index)
y = max_len
else:
max_len = 0
for col in range(y):
counter = dict()
v = []
for row in range(x):
if data[row][col] == 0:
continue
counter[data[row][col]] = counter.get(data[row][col], 0) + 1
data[row][col] = 0
for key, value in counter.items():
v.append([key, value])
v.sort(key=lambda x: (x[1], x[0]))
index = 0
for ele1, ele2 in v:
data[index][col] = ele1
index += 1
data[index][col] = ele2
index += 1
max_len = max(max_len, index)
x = max_len
if data[r][c] == k:
return time
time += 1
return -1
for i in range(3):
temp = list(map(int, input().split()))
for j in range(3):
data[i][j] = temp[j]
result = 0
if data[r][c] == k:
print(0)
else:
result = calc()
print(result)
반응형
'알고리즘' 카테고리의 다른 글
[알고리즘] 원판 돌리기 (0) | 2021.04.14 |
---|---|
[알고리즘] Deepest Leaves Sum (0) | 2021.04.11 |
[알고리즘] 등산로 조성 (0) | 2021.04.09 |
[알고리즘] 디저트 카페 (0) | 2021.04.09 |
[알고리즘] Determine if String Halves Are Alike (0) | 2021.04.07 |
댓글