비밀지도

NJW·2021년 8월 23일
0

코테

목록 보기
71/170

들어가는 말

두 지도를 겹쳐서 새로운 지도를 만드는 문제이다. 십진수가 입력되면 이를 이진수로 바꾸어서 1이 하나라도 나오면 #을 아니면 공백을 출력하는 것이다.
이거 내가 풀었다. 물론 제일 쉬운 문제라고 하지만, 쨋든 내가 스스로 풀었다!!!! 아까 다트 던지기가 많이 쓰라렸나 보다. 후후... 아하하하하하하하하하하하하하핳, 내가 풀었다!!! 내가 풀었다고!!! 동네방네 내가 푼 코드를 자랑하고 싶지만, 꾹 참았다. 짱 신나.

코드 설명

일단 십진수를 이진수로 바꿔줘야 한다 생각했다. 그러기 위해서 십진수를 2로 나누어서 나머지(0 or 1)를 찾은 다음에 둘 중 하나가 1이라면 #을 둘 다 0이라면 공백을 문자열에 추가해주었다. 다음 수를 2로 나눠서 이를 총 n번 반복해줬다.
reverse를 취해주었는데, 왜냐하면 비트는 오른쪽에서 왼쪽으로 읽기 때문이다.
만들어진 문자열을 문자열 벡터 answer에 넣어주고 문자열을 초기화시켜준 뒤에 이를 n번 반복하면 된다.

코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    int num1, num2;
    int mod1, mod2;
    string s;
    
    for(int i = 0; i < n; i++){
        num1 = arr1[i];
        num2 = arr2[i];
        for(int j = 0; j < n; j++){
            mod1 = num1%2;
            mod2 = num2%2;
            
            mod1 | mod2 ? (s=s+'#') : (s=s+' ');

            num1 = num1/2;
            num2 = num2/2;
        }
        reverse(s.begin(), s.end());
        answer.push_back(s);
        s = "";
    }
    return answer;
}

P.s

나는 직접 이진수를 구해주었지만, 굳이 그럴 필요 없이 두 수 사이에 (|)을 사용하면 되는 걸 알았다. 사실, 비트 연산자가 많이 약해서 십진수에도 사용될 수 있을 거라고 생각하지 못했다(나는 0아니면 1만 비교할 수 있는 줄...). 괜히 계산을 늘인 거 같아 머쓱해졌지만, 뭐... 새로 하나 배웠으니까. 게다가 내 손으로 직접 풀었다고!!! 후후... 기분이 좋다.
아, 그리고 굳이 reverse를 쓰지 않아도 되는 방법을 알았다. s = "#" + s이렇게 해준는 것. 하지만, 이렇게 하면 수행 시간 초과가 된다.

profile
https://jiwonna52.tistory.com/

0개의 댓글