Machineboy空
2852 : NBA 농구 - substr, prev, temp 본문
https://www.acmicpc.net/problem/2852
2852번: NBA 농구
첫째 줄에 골이 들어간 횟수 N(1<=N<=100)이 주어진다. 둘째 줄부터 N개의 줄에 득점 정보가 주어진다. 득점 정보는 득점한 팀의 번호와 득점한 시간으로 이루어져 있다. 팀 번호는 1 또는 2이다. 득
www.acmicpc.net
문제요약
경기 진행에 따라 이기고 있는 팀 시간 구하기.
난이도
Silver 3
풀이 포인트
- prev temp의 활용
- 시간 표기
string print(int a)
{
string d = "00" + to_string(a / 60);
string e = "00" + to_string(a % 60);
return d.substr(d.size() - 2, 2) + ":" + e.substr(e.size() - 2, 2);
}
REVIEW
날 굉장히 속 썩인 문제.
간단한 거 같은데 계속 잡히지 않아 답답했다.
이긴 시간을 갱신하는 포인트가 점수가 능가했을 때가 아닌 무승부가 되는 시점이라는 것이 중요.
- 무승부가 된 시점
- 현재 골을 넣은 팀 - 이기고 있던 팀
- 이전 골 넣은 시간 갱신
- 역전된 시점에 이기고 있는 팀 갱신
아직도 경우의 수 빈틈없이 완성하지 못했나보다.
우선 모범 풀이에서는
- 골이 들어간 시점 모든 구간 마다, 이긴 사람에게 그 구간을 더해주는 sum의 형식으로 구현했다.
- 나는 그 구간을 승부가 바뀐 시점에만 더해주고자 했다..
굉장히 직관적으로 풀이했다고 생각했는데 일단은 좀 더 두고 왜 틀렸는지 분석해봐야겠다.
뭔가 자료 구조라거나, 다른 이론적 지식이 없어서가 아니라 이런 아이디어적인 문제들..
쉬워보이는 게 안풀리면 좀 열받음. 알려줄 사람 환영.
CODE
#include <bits/stdc++.h>
using namespace std;
#define prev aaa
int n, o, A, B, asum, bsum;
string s, prev;
string print(int a)
{
string d = "00" + to_string(a / 60);
string e = "00" + to_string(a % 60);
return d.substr(d.size() - 2, 2) + ":" + e.substr(e.size() - 2, 2);
}
int changeToInt(string a)
{
return atoi(a.substr(0, 2).c_str()) * 60 + atoi(a.substr(3, 2).c_str());
}
void go(int &sum, string s)
{
sum += (changeToInt(s) - changeToInt(prev));
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> o >> s;
if (A > B)
go(asum, s);
else if (B > A)
go(bsum, s);
o == 1 ? A++ : B++;
prev = s;
}
if (A > B)
go(asum, "48:00");
else if (B > A)
go(bsum, "48:00");
cout << print(asum) << "\n";
cout << print(bsum) << "\n";
}
//왜 틀린지 분석중
#include <bits/stdc++.h>
using namespace std;
int n, teamN, otherN, minute, second, winN = -1;
string timeS;
bool isSame;
int prevGoalTime;
map<int, int> goalCntMap; // team, goalcnt
map<int, int> winTimeMap; // team, winTime
string formatTime(int min, int sec){
ostringstream oss;
oss << setfill('0') << setw(2) << min <<":" << setw(2) << sec;
return oss.str();
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> teamN;
cin >> timeS;
goalCntMap[teamN]++;
minute = stoi(timeS.substr(0, 2));
second = stoi(timeS.substr(3, 2));
if (teamN == 1)
otherN = 2;
else
otherN = 1;
if (winN != teamN && goalCntMap[teamN] > goalCntMap[otherN])
{
prevGoalTime = minute * 60 + second;
winN = teamN;
}
else if (winN != teamN && goalCntMap[teamN] == goalCntMap[otherN]){
winTimeMap[winN] += (minute * 60 + second) - prevGoalTime;
prevGoalTime = minute * 60 + second;
}
}
winTimeMap[winN] += 48 * 60 - prevGoalTime;
//숫자 표기
cout << formatTime(winTimeMap[1]/60, winTimeMap[1]%60) << '\n';
cout << formatTime(winTimeMap[2] / 60, winTimeMap[2] % 60) << '\n';
}
'Computer > Coding Test' 카테고리의 다른 글
2636 : 치즈 - DFS, BFS (1) | 2024.02.20 |
---|---|
14502 : 연구소 - DFS, deep copy (0) | 2024.02.20 |
1325 : 효율적인 해킹 - dfs, 인접리스트, 정렬 (0) | 2024.02.19 |
17298 : 오큰수 - stack, 짝짓기 (1) | 2024.02.19 |
9012 : 괄호 - stack, 그리디 알고리즘, getline(cin,s) (0) | 2024.02.16 |