일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 이분탐색
- 정렬
- priority_queue
- 분할정복
- N과M
- DP
- 유클리드호제법
- 최소공배수
- 오블완
- 백트래킹
- 에라토스테네스의 체
- int
- Sort
- C++
- 배열
- 문자열
- 알고리즘
- 티스토리챌린지
- 깊이우선탐색
- 우선순위큐
- 프로그래머스
- 다이나믹프로그래밍
- vector
- 그래프
- map
- 백준
- Set
- BFS
- stoi
- DFS
- Today
- Total
안녕 세상아,
[SWEA/c++] 1240. [S/W 문제해결 응용] 1일차 - 단순 2진 암호코드 본문
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제를 풀기 위해서는 문제를 이해해야된다. 이해가 잘 안돼서 한참 읽었던 것 같다.
간단하게 설명하면 암호화된 암호문을 숫자로 바꿔서 10의 배수가 맞는지 검증하면 된다.
문제에서 0부터 9까지 수가 암호화된 암호문은 제공해주었다. 나는 비율보다 그냥 7자리 숫자를 그대로 사용하였다. 주의깊게 볼 것은 모든 암호가 1로 끝난다. 이것으로 주어진 입력문을 구분하면 된다.
주어진 입력문은 0과 1로 이루어져있는데 이 중 암호문을 찾기 위해서는 각 행 별로 맨 뒤에서부터 보면서 1을 찾으면 된다. 찾은 1로부터 앞으로 55개를 가면 암호문의 시작이다.
위를 바탕으로 단계를 나눠가면서 풀었다.
1. 우선 주어진 암호문을 배열 형식으로 저장한다.
2. 입력문을 vector에 넣는다.
3. 암호문의 범위를 찾기 위해 맨 뒤 행에서 부터 1을 찾는다.
4. 만약 찾게 되면 해당 행과 열을 각각 x, y에 저장해놓는다.
5. 암호문은 무조건 56자리이기 때문에 아까 찾은 행과 열로 해당 부위를 추출한다. (substr)
6. 56자리로 추출한 암호문에서 실질적인 숫자를 찾아야하기 때문에 다시 7씩 나눠서 숫자를 추출한다. 추출하는 방법은 7자리와 arr[i]를 비교하면 된다.
7. 만약 arr[i]와 같은 암호가 있다면 해당 암호는 숫자로 복호화 해준 후 새로운 vector decoded에 넣어준다.
8. 모두 완료가 되면 decoded 벡터에서 홀수와 짝수를 분리해준 후 문제 조건에 맞춰 10의 배수인지 판별한다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string arr[10] = { "0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011" };
int T;
cin >> T;
for (int test_case = 1; test_case <= T; ++test_case) {
int N, M;
cin >> N >> M;
vector<string> sample(N);
for (int i = 0; i < N; ++i) {
cin >> sample[i];
}
// 1. 암호코드가 포함된 마지막 줄 찾기
int x = -1, y = -1;
for (int i = N - 1; i >= 0; --i) {
for (int j = M - 1; j >= 0; --j) {
if (sample[i][j] == '1') {
x = i;
y = j;
break;
}
}
if (x != -1) break;
}
// 2. 56비트 길이의 암호코드 추출
string code = sample[x].substr(y - 55, 56);
// 3. 7비트씩 끊어 디코딩
vector<int> decoded;
for (int i = 0; i < 56; i += 7) {
string segment = code.substr(i, 7);
bool matched = false;
for (int k = 0; k < 10; ++k) {
if (segment == arr[k]) {
decoded.push_back(k);
matched = true;
break;
}
}
if (!matched) {
cout << "#" << test_case << " 0" << endl;
}
}
// 4. 검증 코드 확인
int sum_odd = 0, sum_even = 0;
for (int i = 0; i < 8; ++i) {
if (i % 2 == 0) {
sum_odd += decoded[i];
} else {
sum_even += decoded[i];
}
}
int totalSum = sum_odd * 3 + sum_even;
if (totalSum % 10 == 0) {
int finalSum = sum_odd + sum_even;
cout << "#" << test_case << " " << finalSum << endl;
} else {
cout << "#" << test_case << " 0" << endl;
}
}
return 0;
}
벡터 말고 배열로 계속 풀고 뭔가 로직도 맞는 것 같은데 자꾸 틀려서...거의 하루 종일 푼 것 같다. 지피티한테 물어봐도 배열로 푼거 문제 없다고 했는데 왜 안되는지 아직도 모르겟다.. 뭔가 배열로 풀어도 맞는 것 같아서 계속 붙잡고있다가 안돼서 바꾼 이 방법...허탈하지만...모르겠다...ㅠ그냥 소질이 없을지도..? 하아...
'SWEA' 카테고리의 다른 글
[SWEA/c++] 2805. 농작물 수확하기 (0) | 2024.11.09 |
---|---|
[SWEA/c++] 1209. [S/W 문제해결 기본] 2일차 - Sum (0) | 2024.10.18 |
[SWEA/c++] 1208. [S/W 문제해결 기본] 1일차 - Flatten (0) | 2024.10.17 |
[SWEA/c++] 1206. [S/W 문제해결 기본] 1일차 (1) | 2024.10.05 |