[baekjoon/c++] 1076 - input.txt로 입력받기, findIndex 구현

input.txt로 문제 입력 받기

문제를 풀기 전에, 기본적인 c++로 백준 문제를 풀기 위한 준비를 하였다. 매번 입력을 복붙할 순 없으니, input.txt를 같은 디렉토리에 만들었다.

alt text

int N; // N을 하드코딩하여 고정된 값으로 설정
string arr[3]; // 크기가 3인 배열 선언 (변동가능)
int main() {
    freopen("input.txt", "r", stdin);
    
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> arr[i];
    }

    ...

이후 백준에 제출할 때는 freopen만 주석처리 해주면 되겠다.

int main(){
    //freopen("input.txt", "r", stdin)
...

[Bronze II] 저항 - 1076

문제 링크

성능 요약

메모리: 2212 KB, 시간: 0 ms

분류

구현

제출 일자

2024년 5월 31일 19:12:43

문제 설명

전자 제품에는 저항이 들어간다. 저항은 색 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이 된다.

입력

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

출력

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

코드

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm> // find 함수를 사용하기 위한 헤더
#include <cmath>     // pow 함수를 사용하기 위한 헤더
using namespace std;

int N = 3; // N을 하드코딩하여 고정된 값으로 설정
string arr[3]; // 크기가 3인 배열 선언

string color[] = {
    "black",
    "brown",
    "red",
    "orange",
    "yellow",
    "green",
    "blue",
    "violet",
    "grey",
    "white"
};

int findIndex(const string& target) {
    auto it = find(begin(color), end(color), target);
    if (it != end(color)) {
        return distance(begin(color), it); // 찾은 원소의 위치 반환
    }
    else {
        return -1; // 원소를 찾지 못한 경우 -1 반환
    }
}

int main() {
    //freopen("input.txt", "r", stdin);
    
    // 파일에서 N값을 사용하지 않고, 이미 정해진 값을 사용
    for (int i = 0; i < N; i++) {
        cin >> arr[i];
    }
    int thirdIndex = findIndex(arr[2]);
    long long ans = (findIndex(arr[0])*10 + findIndex(arr[1])) * pow(10, thirdIndex);
    cout << ans << endl;
    return 0;
}

설명

문제의 표를 보면 숫자의 합은 인덱스 순서, 곱은 인덱스 순서의 제곱으로 정렬되어 있는 것이 보인다. 간단하게 배열을 생성하여 이 값들을 가져오는 방법을 생각했다.

그걸 구현하기 위해 인덱스를 가져오는 함수가 필요했다.

findIndex()

기본적인 반복문과 조건문으로 구현하기보다 언어에 익숙해지기 위해 메소드를 사용해보기로 했다.

//배열 arr에서 target과 일치하는 첫 번째 요소를 찾고, 해당 요소의 iterator를 반환합니다.
find(begin(arr), end(arr), target);

//begin(color)부터 iterator까지의 거리를 계산하여 해당 요소의 인덱스를 반환합니다
distance(begin(arr), it);

아직 정확하게 이해는 못했지만, 포인터와 비슷한 개념이자 더 추상화된 개념 iterator가 쓰였다.

  • iterator는 포인터와 다르게 특정 컨테이너나 배열의 원소를 가리키는 객체로, 이터레이터를 통해 원소를 읽거나 쓸 수 있다.

따라서 begin()과 end()에서 배열의 시작과 끝을 가리키는 이터레이터를 반환하고, 이를 통해 배열의 끝까지 find함수가 진행하다 target이 매칭되면 그 값을 반환하는 것이다.

find()

_EXPORT_STD template <class _InIt, class _Ty>
_NODISCARD _CONSTEXPR20 _InIt find(_InIt _First, const _InIt _Last, const _Ty& _Val) { // find first matching _Val
    _STD _Adl_verify_range(_First, _Last);
    if constexpr (_Is_vb_iterator<_InIt> && is_same_v<_Ty, bool>) {
        return _STD _Find_vbool(_First, _Last, _Val);
    } else { //버퍼 반복자가 아님으로 여기서 실행됨
        _STD _Seek_wrapped(_First, _STD _Find_unchecked(_STD _Get_unwrapped(_First), _STD _Get_unwrapped(_Last), _Val));
        return _First; //결과적으로 _First를 반환환
    }
}
  • _Adl_verify_range를 사용하여 범위의 유효성을 검사한다.
  • _Find_unchecked를 사용하여 _Val과 일치하는 첫 번째 요소를 찾는다.
  • 일치하는 요소를 찾으면 해당 요소의 반복자인 _First를 반환하고, 일치하는 요소가 없으면 범위의 끝을 가리키는 반복자를 반환한다.