본문 바로가기
알고리즘 부셔버렷/ProblemSolving

[프로그래머스] 1차 비밀지도 (문제 설명, 해결 과정, 코드 전문, c++)

by Unagi_zoso 2022. 5. 29.

 

  문제 설명

 

 

본 문제는 프로그래머스의 1차 비밀지도 문제입니다.  문제가 간결해  프로그래머스에서 인용해왔습니다.

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

 

 

 

 

  해결 과정

 

정답으로 반환할 배열 전체를 공백으로 두자. 이는 배열 속 모든 값이 0임을 의미하기도 합니다.

지도1, 지도2 둘 중 하나라도 벽(1)이면 벽(1)이고 지도1, 지도2 두 개 다 공백(0)이면 공백(0).

이는 비트 연산자 |(논리합)과 같습니다. 두 지도의 한층마다 비트연산을 통해 값을 저장합니다.

전체공백 상태의 반환 배열을 채우기 위해 비트연산 값이 저장된 배열을 순회합니다. 

한 층 한 층 반환 배열을 채우기 위해 v_idx가 사용되었고 한 층의 맨 끝에서부터 문자를 바꾸는데,

비트연산 값을 2로 나누어 1이면 #으로 0이 나오면 다음 칸으로 이동합니다. 

우리는 시작부터 전체를 0으로 만들고 모든 층의 맨 마지막 칸부터 문자를 바꾸기에 

한 층의 길이가 5인데 이진수의 값이 101(2)인 경우 접근하기 복잡한 앞의 두자리는 건드리지 않아도 됩니다.

 

 

 

  코드 전문

 

 

#include <string>
#include <vector>

using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer(n);
    vector<int> bit_sum_vec;
    
    for (string& s : answer)
    {
        for (auto cnt = 0; cnt < n; cnt++)
        {
            s += " ";
        }
    }

    for (int i = 0; i < arr1.size(); i++)
    {
        bit_sum_vec.emplace_back(arr1[i] | arr2[i]);
    }
    
    int v_idx = 0;
    for (auto b_sum : bit_sum_vec)
    {
        
        int s_idx = 0;
        while (b_sum > 0)
        {
            if (b_sum % 2 == 1)
            {
                // (answer[v_idx])[n-1-s_idx] = {'#'}; success 
                answer[v_idx].replace(n-1-s_idx, 1, "#");  // success using replace()
                // .replace(answer[v_idx].rbegin(), answer[v_idx].rend(), "#"); fail
            }
            b_sum /= 2;
            s_idx++;
        }
        v_idx++;
    }
    return answer;
}

 

 

 

 

  느낀 점 (잡설 97% , 배운점 3%(많은 편))

 

 

더보기

쉽지 않네요. replace()함수를 통하여 맨 뒤에서부터 문자를 바꾸려했는데.

인자로 reverse iteratior를 사용하니 오류가 떴습니다. 하는 수 없이 인덱스를 사용하였습니다.

다른 분들의 풀이를 보니 string 연산을 a = b + a 같은 형식으로도 사용하셨습니다.

지금까지 append처럼 새로운 문자가 뒤에 붙는 역할인줄만 알았는 데 정말 잘 배웠습니다.

비트 연산자를 사용해볼 수 있어서 유익했습니다. 처음에 표같은게 나오길래 백트래킹 문제일려나 기대를 했습니다.

아쉽게도 인생 첫 백트래킹 문제는 다음으로 미뤄야할 것 같습니다.

 

 

 

 

 

 

긴 글 읽어주셔서 감사합니다. 

부족한 점이 있다면 부디 알려주시면 감사하겠습니다.

 

댓글