Programers : [1차] 비밀지도

김정욱·2021년 1월 20일
0

Algorithm - 문제

목록 보기
53/249

[1차] 비밀지도

  • 최초 정답을 풀 때에는 이진화 과정을 거쳐 각각 배열에 표시한 후 || 연산을 통해 정답을 추출함
  • 처음에 vector[i].resize(n)을 한 후 vector[i].push_back()을 하는 바보같은 행동을 함
    (이미 0으로 초기화 해서 생성 해놓고 그 뒤에 push하는 바보같은 행동;) --> 이미 생성했으니 인덱스로 접근!
  • 문제는 풀었지만 매우 직관적인 방법으로 풀어 코드가 길었다.

  • 최적의 코드를 보고 느낀 것은 숫자와 이진화가 나오면 비트연산이 매우 효율적으로 쓰일 수 있다는 것이다.
  • 비트연산 중 |(OR)와 쉬프트 연산 중 >> 1를 이용해서 매우 과정을 줄일 수 있었다.

코드

[ 나의 코드 ]

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

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    vector<vector<int>> answer1,answer2;

    /* arr1부터 이진화하여 answer1이라는 배열에 그리기 */
    answer1.resize(n);
    for(int i=0;i<n;i++)
    {
        int j=0;
        answer1[i].resize(n,0);
        int num = arr1[i];
        while(num != 0)
        {
            answer1[i][j++]=num%2;
            num=num/2;
        }
        reverse(answer1[i].begin(), answer1[i].end());
    }

    /* arr2도 이진화하여 answer2이라는 배열에 그리기 */
    answer2.resize(n);
    for(int i=0;i<n;i++)
    {
        int j=0;
        answer2[i].resize(n,0);
        int num = arr2[i];
        while(num != 0)
        {
            answer2[i][j++]=num%2;
            num=num/2;
        }
        reverse(answer2[i].begin(), answer2[i].end());
    }

    /* 두 배열로 정답 추출 */
    answer.resize(n);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(answer1[i][j] == 1 || answer2[i][j] == 1)
            {
                answer[i].push_back('#');
            }else{
                answer[i].push_back(' ');
            }
        }
    }
    return answer;
}

[ 최적 코드 ]

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

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    for(int i=0;i<n;i++)
    {   
        /* | 연산으로 해당 과정을 축약 가능! */
        arr1[i] = arr1[i] | arr2[i];
        string ans = "";
        for(int j=0;j<n;j++)
        {
            /* 해당 값을 2로나눈 나머지가 0이면 --> 2진수로 그 자리가 0이면 */
            if(arr1[i]%2 == 0) ans = ' ' + ans;
            else ans = '#' + ans;
            /* 오른쪽으로 1비트 밀어서 다음 비트로 설정 */
            arr1[i] = arr1[i] >> 1;
        }
        answer.push_back(ans);
    }
    return answer;
}
profile
Developer & PhotoGrapher

0개의 댓글