24.12.19

alwaysyoung2 ㅣ 2024. 12. 19. 20:14

오늘의 문제입니다.

리스트에 해당 문자가 있는지 확인하는 단순한 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;
}

해답입니다. 코드를 하나하나 뜯어보겠습니다.

이 코드가 하는 일

  1. cpr이라는 문자열 리스트를 입력으로 받아옵니다.
  2. 미리 정해진 순서인 **basic_order**와 비교해서,
    • cpr 안에 있는 각 단어가 몇 번째 순서인지를 확인합니다.
  3. 그 결과를 숫자로 변환해서 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"};

실행 과정:

  1. 첫 번째 단어: "call"
    • basic_order에서 "call"은 **두 번째(2)**에 있으므로 answer[0] = 2.
  2. 두 번째 단어: "pressure"
    • basic_order에서 "pressure"는 **세 번째(3)**에 있으므로 answer[1] = 3.
  3. 세 번째 단어: "check"
    • basic_order에서 "check"는 **첫 번째(1)**에 있으므로 answer[2] = 1.
  4. 네 번째 단어: "respiration"
    • basic_order에서 "respiration"은 **네 번째(4)**에 있으므로 answer[3] = 4.
  5. 다섯 번째 단어: "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. 코드의 역할

  1. 초기 사용량 usage와 매번의 변화율 change를 기반으로 **총 사용량(total_usage)**을 계산.
  2. **저장 공간(storage)**을 초과하는 시점이 발견되면, **몇 번째 변화(i)**에서 초과했는지 반환.
  3. 만약 모든 변화를 적용한 후에도 초과하지 않았다면, -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}; // 변화율

변화 계산 과정:

  1. 초기 상태:
    • usage = 10
    • total_usage = 0

  1. 변화 1: change[0] = 50%
    • usage = usage + usage * 50 / 100 = 10 + 10 * 50 / 100 = 10 + 5 = 15
    • total_usage += usage = 0 + 15 = 15
    • 저장 공간 초과하지 않음.

  1. 변화 2: change[1] = 200%
    • usage = usage + usage * 200 / 100 = 15 + 15 * 200 / 100 = 15 + 30 = 45
    • total_usage += usage = 15 + 45 = 60
    • 저장 공간 초과하지 않음.

  1. 변화 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