본문 바로가기

개발/알고리즘

프로그래머스 후보키 C++

문제

programmers.co.kr/learn/courses/30/lessons/42890

 

코딩테스트 연습 - 후보키

[["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"],["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","music","2"]] 2

programmers.co.kr

코드

#include <string>
#include <vector>
#include <set>

using namespace std;

bool minimalityDuplicationCheck(vector<int> v, int now)
{
	for (int i = 0; i < v.size(); i++)
	{
		if ((v[i] & now) == v[i])
			return false;
	}

	return true;
}

int solution(vector<vector<string>> relation)
{
	int rowSize = relation.size();
	int colSize = relation[0].size();
	vector<int> ans;

	//(1 << colSize) == 2^colSize == 2^4 == 16
	for (int i = 1; i < (1 << colSize); i++)
	{
		if (minimalityDuplicationCheck(ans, i) == false)
			continue;

		set<string> s;
		for (int j = 0; j < rowSize; j++)
		{
			string cur;
			for (int k = 0; k < colSize; k++)
			{
				//k < 4,
				// (1 << 0) == 2^0 = 1
				// (1 << 1) == 2^1 = 2
				// (1 << 2) == 2^2 = 4
				// (1 << 3) == 2^3 = 8
				if (i & (1 << k))
					cur += relation[j][k];
			}
			//이미 담긴 string은 중복으로 담지않기 위해 set 자료구조 사용
			s.insert(cur);
		}

		//s.size가 rowSize 와 다르면 식별가능하지 않다는 뜻임
		if (s.size() == rowSize)
			ans.push_back(i);
	}

	return ans.size();
}

'개발 > 알고리즘' 카테고리의 다른 글

백준 2343 기타레슨 C++  (0) 2021.04.05
백준 14627번 파닭파닭 C++  (0) 2021.04.04
백준 15922 아우으 우아으이야!! C++  (0) 2021.04.03
백준 16236번 아기 상어 C++  (0) 2021.03.30
백준 14503 로봇 청소기 C++  (0) 2021.03.28