02.[1차]비밀지도

Rio·2020년 10월 13일
0

코딩테스트

목록 보기
2/3
  • 문제 이해

정수 배열 2개를 주어졌을때 비트 연산을 통하여 최종 출력되는 크기 n의 지도를 문자로 해석해 반환하는 문제이다.

  • pseudo code

    1. 두개의 정수 배열을 비트 연산하기
    2. 비트연산한 결과를 문자로 변경하기
    3. 생성된 문자열을 최종 조건에 맞춰 변경하기
    4. 최종 결과 배열에 입력하기
  • 문제점
    지도를 bit로 표기를 하였다. 자리수가 1이면 '#', 0이면 '공백'을 의미한다. 또한 자릿수의 길이는 n이라 주어진다.
    지도의 각각의 줄의 bit연산을 통해 나온 결과를 문자로 변환화는 과정에서 끝의 자리부터 읽다보니 최종 답과 반대로 문자열이 생성이 된다. 이 문자열을 다시 reverse를 해줘야 비로소 최종 원하는 결과값이 나온다.

  • bit연산

    메모리의 효율적인 사용을 위하여 고안된 방법이다.
    bitset의 헤더파일에 존재한다.
    연산 종류로는 &(AND) |(OR) ^(XOR) ~(NOT) >>(right shift) <<(left shift)이 있다.
    여기서 사용된 연산은 | 연산으로, 해당되는 모든 곳을 표시해야하기 때문이다.
    bit는 unsigned로 변수를 생성하면 좋다.

  • reverse()

    string헤더파일에 있는 줄 알았는데 algorithm헤더파일 소속이였다.
    인자로 받는 구간의 요소를 뒤집어준다.
    reverse(vec.begin(),vec.end())

  • 코드

#include <string>
#include <vector>
#include <bitset>
#include <algorithm>
using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    
    vector<string> answer;
    
    for(int i = 0 ; i< arr1.size();i++){
        unsigned int temp =  arr1[i] | arr2[i];
        
        string tmp_answer="";
        
        for(int j = 0 ; j<n;j++){
           
            if(temp % 2 == 1 ){
                tmp_answer += "#";
            }
            else{
                tmp_answer += " ";
            }
            temp = temp>>1;
        }
        reverse(tmp_answer.begin(),tmp_answer.end());
        
        answer.push_back(tmp_answer);
    }
    
    
    
    return answer;
}

- 정리 비트연산에 대해 학습할 수 있었던 문제였다. 비트 연산을 통해서 각 자리의 값을 읽는 것 방법(num%2 ?= 0)도 잘 기억해야겠다. 다른 사람들 코드도 크게 다른 것이 없었다. 문자열을 뒤집는 상황이 종종 발생하는데 reverse()도 잘 기억하고 있어야겠다.
profile
우당탕탕 개발 기록지

0개의 댓글