일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- codility
- directx
- 그리디 알고리즘
- OS
- DirectX 12
- 디자인패턴
- 파일시스템 구현
- 프로그래머스
- Direct12
- 그리디알고리즘
- 백준
- 멀티쓰레드
- 다이나믹프로그래밍
- 쓰레드
- 알고리즘
- I/O장치
- 컨디션 변수
- 병행성 관련 오류
- 타입 객체
- DirectX12
- 렌더링 파이프라인
- 자료구조
- 다이나믹 프로그래밍
- 락
- 영속성
- 병행성
- 동적계획법
- 스케줄링
- 멀티프로세서
- 운영체제
Archives
- Today
- Total
기록공간
비밀지도 (프로그래머스) 본문
반응형
이진수로 변환하는 방법만 안다면 어렵지 않게 풀 수 있는 문제이다.
이진수 변환에는 쉬프트 연산을 사용하였다. 예를 들어 9를 이진수로 변환한다고 하자. 9의 이진수는 1001이다. (전체 이진수 크기 - 1) 부터 시작한다.
9(1001) >> 3 --> 0001 (1번째 위치의 이진수 값은 1이다)
9(1001) >> 2 --> 0010 (2번째 위치의 이진수 값은 0이다)
다음과 같이, 쉬프트 연산(<<, >>)을 하면 맨 왼쪽 자리에 구하고자 하는 위치의 이진수의 값을 알 수 있게된다. 이
작업을 쉬프트 연산을 0으로 할때까지 반복하면 전체 이진수 값을 구할 수 있게된다.
여기서는 맵의 크기로 n이 주어지기 때문에 n크기에 맞는 이진수 값을 만들어야 한다. 그렇기 때문에 n - 1부터 0까지 반복하며 쉬프트 연산을 해주면 알맞은 이진수값을 만들 수 있다.
특정 위치의 이진수 값이 1인 경우에는 '#', 0인 경우에는 ' ' 공백이 와야 하므로 이진수 변환시 1, 0 대신 '#'과 ' '을 문자열로 넣어주면 된다.
코드는 다음과 같다.
#include <string>
#include <vector>
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)
{
string tmpStr; // 답으로 입력될 문자열
// 지도 크기 - 1 부터 0까지 반복하여 이진수를 찾는다.
for(int j = n - 1; j >= 0; --j)
{
// 쉬프트 연산을 사용하여
// 첫번째 지도 정보의 이진수 값에 대한 알맞은 문자를 찾는다.
char c = arr1[i] >> j & 1 ? '#' : ' ';
// 첫번째 지도 정보의 문자가 ' '이여도
// 두번째 지도 정보의 문자가 '#'이라면 문자는 '#'이 와야 한다.
if(arr2[i] >> j & 1) c = '#';
tmpStr += c; // 알맞은 문자를 문자열에 입력한다.
}
answer.push_back(tmpStr);
}
return answer;
}
반응형
'Algorithm > 문제' 카테고리의 다른 글
라면공장 (프로그래머스) (0) | 2020.05.20 |
---|---|
타일 장식물 (프로그래머스) (0) | 2020.05.19 |
크레인 인형뽑기 게임 (프로그래머스) (0) | 2020.05.16 |
베스트앨범 (프로그래머스) (0) | 2020.05.11 |
위장 (프로그래머스) (0) | 2020.05.11 |
Comments