관리 메뉴

기억을 위한 기록들

[프로그래머스 lv 1 ] - [1차] 비밀지도 본문

Coding Test - cpp/String

[프로그래머스 lv 1 ] - [1차] 비밀지도

에드윈H 2021. 9. 13. 20:28

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

 

 

1. 리팩토링 전 : 첫 성공 풀이로, 풀다보니 두개의 지도를 합친vector와 숫자를 '#'로 변환하는 vector 두개로 나눴었는데, 다 푼다음에 다시 보니 vector 두개있을 필요가 없을 거 같아서 리팩토링

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


vector<string> solution( int n, vector<int> arr1, vector<int> arr2 ) {

	vector<string> addedResult;
	//두개의 지도 합치기
	for( int i = 0; i < arr1.size(); i++ )
	{
		string num;
		for( int j = arr1.size() - 1; j >= 0; --j )
		{
			//비트연산으로 출력
			int result = arr1[i] >> j & 1;
			int result2 = arr2[i] >> j & 1;

			//비트연산의 결과 합이 2이라면 1
			if( result + result2 == 2 )
				num += to_string( 1 );
			else
				num += to_string( result2 + result );
		}
		addedResult.push_back( num );
	}

	//합친 지도 그리기
	vector<string> result;
	for( int i = 0; i < addedResult.size(); i++ )
	{
		string numValue;
		string curNum = addedResult[i];

		for( int j = 0; j < curNum.size(); j++ )
		{
			if( curNum[j] == '1' )			
				numValue += '#';			
			else			
				numValue += ' ';			
		}
		result.push_back( numValue );
	}


	return result;
}

 

 

2. 리팩토링 후 

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

vector<string> solution( int n, vector<int> arr1, vector<int> arr2 ) {

	vector<string> result;
	//두개의 지도 합치기
	for( int i = 0; i < arr1.size(); i++ )
	{
		string value;
		for( int j = arr1.size() - 1; j >= 0; --j )
		{
			//비트연산으로 출력
			int result = arr1[i] >> j & 1;
			int result2 = arr2[i] >> j & 1;

			//비트연산의 결과 합이 1이상이면 # 
			value += result + result2 >= 1 ? '#' : ' ';
		}
		result.push_back( value );
	}

	return result;
}