#이진수 #or연산 #and연산 #xor연산
코딩테스트 연습 - [1차] 비밀지도
비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다
programmers.co.kr
더보기
![](https://blog.kakaocdn.net/dn/uiFH0/btqUL99hOl6/LmsDP6YEiRXGGL25K0spS1/img.png)
![](https://blog.kakaocdn.net/dn/cWzLPf/btqUBxcCLh9/9kRAP7bY5mlFu22pX9jO6k/img.png)
![](https://blog.kakaocdn.net/dn/bVYjOX/btqUJYghgpd/hs7KrYT1dOQ4cgqLwzWPtk/img.png)
![](https://blog.kakaocdn.net/dn/GBALc/btqUM9BoP5K/pgN1YoQA6FVJUHbzhgjHi0/img.png)
![](https://blog.kakaocdn.net/dn/bWZQ1P/btqUODbawfl/eW2emfF6vXrvEyfWYeyQv1/img.png)
방법 1. for문으로
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
vector<string> answer;
string map_count[16];
int temp1 = 0, temp2 = 0;
for(int i = 0; i < n; i++){
temp1 = arr1[i];
while(arr1[i] > 0){
map_count[i] += to_string(arr1[i] % 2);
arr1[i] /= 2;
}
if(map_count[i].size() < n) map_count[i] += '0';
reverse(map_count[i].begin(), map_count[i].end());
answer.push_back(map_count[i]);
}
return answer;
}
방법 2. STL bitset 활용
#include <string>
#include <vector>
#include <bitset>
using namespace std;
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
vector<string> answer;
int count = 0, sum = 0;
string arr1_temp = " ", arr2_temp = " ";
string check_arr = " ",arr = "", space = " ";
for(int i = 0; i < n; i++){
arr1_temp = bitset<16>(arr1[i]).to_string();
arr2_temp = bitset<16>(arr2[i]).to_string();
sum = stoi(arr1_temp) + stoi(arr2_temp);
check_arr = to_string(sum);
for(int j = 0; j < n; j++){
if(check_arr.size() == n){
if(check_arr[j] == '1' || check_arr[j] == '2') arr += '#';
else arr += " ";
}else{
++count;
if(count == 1) arr += " ";
if(check_arr[j] == '1' || check_arr[j] == '2') arr += '#';
else {
if(j != n - 1) arr += " ";
}
}
}
answer.push_back(arr);
count = 0;
arr = "";
}
return answer;
}
![](https://blog.kakaocdn.net/dn/uiFH0/btqUL99hOl6/LmsDP6YEiRXGGL25K0spS1/img.png)
3차
#include <string>
#include <vector>
#include <bitset>
using namespace std;
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
vector<string> answer;
int count = 0, sum = 0;
string arr1_temp = " ", arr2_temp = " ";
string check_arr = " ",arr = "", space = " ";
for(int i = 0; i < n; i++){
arr1_temp = bitset<16>(arr1[i]).to_string();
arr2_temp = bitset<16>(arr2[i]).to_string();
sum = stoi(arr1_temp) + stoi(arr2_temp);
check_arr = to_string(sum);
for(int j = 0; j < n; j++){
if(check_arr.size() == 1 && check_arr[j] == '1'){
for(int z = 0; z < n; z++){
arr += " ";
if(z == n - 1){
arr += '#';
break;
}
}
}else{
if(check_arr.size() == n){
if(check_arr[j] == '1' || check_arr[j] == '2') arr += '#';
else arr += " ";
}else{
++count;
if(count == 1){
for(int k = check_arr.size(); k < n; k++){
arr += " ";
}
}
if(check_arr[j] == '1' || check_arr[j] == '2') arr += '#';
else {
if(j != n - 1) {
arr += " ";
break;
}
}
}
}
}
answer.push_back(arr);
count = 0;
arr = "";
}
return answer;
}
![](https://blog.kakaocdn.net/dn/cWzLPf/btqUBxcCLh9/9kRAP7bY5mlFu22pX9jO6k/img.png)
4차
#include <string>
#include <vector>
#include <bitset>
using namespace std;
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
vector<string> answer;
long long count, sum;
string arr1_temp = " ", arr2_temp = " ";
string check_arr = " ",arr = "", space_check = " ";
for(int i = 0; i < n; i++){
arr1_temp = bitset<16>(arr1[i]).to_string();
arr2_temp = bitset<16>(arr2[i]).to_string();
sum = stoi(arr1_temp) + stoi(arr2_temp);
check_arr = to_string(sum);
for(int j = 0; j < check_arr.size(); j++){
if(check_arr.size() == 1){
for(int k = 0; k < n; k++){
if(k == n - 1) arr += "#";
else arr += " ";
}
}else{
if(check_arr[j] == '1' || check_arr[j] == '2' ) arr += "#";
else arr += " ";
}
}
if(check_arr.size() == n) answer.push_back(arr);
else{
for(int z = arr.size(); z < n; z++){
space_check += " ";
}
space_check += arr;
answer.push_back(space_check);
}
arr = "";
space_check = "";
}
return answer;
}
![](https://blog.kakaocdn.net/dn/bVYjOX/btqUJYghgpd/hs7KrYT1dOQ4cgqLwzWPtk/img.png)
> 비효율적인 듯 보여서 코드 갈아엎음
![](https://blog.kakaocdn.net/dn/GBALc/btqUM9BoP5K/pgN1YoQA6FVJUHbzhgjHi0/img.png)
![](https://blog.kakaocdn.net/dn/bWZQ1P/btqUODbawfl/eW2emfF6vXrvEyfWYeyQv1/img.png)
✍ 문제 해설
처음에 어렵게 접근해서 풀이가 오래걸렸습니다.
하나하나 이진수로 변환해주는 방법이나 bitset을 사용한 후 "#"과 " "으로 변환해보았으나 코드가 비효율적이었습니다.
다시 처음으로 돌아가 접근 방법부터 바꿨습니다.
어렵게 말고, 쉽게 접근해보자.
그 후, 비트 연산자를 적용하자 바로 풀렸습니다.
#include <stdio.h>
int main()
{
unsigned char num1 = 1; // 0000 0001
unsigned char num2 = 3; // 0000 0011
printf("%d\n", num1 & num2); // 0000 0001: 01과 11을 비트 AND하면 01이 됨
printf("%d\n", num1 | num2); // 0000 0011: 01과 11을 비트 OR하면 11이 됨
printf("%d\n", num1 ^ num2); // 0000 0010: 01과 11을 비트 XOR하면 10이 됨
return 0;
}
🌱 정답코드
reference
C 언어 코딩 도장: 23.1 비트 AND, OR, XOR 연산자 사용하기
이제 비트 연산자를 사용하여 값을 계산해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요. a & b a | b a ^ b bitwise_and_or_xor_operator.c #include int main() { unsigned char num1 = 1; // 0000 00
dojang.io
'OLD_알고리즘 > Programmers - 알고리즘' 카테고리의 다른 글
Programmers ] Level 2 - N개의 최소공배수 (0) | 2021.02.01 |
---|---|
Programmers ] 🔁Level 1 - 실패율 (0) | 2021.01.26 |
Programmers ] Level 1 - 예산 (0) | 2021.01.25 |
Programmers ] Level 1 - 완주하지 못한 선수 (0) | 2021.01.22 |
Programmers ] Level 1 - 체육복 (0) | 2021.01.19 |
댓글