BOJ(백준)

[BOJ/C++] 백준 1076 저항

ruming 2024. 7. 19. 14:01

전자 제품에는 저항이 들어간다. 저항은 색 3개를 이용해서 그 저항이 몇 옴인지 나타낸다. 처음 색 2개는 저항의 값이고, 마지막 색은 곱해야 하는 값이다. 저항의 값은 다음 표를 이용해서 구한다.


black 0 1
brown 1 10
red 2 100
orange 3 1,000
yellow 4 10,000
green 5 100,000
blue 6 1,000,000
violet 7 10,000,000
grey 8 100,000,000
white 9 1,000,000,000

예를 들어, 저항의 색이 yellow, violet, red였다면 저항의 값은 4,700이 된다.

입력

첫째 줄에 첫 번째 색, 둘째 줄에 두 번째 색, 셋째 줄에 세 번째 색이 주어진다. 위의 표에 있는 색만 입력으로 주어진다.

출력

입력으로 주어진 저항의 저항값을 계산하여 첫째 줄에 출력한다.

 


 

[풀이]

 값과 곱의 관계를 살펴보면 10의 '값'제곱이 곱이 된다는 걸 알 수 있다. blue의 경우 값이 6이고 곱이 1,000,000이다. 0이 6개이므로 10의 6승이다. 즉 10에 '값'만큼 제곱한 수이다. 저항값을 구하려면 어차피 입력 문자열과 '색' 문자열을 비교해야 한다. 조건문으로 하나하나 비교할 거 아닌 이상 배열에 문자열을 저장해야 할 것이다. 그랬을 때 값과 곱의 관계를 이용하면 2차원 배열을 사용하지 않고 계산할 수 있을 거라 판단했다. '값'이 0에서 시작하므로, '색' 문자열의 인덱스 값을 이용할 수 있다. '곱'은 10에 인덱스 값만큼 제곱해서 구할 수 있다.

 

[코드]

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    string resister[10] = {"black", "brown", "red", "orange", "yellow", "green", "blue", "violet", "grey", "white"};
    string input[3];
    long res = 0;
    for (int i=0; i<3; i++) cin >> input[i];
    for(int i=0; i<3; i++){
        for(int j=0; j<10; j++){
            if(input[i] == resister[j]){
                if(i==0)    res = j*10;
                if(i==1)    res += j;
                if(i==2)    res *= pow(10, j);
            }
        }
    }
    cout << res;
    return 0;
}

 먼저 string에 10개의 색을 저장했다. input으로 받을 문자열 3개를 정의해주고, result값의 범위를 고려해 long으로 잡아준다. 이중 for문을 통해 입력된 문자열이 resister에 저장된 문자열과 동일한지 확인한 뒤, 동일하다면 result에 결과값을 계산해준다. 저항 계산법에 의해 첫번째 색의 값과 두번째 색의 값을 합치고(십의자리+일의자리), pow 함수를 이용해 10의 j승을 곱해줬다.