https://www.acmicpc.net/problem/2890
- 코드
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdio.h>
#include <queue>
#include <vector>
#include <unordered_map>
#include <set>
#include <map>
#include<cmath>
#include<stack>
#include<deque>
#define LL long long
using namespace std;
int arr[10];
int ord[10];
int ans[10];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
for (int i = 1; i < 10; i++) {
ord[i] = i;
}
int r, c;
cin >> r >> c;
for (int i = 0; i < r; i++) {
string s;
cin >> s;
int water = 0;
bool team = false;
int teamnum;
for (int j = 0; j < c; j++) {
if (s[j] == 'S') {
continue;
}
else if (s[j] == 'F') {
continue;
}
else if (s[j] == '.') {
water++;
}
else {
teamnum = s[j] - '0';
water = 0;
}
}
if (water != c - 2) {
arr[teamnum]=water;
}
}
//잘못된 코드
/*for (int i = 1; i < 9; i++) {
for (int j = i+1; j < 10; j++) {
if (arr[i] > arr[j]) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
ord[i] = j;
ord[j] = i;
}
}
}*/
//올바른 코드
for (int i = 1; i < 9; i++) {
for (int j = i + 1; j < 10; j++) {
if (arr[ord[i]] > arr[ord[j]]) {
int tmp = ord[i];
ord[i] = ord[j];
ord[j] = tmp;
}
}
}
ans[ord[0]] = 1;
for (int i = 2; i < 10; i++) {
if (arr[ord[i - 1]] != arr[ord[i]]) ans[ord[i]] = ans[ord[i - 1]] + 1;
else ans[ord[i]] = ans[ord[i - 1]];
}
for (int i = 1; i < 10; i++) {
cout << ans[i]+1 << endl;
}
return 0;
}
- 문제 해설
결승선까지 남은 거리를 저장한다음 거리를 정렬해서 순위를 정하는 문제였다. 어려웠던 부분은 거리를 정렬하면서 바뀌는 팀 번호도 같이 저장되어야한다는 점이었다.
깔끔하게 풀지 못한것 같아서 다른 분들의 코드를 보니 일단 탐색을 뒤에서부터 할 생각을 못했었다. 앞에서부터 하면서 힘들게 앞의 '.'을 예외처리할 생각을 하니 코드가 지저분했다... 그리고 굳이 S와 F까지 모든 길이를 탐색해서 예외처리를 할 필요도 없었다는 것을 깨달았다...ㅎ
그러나 카약 번호와 위치를 함께 저장해야하는 부분은 다른 분들도 복잡하게 풀었던게 맞는데 vector<pair<int,int>>를 사용하면 조금더 쉽지 않았을까 싶긴했다.
'Koala - 14기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/Python] 5557 - 1학년 (0) | 2024.03.24 |
---|---|
[백준/c++] 2579번 계단 오르기 (0) | 2024.03.24 |
[Python3/백준] 1965번:상자 넣기 (0) | 2024.03.23 |
[BOJ|Python] 백준 5557 1학년 (0) | 2024.03.22 |
[백준/Python] 2565 - 전깃줄 (0) | 2024.03.22 |