티스토리 뷰
와 이 문제에서 반나절 헤메다가 방금 풀어서 혼자 알기 아까워서 쓰는 글입니다.
구글링을 해 봐도 c++로 푼 건 없다시피해서... 비교적 간단한 코드로 풀게 되어서 공유하고자 합니다.
문제의 조건
1. 제시된 2차원 벡터 [숫자, 알파벳] 형태로 저장된 값을 오름차순 정렬하는데 인덱스 번호는 지키면서 해야 함
2. 정렬하기 전 배열의 0번째부터 배열길이의 절반까지의 알파벳은 '-'(dash)로 바꿈
3. 즉 2번을 먼저 수행한 후 key 값이라 할 수 있는 숫자를 기준으로 인덱스 순서를 지키면서 오름차순 정렬을 한 후 숫자는 제외하고 알파벳과 -(dash)만 출력을 해야 함
근데 이게 처음에는 단순하게 for문 돌려서 2번을 먼저 수행한 후에 <algorithm>의 sort() 함수를 쓰려고 했었어요.
왜냐면 문제를 대충 읽어서 string 형태로 저장되어 있는 숫자를 integer 형태로 바꾸라는 문장을 못 봤거든요 ㅠ.ㅠ
그래서 2번만 수행한 후 sort() 돌린 결과...
정렬이 제대로 되지 않았습니다... 그야말로 폭망
ㅋ
key값이 int가 아닌 string이었으니 당연한 결과였지만 이 때의 저는 알지 못했죠.
그렇게 헤메다
이 문장을 보고 string 숫자를 int 숫자로 바꿔줘야 한다는 것을 깨달았죠.
그럼에도 처음에는 [숫자, 알파벳] 형태를 지키면서 정렬을 한 후에 숫자들을 지워주고 알파벳만 출력해야 한다는 생각에 사로잡혀서 계속 삽질을 하다가 ㅠ.ㅠ 다음과 같은 코드로 풀었습니다.
void countSort(vector<vector<string>> arr) {
//원본 배열의 인덱스 순서를 지키면서 key 숫자 오름차순으로 정렬하려면
//0을 key로 가진 알파벳들은 배열의 0번째에 저장
//1을 key로 가진 알파벳들은 배열의 1번째에 저장
//....n을 key로 가진 알파벳들은 배열의 n번째에 저장하면 된다.
//그런데 문제의 조건에서 key인 숫자의 범위는 0~100이기 때문에 n의 최대값은 100이다.
//그렇기 때문에 결과물을 저장할 string 배열의 길이는 100으로 정해준다.
vector<string> vecString(100);
for (int y = 0; arr.size() > y; y++)
{
//원본 arr를 순회하면서 0번째~배열 길이의 절반까지의 알파벳은 '-'로 바꿔준다.
//알파벳은 2차원 배열의 1번째에 저장되어 있기 때문에 y값만 증가시키면서 아래와 같이 진행하면
//알파벳만 '-'로 바꿀 수 있다.
if (arr.size() * 0.5f > y)
arr[y][1] = "-";
//string 형태인 숫자를 integer 형태 숫자로 바꿔줘야 한다.
//숫자는 2차원 배열의 0번째에 저장되어 있기 때문에 y값만 증가시키면 됨
//i는 key값을 저장하게 된다.
int i = stoi(arr[y][0]);
//결과물을 저장할 배열의 i번째에 현재 탐색중인 인덱스의 알파벳과 띄어쓰기를 추가한다.
vecString[i] += arr[y][1] + " ";
}
//마지막 출력~~!!!
for (auto elem : vecString)
{
cout << elem;
}
}
모든 테스트케이스 통과합니다.
짝짝짝!!!
for문 중첩시켜서 푸는 방법도 있지만 원본 배열 길이가 길어지면 느려서 시간초과로 실패 뜨더라구요...
역시 알고리즘 문제에선 2중 for문은 최대한 피하는 것이 답인 것 같습니다.
'알고리즘 문제 풀이' 카테고리의 다른 글
[C++] HackerRank 해커랭크 Gaming Array 풀이 (0) | 2021.09.10 |
---|---|
[C++] HackerRank 해커랭크 Fraudulent Activity Notifications 풀이 (0) | 2021.09.10 |
[C++] HackerRank 해커랭크 Insertion Sort Advanced Analysis 풀이 (0) | 2021.09.09 |
[C++] HackerRank 해커랭크 Find the Median 풀이 (0) | 2021.09.09 |
[C++] HackerRank 해커랭크 Closest Numbers 풀이 (0) | 2021.09.09 |
- Total
- Today
- Yesterday
- 해커랭크
- 그리디
- c언어
- 다이나믹프로그래밍
- 백준
- BFS
- 하드웨어
- 컴퓨터
- greedy
- dp
- 알고리즘
- 스위프트플레이그라운드
- 프로그래밍
- 영어공부
- 컴퓨터사이언스
- 컴퓨터공부
- 기초
- DFS
- 깊이우선탐색
- 문제풀이
- 캐나다생활
- 코딩공부
- 캐나다
- c++
- C언어기초
- 너비우선탐색
- 프로그래머스
- 아이패드
- 애플
- hackerrank
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |