반응형

 

문제 1

6명이 사다리 게임[^1] 을 할 때, 몇 번째 위치에서 시작하는 사람이 상품을 타는지 알고 싶습니다. 가로줄은 항상 인접한 세로줄만 연결할 수 있으며 주어진 순서대로 위에서부터 연결합니다.

예를 들어, 아래 사다리의 가로줄은 [[1, 2], [3, 4], [2, 3], [4, 5], [5, 6]] 으로 표현합니다. 이때 1번째 위치에서 시작한 사람이 상품을 탑니다.


가로줄의 위치가 담긴 2차원 배열 ladders와 상품의 위치 win이 매개변수로 주어질 때, 당첨자의 시작 위치를 return 하도록 solution 함수를 작성하려 합니다. 빈칸을 채워 전체 코드를 완성해주세요.

---
#####매개변수 설명
가로줄의 위치가 담긴 2차원 배열 ladders와 상품이 있는 위치 win이 solution 함수의 매개변수로 주어집니다.
* 가로줄의 개수는 1 이상 20 이하인 자연수입니다.
* win은 1 이상 6 이하인 자연수입니다.
* 가로줄은 항상 연결할 수 있는 형태만 주어집니다.

---
#####return 값 설명
승리하는 사람의 시작 위치를 return 합니다.

---
#####예시

ladders  win  return
 [[1, 2], [3, 4], [2, 3], [4, 5], [5, 6]]


[^1]: 사다리 게임은 먼저 사람 수만큼 세로줄을 긋고 한쪽 편에는 이름을 쓰고 반대쪽에는 상품 위치를 씁니다. 서로 인접한 세로줄 사이에 가로줄을 무작위로 그은 다음 세로줄을 타고 내려가면서 가로줄을 만날 때마다 가로줄로 연결된 다른 세로줄로 가는 게임입니다.

[ 소스 코드 ]

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> ladders, int win) {
    int answer = 0;
    
    vector<int> player = { 1, 2, 3, 4, 5, 6 };
    
    for(int i = 0; i < ladders.size(); i++) {
        int temp = player[ladders[i][0]-1];
        @@@ = @@@;
        @@@ = temp;
    }
    
    answer = player[win-1];
    
    return answer;
}

int main() {
    vector<vector<int>> ladders = {{1, 2}, {3, 4}, {2, 3}, {4, 5}, {5, 6}};
    int win = 3;
    int ret = solution(ladders, win);
    
    cout << "solution ? " << ret << " " << endl;
}

 

[ 정답 보기 ]

더보기
#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> ladders, int win) {
    int answer = 0;
    
    vector<int> player = { 1, 2, 3, 4, 5, 6 };
    
    for(int i = 0; i < ladders.size(); i++) {
        int temp = player[ladders[i][0]-1];
        player[ladders[i][0]-1] = player[ladders[i][1]-1];
        player[ladders[i][1]-1] = temp;
    }
    
    answer = player[win-1];
    
    return answer;
}

 

문제 2

공강이란 수업 시간 사이에 수업이 없이 비는 시간입니다. 시간표가 주어질 때 공강은 총 몇 시간인지 구하려 합니다. 시간표 상에 수업이 있는 시간은 1로, 수업이 없는 시간은 0으로 표시합니다. 모든 수업은 정각에 시작해 1시간 뒤에 끝납니다.


예를 들어, 위 시간표에서 공강은 총 3시간입니다. 
공강이 총 몇 시간인지 구하기 위해 다음과 같이 프로그램 구조를 작성했습니다.

```
1. 가장 첫 수업 시작 시각을 구합니다.
2. 가장 마지막 수업 시작 시각을 구합니다.
3. 1과 2사이에서 수업이 없는 시간을 셉니다.
```

시간표를 표현한 배열 time_table이 매개변수로 주어질 때 공강은 총 몇 시간인지 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c 함수와 매개변수를 알맞게 채워주세요.

---
#####매개변수 설명
시간표를 표현한 배열 time_table이 solution 함수의 매개변수로 주어집니다.
* time_table은 길이가 5 이상 15 이하인 배열입니다.
* 시간표에서 수업이 있는 시간은 1로 표현하고 수업이 없는 시간은 0입니다.
* time_table의 원소는 0 또는 1입니다.

---

#####return 값 설명
공강이 총 몇 시간인지 return 해주세요.

---
#####예시

time_table return 
 [1, 1, 0, 0, 1, 0, 1, 0, 0, 0]


#####예시 설명
문제에 나온 예와 같습니다.

[ 소스 코드 ]

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int func_a(vector<int> time_table) {
    int answer = 0;
    for(int i = time_table.size()-1; i >= 0; i--) {
        if(time_table[i] == 1) {
            answer = i;
            break;
        }
    }
    return answer;
}

int func_b(vector<int> time_table, int class1, int class2) {
    int answer = 0;
    for(int i = class1; i < class2; i++)
        if(time_table[i] == 0)
            answer++;
    return answer;
}

