본문 바로가기
SWE/코테

[SW Expert Academy] #1240 단순 2진 암호코드 *

by S나라라2 2019. 2. 21.
반응형

어렵다기보단 걍 좀 귀찮게? 까다롭게? 하는 문제다.

근데 나는 처음에 틀렸다.

사소한 거 놓치지 말자!!! 삼성 코테는 구현 문제에서 사소한 부분을 놓치면 문제를 못풀게 된다.



*0~9 모든 숫자 8자리의 맨 뒷자리는 1로 끝나므로 뒤에서부터 확인하면 쉽다.



#include <iostream>
#include <string.h> // malloc
#include <string> // cin>>str

using namespace std;

int N, M; // N개의 줄, M개의 배열
int arr_useful[9] = { 0, }; // 1~8개

int code[10] = {0b00001101,0b00011001,0b00010011,0b00111101,0b00100011,  // 0~4
			    0b00110001,0b00101111,0b00111011,0b00110111,0b00001011}; // 5~9

int main(void) {

	int tc;
	cin >> tc;
	for (int i = 1; i <= tc; i++) {

		// 결과값
		int sum = 0;
		int sum_10 = 0;

		// 입력받기
		cin >> N >> M;
		string str;
		int checkdone = 0;
		int lastptr = 0;
		for (int r = 0; r < N; r++) {// row
			cin >> str;

			if (checkdone == 2) {  // 이미 암호 검사 끝냈음
				continue;
			}
			else if (checkdone == 0) {
				for (int c = M - 1; c >= 0; c--) { // colomn
					if (str[c] == '1') {  // 1. 가장 끝자리 1의 위치를 저장하기
						lastptr = c;
						checkdone = 1;
						break;
					}
				}
			}

			// 2. lastptr에서부터 7개씩 확인
			if (checkdone == 1) {
				int num_idx = 8;
				for (int c = lastptr; c >= 0; c = c - 7) {
					int num = 0;
					for (int k = 0; k < 7; k++) {
						num = num | ((str[c - k] - 48) << k); // 7개 칸 숫자를 합쳐서 하나로 만들기
					}
					// 3. 7개 숫자와 0~9 암호코드 비교해서 무슨 숫자인지 arr_useful 에 저장
					for (int code_num = 0; code_num < 10; code_num++) {
						if (num == code[code_num]) {
							arr_useful[num_idx] = code_num;
							num_idx--;
							break;
						}
					}
					if (num_idx == 0) {
						break;
					}
				}
				// 4. 정상코드인지 확인
				
				for (int k = 1; k <= 8; k++) {

					sum += arr_useful[k];
					if (k % 2 != 0) { // 홀수번호
						sum_10 += arr_useful[k] * 3;
					}
					else {
						sum_10 += arr_useful[k];
					}
				}

				checkdone = 2;
			}
		}
		// 출력
		if (sum_10 % 10 == 0) { // 10의 배수
			cout << "#" << i << ' ' << sum << endl;
		}
		else {
			cout << "#" << i << " 0" << endl;
		}

		// 초기화
		memset(arr_useful, 0, sizeof(arr_useful));
	}

	return 0;
}

반응형