본문 바로가기
OLD_알고리즘/Programmers - 알고리즘

Programmers ] Level 1 - 비밀지도

by 달승 2021. 1. 25.

#이진수 #or연산 #and연산 #xor연산

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

 

더보기

 

방법 1. for문으로

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    string map_count[16];
    int temp1 = 0, temp2 = 0;
    
    for(int i = 0; i < n; i++){
        temp1 = arr1[i];            
        while(arr1[i] > 0){
            map_count[i] += to_string(arr1[i] % 2);
            arr1[i] /= 2;
        }
        if(map_count[i].size() < n) map_count[i] += '0';
    
        reverse(map_count[i].begin(), map_count[i].end());
        answer.push_back(map_count[i]);
    }
    return answer;
}

 

방법 2. STL bitset 활용

#include <string>
#include <vector>
#include <bitset>
using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    int count = 0, sum = 0;
    string arr1_temp = " ", arr2_temp = " ";
    string check_arr = " ",arr = "", space = " ";
    
    for(int i = 0; i < n; i++){
        arr1_temp = bitset<16>(arr1[i]).to_string();
        arr2_temp = bitset<16>(arr2[i]).to_string();
        
        sum = stoi(arr1_temp) + stoi(arr2_temp);
        check_arr = to_string(sum);
        
        for(int j = 0; j < n; j++){
            if(check_arr.size() == n){
                if(check_arr[j] == '1' || check_arr[j] == '2') arr += '#';
                else arr += " "; 
            }else{
                ++count;
                if(count == 1) arr += " ";

                if(check_arr[j] == '1' || check_arr[j] == '2') arr += '#';
                else {
                    if(j != n - 1) arr += " ";
                }
            }
        }
        answer.push_back(arr);
        count = 0;
        arr = "";
    }
    return answer;
}

 

3차

#include <string>
#include <vector>
#include <bitset>
using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    int count = 0, sum = 0;
    string arr1_temp = " ", arr2_temp = " ";
    string check_arr = " ",arr = "", space = " ";
    
    for(int i = 0; i < n; i++){
        arr1_temp = bitset<16>(arr1[i]).to_string();
        arr2_temp = bitset<16>(arr2[i]).to_string();
        
        sum = stoi(arr1_temp) + stoi(arr2_temp);
        check_arr = to_string(sum);
        
        for(int j = 0; j < n; j++){
            if(check_arr.size() == 1 && check_arr[j] == '1'){
                for(int z = 0; z < n; z++){
                    arr += " ";
                    if(z == n - 1){
                        arr += '#';
                        break;
                    }
                }
            }else{
                if(check_arr.size() == n){
                    if(check_arr[j] == '1' || check_arr[j] == '2') arr += '#';
                    else arr += " "; 
                }else{
                    ++count;
                    if(count == 1){
                        for(int k = check_arr.size(); k < n; k++){
                            arr += " ";
                        }
                    }
                    
                    if(check_arr[j] == '1' || check_arr[j] == '2') arr += '#';
                    else {
                        if(j != n - 1) {
                            arr += " ";
                            break;
                        }
                    }
                }
            }
        }
        answer.push_back(arr);
        count = 0;
        arr = "";
    }
    return answer;
}

 

4차

#include <string>
#include <vector>
#include <bitset>
using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    long long count, sum;
    string arr1_temp = " ", arr2_temp = " ";
    string check_arr = " ",arr = "", space_check = " ";
    
    for(int i = 0; i < n; i++){
        arr1_temp = bitset<16>(arr1[i]).to_string();
        arr2_temp = bitset<16>(arr2[i]).to_string();
        
        sum = stoi(arr1_temp) + stoi(arr2_temp);
        check_arr = to_string(sum);
        
        for(int j = 0; j < check_arr.size(); j++){
        	if(check_arr.size() == 1){
        		for(int k = 0; k < n; k++){
                    if(k == n - 1) arr += "#";
            	    else arr += " ";
                }
        	}else{
        		if(check_arr[j] == '1' || check_arr[j] == '2' ) arr += "#";
            	else arr += " ";
        	}
        }
            
        if(check_arr.size() == n) answer.push_back(arr);
        else{
            for(int z = arr.size(); z < n; z++){
                space_check += " ";
            }
            space_check += arr;
            answer.push_back(space_check);
        }
        arr = "";
        space_check = "";
    }
    return answer;
}

> 비효율적인 듯 보여서 코드 갈아엎음

 

 

 

✍ 문제 해설

 

처음에 어렵게 접근해서 풀이가 오래걸렸습니다.

하나하나 이진수로 변환해주는 방법이나 bitset을 사용한 후 "#"과 " "으로 변환해보았으나 코드가 비효율적이었습니다.

 

다시 처음으로 돌아가 접근 방법부터 바꿨습니다.

어렵게 말고, 쉽게 접근해보자.

 

그 후, 비트 연산자를 적용하자 바로 풀렸습니다.

#include <stdio.h>
 
int main()
{
    unsigned char num1 = 1;    // 0000 0001
    unsigned char num2 = 3;    // 0000 0011
 
    printf("%d\n", num1 & num2);    // 0000 0001: 01과 11을 비트 AND하면 01이 됨
    printf("%d\n", num1 | num2);    // 0000 0011: 01과 11을 비트 OR하면 11이 됨
    printf("%d\n", num1 ^ num2);    // 0000 0010: 01과 11을 비트 XOR하면 10이 됨
 
    return 0;
}

카카오 문제해설 내용 발췌

 

🌱 정답코드

 

 

 

 

 

reference

 

C 언어 코딩 도장: 23.1 비트 AND, OR, XOR 연산자 사용하기

이제 비트 연산자를 사용하여 값을 계산해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요. a & b a | b a ^ b bitwise_and_or_xor_operator.c #include int main() { unsigned char num1 = 1; // 0000 00

dojang.io

 

댓글