int func_c(vector<int> time_table) {
    int answer = 0;
    for(int i = 0; i < time_table.size(); i++) {
        if(time_table[i] == 1) {
            answer = i;
            break;
        }
    }
    return answer;
}

int solution(vector<int> time_table) {
    int answer = 0;
    int first_class = func_@@@(@@@);
    int last_class = func_@@@(@@@);
    answer = func_@@@(@@@);
    return answer;
}

int main() {
	vector<int> time_table = {1, 1, 0, 0, 1, 0, 1, 0, 0, 0};
	int ret = solution(time_table);

	cout << "solution ? " << ret << " " << endl;
}

 

[ 정답 보기 ]

더보기
#include <string>
#include <vector>

using namespace std;

int solution(vector<int> time_table) {
    int answer = 0;

    int first_class = 0;
    int last_class = 0;

    for(int i = 0; i < time_table.size(); i++) {
    	if(time_table[i] == 1) {
    		first_class = i;
    		break;
    	}
    }

    for(int i = time_table.size()-1; i >= 0; i--) {
    	if(time_table[i] == 1) {
    		last_class = i;
    		break;
    	}
    }

    for(int i = first_class; i < last_class; i++)
    	if(time_table[i] == 0)
    		answer++;

    return answer;
}

 

문제 3

모든 속도위반 차량이 낼 벌금이 총 몇만 원인지 알아내려 합니다. 벌금을 매기는 기준은 다음과 같습니다.

기준   벌금
규정 속도 10% 이상 20% 미만 위반 3만 원
규정 속도 20% 이상 30% 미만 위반 5만 원 
규정 속도 30% 이상 위반  7만 원

예를 들어 규정 속도가 100인 도로를 112로 달렸다면 규정 속도를 12% 위반하였습니다. 따라서 규정 속도를 10% 이상 20% 미만 위반하였으므로 벌금 3만 원을 부과합니다.

규정 속도 speed와 도로를 달리는 모든 차의 속도가 담긴 배열 cars가 매개변수로 주어질 때, 총벌금은 몇만 원인지 return 하도록 solution 함수를 작성하려 합니다. 빈칸을 채워 전체 코드를 완성해주세요.

---
#####매개변수 설명
규정 속도 speed와 도로를 달리는 모든 차의 속도가 담긴 배열 cars가 solution 함수의 매개변수로 주어집니다.
* 규정 속도는 30 이상 140 이하이며, 10으로 나누어 떨어지는 숫자입니다.
* 도로를 달리는 차의 수는 1대 이상 40대 이하입니다.
* 모든 차는 0km/h 이상 200km/h 이하로 달립니다.

---
#####return 값 설명
도로를 달리는 모든 차의 벌금은 총 몇만 원인지 return 해주세요.

---
#####예시

speed cars   return100
100 [110, 98, 125, 148, 120, 112, 89] 23

 

#####예시 설명

기준 위반 차량 총벌금
규정 속도 10% 이상 20% 미만 위반 2대  6만원
규정 속도 20% 이상 30% 미만 위반 2대 10만원
규정 속도 30% 이상 위반   1대    7만원

 

[ 소스 코드 ]

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int solution(int speed, vector<int> cars) {
    int answer = 0;
    
    for(int i = 0; i < cars.size(); i++) {
        if(cars[i] >= speed * 11 / 10 && cars[i] < speed * 12 / 10)
            answer += 3;
        else if(cars[i] >= @@@ && cars[i] < @@@)
            answer += 5;
        else if(cars[i] >= @@@)
            answer += 7;
    }
    
    return answer;
}

int main() {
    int speed = 100;
    vector<int> cars = {110, 98, 125, 148, 120, 112, 89};
    int ret = solution(speed, cars);

    cout << "solution ? " << ret << " " << endl;
}

 

[ 정답 보기 ]

더보기
#include <string>
#include <vector>

using namespace std;

int solution(int speed, vector<int> cars) {
    int answer = 0;
    
    for(int i = 0; i < cars.size(); i++) {
        if(cars[i] >= speed * 11 / 10 && cars[i] < speed * 12 / 10)
            answer += 3;
        else if(cars[i] >= speed * 12 / 10 && cars[i] < speed * 13 / 10)
            answer += 5;
        else if(cars[i] >= speed * 13 / 10)
            answer += 7;
    }
    
    return answer;
}

 

문제 4

종목은 태권도, 500m 달리기, 사격 경기를 하려 합니다. 종목별 점수 산출 방식은 다음과 같습니다.

종목  점수 산출 방식 
태권도 25경기 이상 승리하면 250점. 
그 외에는 승리당 8점  
500m 달리기  60초에 완주 시 250점. 
그보다 빠르면 1초당 +5점 느리면 1초당 -5점  
사격  10번 사격해 과녁에 적힌 숫자의 합만큼 점수 획득.
7번 이상 10점에 맞추면 추가 점수 100점

