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

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를 반환하고, 일치하는 요소가 없으면 범위의 끝을 가리키는 반복자를 반환한다.