[C++/프로그래머스] 비밀지도

다곰·2022년 10월 20일
0

우당탕탕 코테준비

목록 보기
10/98

✅ LV.1

📌 2018 KAKAO BLIND RECRUITMENT 1차

✏️ 솔루션

  1. arr 에 저장된 값을 비트화할 때는 bitset 사용
  2. arr1arr2 비트화 이후 두 개 모두 1 일 때만 최종 s# 처리하고 나머지는 공백 처리
  3. n 번 반복하는데 한바퀴 돌 때마다 answer 에 추가

✏️ 최종 코드

#include <string>
#include <vector>
#include <bitset>

using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;

    for(int i=0;i<n;i++) {
        bitset<16> b1(arr1[i]);
        bitset<16> b2(arr2[i]);
        string str1=b1.to_string();
        string str2=b2.to_string();
        
        string s="";
        for(int j=16-n;j<16;j++) {
            if(str1[j]=='1'||str2[j]=='1') s+="#";
            else s+=" ";
        }
        answer.push_back(s);
    }


    return answer;
}

✏️ 아쉬운 부분

  1. 최종 코드는 변수 선언이 너무 많아서 비효율적이라는 판단
  2. 비트연산을 사용해야하는데 for문으로 밀어버림
  3. 이중 for문 사용하는 것도 그렇고 bitset 사용하면서 자릿수를 16 으로 고정하면서 메모리 낭비하는 느낌
  4. 형변환 남발

✏️ 개선 솔루션

  1. arr1arr1arr2 의 비트연산 결과 저장 ➡️ int 형에서 곧바로 비트연산 가능
  2. 각 자리가 0 인지 1 인지 체크할 때, for 문 사용하는 것이 아니라 비트연산자 >> shift 사용

🔗 [C++] 비트연산

✏️ 개선 코드

#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++){
        arr1[i] = arr1[i]|arr2[i];
        string ans = "";
        for(int j = 0; j<n; j++){
            if(arr1[i] % 2 == 0) ans = " " + ans;
            else ans = "#" + ans;
            arr1[i] = arr1[i] >> 1;
        }
        answer.push_back(ans);
    }
    return answer;
}
profile
다교미의 불꽃 에러 정복기

0개의 댓글