태권도에서 승리한 횟수 taekwondo, 달리기 기록 running, 사격 기록이 담긴 배열 shooting이 매개변수로 주어질 때, 이 선수가 획득한 총점수를 return 하도록 solution 함수를 작성하려 합니다. 빈칸을 채워 전체 코드를 완성해주세요.

---
#####매개변수 설명
태권도에서 승리한 횟수 taekwondo, 달리기 기록 running, 사격 기록이 담긴 배열 shooting이 solution 함수의 매개변수로 주어집니다.
* 태권도에서는 0회 이상 35회 이하 승리할 수 있습니다.
* 달리기 기록은 초 단위이며 40 이상 120 이하인 정수입니다.
* 사격은 총 10번 하며, 과녁에는 0부터 10까지의 숫자가 적혀있습니다.

---
#####return 값 설명
이 선수가 획득한 총점수를 return 해주세요.

---
#####예시

 taekwondo running shooting  return
 27  63   [9, 10, 8, 10, 10, 10, 7, 10, 10, 10]  679

#####예시 설명
태권도에서 25회 이상 승리했기 때문에 250점을 획득했습니다.
달리기에서 60초보다 3초 느렸기 때문에 250점에서 15점을 뺀 235점을 획득했습니다.
사격에서 과녁을 맞혀 94점을 받았고, 10점을 7번 맞췄기 때문에 추가 점수 100점을 받아 총 194점을 획득했습니다.
따라서 이 선수가 받은 총점수는 679점입니다.

[ 소스 코드 ]

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int solution(int taekwondo, int running, vector<int> shooting) {
    int answer = 0;
    
    if(taekwondo >= 25)
        answer += @@@;
    else
        answer += taekwondo * 8;
        
    answer += 250 + (60 - running) * 5;
    
    int count = 0;
    for(int i = 0; i < shooting.size(); i++) {
        answer += shooting[i];
        if(shooting[i] == 10)
            count++;
    }
    if(count >= 7)
        answer += @@@;
    
    return answer;
}

int main() {
    int taekwondo = 27;
    int running = 63;
    vector<int> shooting = {9, 10, 8, 10, 10, 10, 7, 10, 10, 10};
    int ret = solution(taekwondo, running, shooting);

    cout << "solution ? " << ret << " " << endl;
}

 

[ 정답 보기 ]

더보기
#include <string>
#include <vector>

using namespace std;

int solution(int taekwondo, int running, vector<int> shooting) {
    int answer = 0;
    
    if(taekwondo >= 25)
        answer += 250;
    else
        answer += taekwondo * 8;
        
    answer += 250 + (60 - running) * 5;
    
    int count = 0;
    for(int i = 0; i < shooting.size(); i++) {
        answer += shooting[i];
        if(shooting[i] == 10)
            count++;
    }
    if(count >= 7)
        answer += 100;
    
    return answer;
}

 

문제 5

O일장은 O일마다 열리는 시장을 뜻합니다. 예를 들어 오늘 4일장이 열렸다면, 다음 4일장은 4일 뒤에 열립니다. 오늘부터 a일장과 b일장 제도를 시행하려 합니다. 정수 a, b가 주어졌을 때, a일장과 b일장이 같이 열리는 날은 며칠에 한 번씩 있는지 구하려 합니다.

예를 들어, a가 4이고 b가 6이라면 시장은 다음과 같이 열립니다.



a와 b가 매개변수로 주어질 때, a일장과 b일장이 같이 열리는 날은 며칠에 한 번씩 있는지 return 하도록 solution 함수를 작성했습니다. 그러나, 그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다. 주어진 코드에서 **한 줄**만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.

---

##### 매개변수 설명
a일장이 열리는 주기인 a와 b일장이 열리는 주기인 b가 solution 함수의 매개변수로 주어집니다.

* a와 b는 1 이상 30 이하인 자연수입니다.

---

##### return 값 설명
a일장과 b일장이 같이 열리는 날은 며칠에 한 번씩 있는지 return 해주세요.

---
#####예시

a b return
4 6 12

#####예시 설명
문제의 예와 같습니다.

 

[ 소스 코드 ]

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int solution(int a, int b) {
    int answer = 0;
    
    for(int i = 1; i <= b; i++) {
        if((a * i) % b == 0) {
            answer = b * i;
            break;
        }    
    }
    
    return answer;
}

int main() {
    int a = 4;
    int b = 6;
    int ret = solution(a, b);
    
    cout << "solution ? " << ret << " " << endl;
}

 

[ 정답 보기 ]

더보기
#include <string>
#include <vector>

using namespace std;

int solution(int a, int b) {
    int answer = 0;
    
    for(int i = 1; i <= b; i++) {
        if((a * i) % b == 0) {
            answer = a * i;
            break;
        }    
    }
    
    return answer;
}

 

 

 

[ 출처 ] http://www.ybmit.comcos pro 샘플문제

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
Posted by 명문코딩컴퓨터
,