오늘의 문제입니다.
리스트에 해당 문자가 있는지 확인하는 단순한 if else 구문인데요 이미 답은 적혀있습니다.
#include <iostream>
using namespace std;
int main(void) {
string code;
cin >> code;
string last_four_words = code.substr(code.size()-4, 4);
if(last_four_words == "_eye"){
cout << "Ophthalmologyc";
}
else if(last_four_words == "head"){
cout << "Neurosurgery";
}
else if(last_four_words == "infl"){
cout << "Orthopedics";
}
else if(last_four_words == "skin"){
cout << "Dermatology";
}
else{
cout << "direct recommendation";
}
return 0;
}
이런식으로 되어있는데요 이때 해답과 저의 답은 같은데 오답처리가 되길래 뭔가 오류가 걸린 것 같네요.
문제의 답이 저에게 도움이 됐다기보다는
string last_four_words = code.substr(code.size()-4, 4);
이 한 줄이 저에게 더 도움 됐는데요. substr은
- code.substr(...):
- 문자열 code에서 특정 위치부터 일정 길이만큼의 문자열을 추출하는 함수.
- 구문: code.substr(start_position, length)
- start_position: 추출을 시작할 위치.
- length: 추출할 문자의 길이.
- code.size():
- 문자열 code의 길이를 반환합니다.
- 예: code = "abcdefg"라면 code.size()는 7을 반환.
- code.size() - 4:
- 문자열의 끝에서 4번째 문자의 위치를 계산.
- 예: code.size() = 7이면, 7 - 4 = 3 → 문자열의 3번째 위치에서 시작.
- 4:
- substr 함수의 두 번째 매개변수로, 추출할 문자의 길이.
- 여기서는 4개의 문자를 추출.
라고 알아두면 될 것같습니다.기본문법이겠지만 오랜만에 보니 새롭네요.
두번째문제입니다.
리스트를 비교하는 이중for문인데요.
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<string> cpr) {
vector<int> answer = {0, 0, 0, 0, 0};
vector<string> basic_order = {"check", "call", "pressure", "respiration", "repeat"};
for(int i=0; i<cpr.size(); i++){
for(int j=0; j<basic_order.size(); j++){
if(cpr[i] == basic_order[j]){
answer[i] = j + 1;
break;
}
}
}
return answer;
}
해답입니다. 코드를 하나하나 뜯어보겠습니다.
이 코드가 하는 일
- cpr이라는 문자열 리스트를 입력으로 받아옵니다.
- 미리 정해진 순서인 **basic_order**와 비교해서,
- cpr 안에 있는 각 단어가 몇 번째 순서인지를 확인합니다.
- 그 결과를 숫자로 변환해서 answer라는 리스트로 반환합니다.
코드의 작동 과정
1. 기본 설정
- answer: 숫자를 저장할 리스트. 처음에는 모두 0으로 초기화.
vector<int> answer = {0, 0, 0, 0, 0};
- basic_order: 순서를 정해놓은 기준 단어 리스트.
vector<string> basic_order = {"check", "call", "pressure", "respiration", "repeat"};
2. 두 리스트를 비교
- 입력 리스트 cpr에서 한 단어씩 가져와서 basic_order와 비교합니다.
- 만약 단어가 일치하면, 그 단어의 **위치(1부터 시작)**를 answer에 저장합니다.
3. 반복문 설명
외부 반복문
- cpr 리스트의 단어들을 하나씩 가져옵니다.
for (int i = 0; i < cpr.size(); i++) {
- cpr의 i번째 단어를 검사합니다.
내부 반복문
- 각 단어를 basic_order의 단어들과 차례로 비교합니다.
for (int j = 0; j < basic_order.size(); j++) { if (cpr[i] == basic_order[j]) { answer[i] = j + 1; break; } }
- cpr[i]와 basic_order[j]가 같다면:
- answer[i] = j + 1 → 해당 단어의 순서를 저장.
- 더 이상 비교할 필요가 없으므로 break로 루프 종료.
4. 최종 결과 반환
- 모든 단어를 검사한 후, 변환된 숫자 리스트인 answer를 반환합니다.
예제
입력:
vector<string> cpr = {"call", "pressure", "check", "respiration", "repeat"};
실행 과정:
- 첫 번째 단어: "call"
- basic_order에서 "call"은 **두 번째(2)**에 있으므로 answer[0] = 2.
- 두 번째 단어: "pressure"
- basic_order에서 "pressure"는 **세 번째(3)**에 있으므로 answer[1] = 3.
- 세 번째 단어: "check"
- basic_order에서 "check"는 **첫 번째(1)**에 있으므로 answer[2] = 1.
- 네 번째 단어: "respiration"
- basic_order에서 "respiration"은 **네 번째(4)**에 있으므로 answer[3] = 4.
- 다섯 번째 단어: "repeat"
- basic_order에서 "repeat"는 **다섯 번째(5)**에 있으므로 answer[4] = 5.
결과:
answer = {2, 3, 1, 4, 5};
세번째 문제입니다!
이번에는 주어진 코드를 고쳐서 풀어야하는데요
해답은 이렇습니다.
#include <string>
#include <vector>
using namespace std;
int solution(int storage, int usage, vector<int> change) {
int total_usage = 0;
for(int i=0; i<change.size(); i++){
usage += usage * change[i] / 100;
total_usage += usage;
if(total_usage > storage){
return i;
}
}
return -1;
}
이제 코드를 하나하나 뜯어보겠습니다. 이 문제는 제가 틀려서 자세히 보겠습니다.
1. 코드의 역할
- 초기 사용량 usage와 매번의 변화율 change를 기반으로 **총 사용량(total_usage)**을 계산.
- **저장 공간(storage)**을 초과하는 시점이 발견되면, **몇 번째 변화(i)**에서 초과했는지 반환.
- 만약 모든 변화를 적용한 후에도 초과하지 않았다면, -1을 반환.
2. 코드의 구조와 동작
2.1 변수 초기화
int total_usage = 0;
- total_usage:
- 모든 변화율을 적용한 사용량의 총합.
- 초기에 0으로 설정.
2.2 변화율 적용 (for 루프)
for (int i = 0; i < change.size(); i++) {
- change 벡터에 있는 각 변화율을 순회하면서 반복.
변화율 적용
usage += usage * change[i] / 100;
- usage: 매번 변화율 change[i]를 적용하여 새로 갱신.
- 현재 usage 값에 비율(change[i] / 100)을 곱해 증가량을 계산.
- 이 증가량을 기존 usage에 더해 새로운 사용량으로 갱신.
총 사용량 누적
total_usage += usage;
- 변화율이 적용된 사용량 usage를 누적하여 **total_usage**에 더함.
저장 공간 초과 여부 확인
if (total_usage > storage) { return i; }
- **total_usage**가 저장 공간(storage)을 초과하면:
- 현재 변화의 인덱스 i를 반환.
- 초과한 즉시 종료.
2.3 저장 공간을 초과하지 않은 경우
return -1;
- 반복문이 끝난 뒤에도 total_usage가 storage를 초과하지 않았다면, -1을 반환.
3. 예제 실행
입력:
int storage = 100; // 저장 공간은 100 int usage = 10; // 초기 사용량은 10 vector<int> change = {50, 200, 150}; // 변화율
변화 계산 과정:
- 초기 상태:
- usage = 10
- total_usage = 0
- 변화 1: change[0] = 50%
- usage = usage + usage * 50 / 100 = 10 + 10 * 50 / 100 = 10 + 5 = 15
- total_usage += usage = 0 + 15 = 15
- 저장 공간 초과하지 않음.
- 변화 2: change[1] = 200%
- usage = usage + usage * 200 / 100 = 15 + 15 * 200 / 100 = 15 + 30 = 45
- total_usage += usage = 15 + 45 = 60
- 저장 공간 초과하지 않음.
- 변화 3: change[2] = 150%
- usage = usage + usage * 150 / 100 = 45 + 45 * 150 / 100 = 45 + 67 = 112
- total_usage += usage = 60 + 112 = 172
- 저장 공간 초과! (172 > 100)
결과:
- **i = 2**에서 초과.
4. 최종 반환
- 저장 공간 초과: 변화의 인덱스(0부터 시작)를 반환.
- 저장 공간 초과 없음: -1 반환.
이상입니다. 이번엔 좀 복잡하니 내일도 복습하도록 합시다
'언리얼(Unreal) > 코딩테스트' 카테고리의 다른 글
24.12.17 (0) | 2024.12.17 |
---|