[백준] 1076_저항 C++
in Study on Coding Test
enum과 swtich문을 활용해보려다 해시함수를 공부하게 된 문제
정답제출코드
#include <iostream>
#include <cmath>
using namespace std;
constexpr unsigned int HashCode(char* str)
{
return str[0] ? static_cast<unsigned int>(str[0]) + 0xEDB8832Full * HashCode(str + 1) : 8603;
}
int retColor(char *color)
{
switch (HashCode(color))
{
case HashCode("black"):
return 0;
break;
case HashCode("brown"):
return 1;
break;
case HashCode("red"):
return 2;
break;
case HashCode("orange"):
return 3;
break;
case HashCode("yellow"):
return 4;
break;
case HashCode("green"):
return 5;
break;
case HashCode("blue"):
return 6;
break;
case HashCode("violet"):
return 7;
break;
case HashCode("grey"):
return 8;
break;
case HashCode("white"):
return 9;
break;
default:
return -1;
break;
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
char a[10], b[10], c[10];
cin >> a;
cin >> b;
cin >> c;
long long ans = 0;
ans += retColor(a) * 10;
ans += retColor(b);
ans *= (long long)pow(10, retColor(c));
cout << ans;
return 0;
}
브론즈 문제로 쉬운 문제이다.
사실 if문을 이용하면 쉬운 문제이지만,
실전에서는 if문을 쓰기보다 이런 경우는 enum-switch 구조를 많이 사용한다고 해서
이를 시도해보기로 하였다.
제일 고민했던 부분이
입력에서는 string을 입력받는데 이를 어떻게 Colors로 캐스팅을 할까를 고민했다.
왜냐하면, swtich 문에서는
switch (color)
{
case 1:
...
}
여기서 color는 int 형식이어야 하지, string 으로 받을 수 없기 때문이다.
해답은 해시함수에 있었다.
참고링크에 따르면
해시함수를 이용해서 문자열을 상수화 시켜서 문제를 풀 수 있었다.
다만, constexpr라는 처음보는 것 때문에 컴파일 에러가 10번 넘게 발생했다.
해시함수를 다룰 때 필요한 것같은데.. 이것에 대해 좀 더 공부해봐야겠다.
브론즈 문제였지만 굉장히 강력하게 기억에 남을 문제였던 것 같다.