반응형

문제출처

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

 

프로그래머스

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

programmers.co.kr

 

문제풀이

2장의 지도를 겹친 값을 얻기 위해 OR 연산을 사용했다. OR연산을 사용하면 문제에서 원하는 전체 지도를 얻을 수 있다. 이후 '#'(벽)과 ' '(공백)을 찾기 위해서는 비트연산을 사용했다. 예를 들어 전체지도의 값이 10진수로 19이라면 2진수로 10011로 나타낼 수 있다. 2진수로 나타낸 값과 1을 오른쪽으로 시프트 한 값(1<<j)의 AND 연산이 1이라면 벽을 추가하고 이외의 경우 공백을 추가하면 된다.

 

비트연산에 대해 이해가 되지 않는다면 아래글을 참조하자.

https://swjeong.tistory.com/114?category=781121

 

[Bitmask] 비트마스크 기초

Bitmask 컴퓨터는 이진번 관련 연산들을 매우 빠르게 진행할 수 있는데, 이러한 특성들을 사용하여 이진수 표현을 자료구조로 사용하는 기법을 비트마스크라고 합니다. 비트마스크는 자료구조라고는 할 수는 없지..

swjeong.tistory.com

 

10011 & 00001 = 1

10011 & 00010 = 1

10011 & 00100 = 0

10011 & 01000 = 0

10011 & 10000 = 1

즉 answer에는 '##  #'의 값이 들어가게 되는데 이는 뒤에서부터 진행한 결과이므로 결과값을 뒤집어 answer 벡터에 추가해주면 된다.

 

 

소스코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    for (int i=0; i<n; i++) {
        int sumValue = (arr1[i] | arr2[i]);
        string ans = "";
        for (int j=0; j<n; j++) {
            if (sumValue & (1<<j)) ans+="#";
            else ans+=" ";
        }
        reverse(ans.begin(), ans.end());
        answer.push_back(ans);   
    }
    return answer;
}

 

반응형

+ Recent posts