Algorithm/Problem

[BOJ]1524 세준세비(B1, C++)

검은 까마귀 2024. 2. 23. 09:30

📋 개요 

감잡기 문제를 풀면서 vector도 활용을 많이했고 이번 문제도 그렇게 어렵지 않았다. 약간의 Vector관련 함수만 알고 있다면 쉽게 풀 수 있었다.

 

문제 지문에 살짝 함정이 있었지만.... 문장이 이해를 못해서 2시간중에 1시간동안 문제를 풀었다.....


🧩 문제

https://www.acmicpc.net/problem/1524

 

1524번: 세준세비

첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 100보다 작거나 같다. 각 테스트 케이스는 다음과 같이 이루어져 있다. 첫째 줄에 N과 M이 들어오고, 둘째 줄에는 세준이의 병사들의 힘이 들어

www.acmicpc.net

📝  형식 

📥 입력 📤 출력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 100보다 작거나 같다. 각 테스트 케이스는 다음과 같이 이루어져 있다. 첫째 줄에 N과 M이 들어오고, 둘째 줄에는 세준이의 병사들의 힘이 들어오고, 셋째 줄에는 세비의 병사들의 힘이 들어온다. 힘은 정수이고, 이 값이 클수록 강하고, 작을수록 약하다.
각 테스트 케이스는 줄 바꿈으로 구분되어 있다.
각 테스트 케이스에 대해서 한 줄에 하나씩 차례대로 승자를 출력한다. 세준이가 이기면 S를 세비가 이기면 B를 둘다 아닐 경우에는 C를 출력한다.

💡  예제

🔢 번호 📥 입력 📤 출력
1 2

1 1
1
1

3 2
1 3 2
5 5
S
B

 

🥕  내 코드가 정답코드


📖  해설 및 느낀점

# 구현

2차원 배열도 사용하지 않고 아주 단순한 구현문제이다 If문만 잘 활용하면 된다. 문제의 함정은 "세준이가 이기면 S를 세비가 이기면 B를 둘다 아닐 경우에는 C를 출력한다."이다. 

 

여기서 "둘다 아닐 경우에는 C를 출력한다."인데 세준이가 이기거나 세비가 이기는 경우가 아닌 경우는 무엇이 있을까?

비기는 상황이 벌어지는 것이다.

 

하지만, 문제상 비기는 상황이 벌어질 수가 없다. 약한병사가 같으면 동생 세비의 병사가 무조건 죽는것이 조건이기 때문이다. 문제를 한참을 보고 이해했다. 둘다 이닌경우?

 

결국 "C"문자는 출력이 될일이 없어서 고려할 필요가 없었다는 것이다.

 

먼저 구현을 아래와 같이 했다.

  1. 입력
  2. 정렬
  3. 조건분기
  4. 출력

3. 조건 분기는 아래와 같이 나누었다.

  • 가장 첫번째 병사, 즉, 세준의 가장 약한 병사보다 세비의 가장 약한 병사를 죽이는 경우
  • 가정 첫밴째 병사, 즉, 세비의 가장 약한 병사보다 세준의 가장 약한 병사를 죽이는 경우
  • 가장 약한 병사의 공격력이 같은 경우
    • 세준 세비의 가장 강한 병사들끼리 비교
    • 세준 세비의 가장 강한 병사가 같다면 세비꺼를 죽임

이렇게 나누었고, 가장 약한 병사가 죽는 경우 vector에서 삭제해 그 다음 병사가 제일 앞에 오도록 하였다.

그렇게 되면 세준에게 5, 세비에게 1,2,3,4의 병사가 있더라도 승자는 세준이 된다.

 

# C++ 문법

vector를 활용하여 풀어냈는데 vecotr의 요소 삭제, 가장 마지막 값 리턴 받기, 정렬을 활용했다.

vector<int> aa;

aa.front(); //백터의 첫번째 위치의 요소 aa[0]으로 해도 됨
aa.back(); //백터의 마지막 위치의 요소

//해당 인덱스의 삭제
aa.erase(aa.begin() +i); //삭제해야할 인덱스 i를 넣음

//예제
aa.erase(aa.begin() +0); //0번째 인덱스 삭제
aa.erase(aa.begin() + aa.size -1); //마지막 인덱스 삭제

//알고리즘 정렬
sort(aa.begin(), aa.end()); //오름차순 정렬
sort(aa.rbegin(), aa.rend()); //내림차순 정렬

 

C++를 포인터를 안쓰고 너무 JAVA처럼 쓰고있는거 아닐까 싶다.... 

 

반응형