문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/17681

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

n개의 2진수를 변환했을때 0이면 공백, 1이면 #으로 암호화 되어있는 지도를 2개 겹쳐서 최종 지도를 획득하는 문제

이때 하나라도 벽이면 벽임

 

문제 풀이법

처음에 내가 푼 풀이법은 2진수로 변환하고, 그 수를 reverse한 후 임시 배열에 값을 저장한 후, 다른 지도도 검사하는 방식으로 문제를 해결했다

답은 맞았지만 여러 풀이를 참고하던 중 비트 연산자를 사용하는 풀이를 발견했다

비트 연산자를 사용하는 풀이라고 하니 or연산자를 사용하면 되는 것을 알 수 있었다

왜 혼자서는 생각하지 못했던거지....

뿐만 아니라 2진수를 구하는 과정에서 맨 뒷자리 부터 구해지기에 reverse함수를 썼지만, 이 풀이에서는 단순히 값을 넣는 과정에서 reverse 처리를 하였다

  • reverse를 사용한 후의 코드 : str += ' ';
  • reverse를 사용하지 않는 코드 : str = ' ' + str;

이런식이면 뒤에서부터 글을 채워 나갈 수 있다

 

비트 연산자를 좀 더 활용할 수 있도록 문제를 풀 때 항상 염두해야겠다

소스 코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> get_2(int num, int n)
{
    vector<int> v;
    
    while (num >= 2)
    {
        v.push_back(num % 2);
        num /= 2;
    }
    v.push_back(num);
    if (v.size() != n)
    {
        int cnt = n - v.size();
        for (int i = 0; i < cnt; i++)
            v.push_back(0);
    }
    reverse(v.begin(), v.end());
    return v;
}

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    int arr[n][n];
    
    for (int i = 0; i < n; i++)
    {
        vector<int> v = get_2(arr1[i], n);
        for(int j = 0; j < n; j++)
        {
            arr[i][j] = v[j];
        }
    }
    
    for (int i = 0; i < n; i++)
    {
        vector<int> v = get_2(arr2[i], n);
        for(int j = 0; j < n; j++)
        {
            if (arr[i][j] == 0)
                arr[i][j] = v[j];
        }
    }
    
    
    for (int i = 0; i < n; i++)
    {
        string str;
        for (int j = 0; j < n; j++)
        {
            if (arr[i][j] == 0)
                str += ' ';
            else
                str += '#';
        }
        answer.push_back(str);
    }
    return answer;
}

 

비트연산자를 사용한 풀이

#include <string>
#include <vector>

using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    
    for (int i = 0; i < n; i++)
    {
        string str;
        arr1[i] = arr1[i] | arr2[i];
        for (int j = 0; j < n; j++)
        {
            if (arr1[i] % 2 == 0)
                str = ' ' + str;
            else
                str = '#' + str;
            arr1[i] = arr1[i] >> 1;
        }
        answer.push_back(str);
    }
    return answer;
}
복사했습니다!