문제 설명 |
본 문제는 프로그래머스의 1차 비밀지도 문제입니다. 문제가 간결해 프로그래머스에서 인용해왔습니다.
해결 과정 |
정답으로 반환할 배열 전체를 공백으로 두자. 이는 배열 속 모든 값이 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처럼 새로운 문자가 뒤에 붙는 역할인줄만 알았는 데 정말 잘 배웠습니다.
비트 연산자를 사용해볼 수 있어서 유익했습니다. 처음에 표같은게 나오길래 백트래킹 문제일려나 기대를 했습니다.
아쉽게도 인생 첫 백트래킹 문제는 다음으로 미뤄야할 것 같습니다.
긴 글 읽어주셔서 감사합니다.
부족한 점이 있다면 부디 알려주시면 감사하겠습니다.
'알고리즘 부셔버렷 > ProblemSolving' 카테고리의 다른 글
[프로그래머스] 오픈채팅방 (문제 설명, 해결 과정, 코드 전문, c++) (0) | 2022.05.30 |
---|---|
[프로그래머스] 문자열 압축 (문제 설명, 해결 과정, 코드 전문, C++) (0) | 2022.05.30 |
[프로그래머스] 실패율 (문제 설명, 해결 과정, 코드 전문, c++) (0) | 2022.05.29 |
[프로그래머스] 내적 (문제 설명, 해결 과정, 코드 전문, c++) (0) | 2022.05.28 |
[프로그래머스] 음양 더하기 (문제 설명, 해결 과정, 코드 전문, c++) (0) | 2022.05.28 |
댓글