문제
https://programmers.co.kr/learn/courses/30/lessons/17681
코딩테스트 연습 - [1차] 비밀지도
비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다
programmers.co.kr
풀이
- arr1, arr2를 순서대로 각각 이진수로 바꿔줌
- 이진수니까 뒤집어서 정렬
- 각 벡터의 이진수를 비교해서 하나라도 1이면 '#', 둘 다 0이면 ' '
코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
vector<string> answer;
string anan = "";
vector<int> a1;
vector<int> a2;
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
if(arr1[k] % 2 == 1){
a1.push_back(1);
} else{
a1.push_back(0);
}
arr1[k] /= 2;
}
reverse(a1.begin(), a1.end());
for(int i=0;i<n;i++){
if(arr2[k] % 2 == 1){
a2.push_back(1);
} else{
a2.push_back(0);
}
arr2[k] /= 2;
}
reverse(a2.begin(), a2.end());
for(int i=0;i<n;i++){
if(a1[i] == 1 || a2[i] == 1){
anan += '#';
} else{
anan += ' ';
}
}
answer.push_back(anan);
anan = "";
a1.clear();
a2.clear();
}
return answer;
}
시행착오
처음엔 한 번에 이진수로 바꾸고 저장한 벡터를 각각 만드려고 했음
하지만, 숫자 한 개씩 이진수로 바꾸고 바로 비교하는게 메모리적이나 속도적으로 좋았다고 생각함
이진수로 어떻게 바꾸는 코드를 짤 수 있는지 고민함..
첨엔 while문 써서 arr[k]가 0이 되면 종료시키고, n의 크기만큼 부족한 공간을 0으로 채워주는 식으로 코드 짰었는데 for문을 이용하면 0으로 된 이후로 나머지 공간은 0으로 채워짐 ..!!!!
그리고 이진수는 반대로 정렬해야하니까 reverse함수로 반대로 정렬해줌.
'프로그래머스 > Level 1' 카테고리의 다른 글
[프로그래머스/C++] Level 1 제일 작은 수 제거하기 (0) | 2020.07.29 |
---|---|
[프로그래머스/C++] Level 1 문자열 내 마음대로 정렬하기 (0) | 2020.07.29 |
[프로그래머스/C++] Level 1 최대공약수와 최소공배수 (0) | 2020.07.26 |
[프로그래머스/C++] Level 1 x만큼 간격이 있는 n개의 숫자 (0) | 2020.07.26 |
[프로그래머스/C++] LEVEL 1 키패드 누르기(2020 카카오 인턴십) (0) | 2020.07.26 |