당니의 개발자 스토리
1-E 본문
내 풀이(http://boj.kr/d9c06a86bcb1455a9f21de960cd8481b) - 맞음
공유 소스 보기
www.acmicpc.net
1-E
자 오늘도 재밌게 1159 문제를 풀어 보도록 할게요.

이 문제는 어떤 주어진 문자열을 기반으로 해서 문자열의 첫 글자가 같은 게 5개 이상이면 그 문자들을 모아서 오른차순으로 출력을 하고, 그게 아니면 "PREDAJA" 라는 특정 문자열을 출력하면 되는 문제죠.

자 그러니까 예를 들어서, abc, abb 이렇게 들어왔을 때 중요한 건 첫 번째 문자인 거죠. 첫 번째 문자가 같은 게 몇 개 있는지 라는 거죠.
여러분 문제에서 몇 개라고 했을 때 어떤게 생각이 나야 돼요? Counting star는 Map 또는 배열 이게 생각이 나셔야 됩니다.

이 문제는 문자니까 이거를 카운팅 배열인 cnt[] 배열을 기반으로 만들 수가 있겠네요.
여러분 cnt[] 배열을 보면, 이런 게 생각이 나야 됩니다.

어떤 문자를 이런 식으로 cnt[a - 'a'] 좌표 이동을 한다고 생각이 나셔야 돼요.
자 바로 코드를 보면서 설명을 해보도록 하겠습니다.

자 문자열이 주어졌을 때, 중요한 건 제가 첫 번째 글자라고 했죠.

첫 번째 글자에 대해서 이런 식으로 counting 배열을 만듭니다.
지금 인덱스에 문자끼리의 뺄셈을 넣어도, 배열은 Integer 인덱스를 기반으로 해서 작동되기 때문에, C++에서는 유연하게 자동으로 int화 시켜준다라고 하는 거죠.

자 그럼 이건 뭘까요? '어? 선생님 이거 숫자 아닌가요? a가 97이고 i는 0부터 25인데요' 그렇습니다. 이것도 사실은 정확히는

이런식으로 숫자를 문자화 시켜주셔야 합니다.

하지만 C++에서 유연하게 문자열에다가 지금 string으로 정의한 문자열에다가 이렇게 더하는 것은 숫자도 문자화 돼서 들어가게 된다 라는 거에요.
자 뭐냐면,

지금 a, b, c가 인덱스 0, 1, 2에 맵핑이 되어있죠?
그런데 최종적으로는 a를 끄집어야 되니까, 여기 인덱스에다가 + 97 해야 되겠죠?

예를 들어서, 제가 a + 2라고 해볼게요. 그럼 c가 되죠.
왜냐면 a는 97이고 a + 2는 ASCII 코드로 99이니까, 99을 ASCII 코드 문자로 나타내면 c입니다.
제가 이 문제를 드린 것은 저희가 앞서서는 문자를 Integer화 시키는 것을 연습을 했어요. 근데 이거 보시면,

문자를 숫자로 바꾸는 게 아니라, 지금 숫자를 문자화 시켜서 문자를 만들죠.

자 ASCII 코드라는 거는 물론 표준, 부호, 식별장치 뭐 이런 것도 있지만, 단순하게 얘기하면 문자와 숫자를 맵핑 시켜놓은 거예요.
그러니까 소문자 a는 97이다. 라고 이렇게 약속을 정해놓은 겁니다.
자 그러면 이 소문자 a를 숫자로도 바꿀 수가 있구요. 이 97을 문자로도 바꿀 수가 있는 거에요.

지금 보시는 것처럼 얘는 문자를 숫자로 바꾼거죠.

그런데 이거 같은 경우에는 숫자를 문자로 바꾼 거예요.

이렇게 된 거죠.
그리고 오름차순 같은 경우에는 인덱스 자체가 0부터 시작해서 증가될 수록, a, b, c, ... 이렇게 가니까 따로 정렬할 필요가 없습니다.

그래서 ret의 size가 있으면, 그러니까 하나라도 문자가 있으면 그 문자열을 출력하고, 없으면 "PREDAJA"을 출력한다는 겁니다.
여러분 항상 출력하라는 문자열이 있으면 그걸 꼭 복사해서 붙여넣어야 해요. 실수를 방지하는 꿀팁입니다.
이렇게 ASCII 코드로 문자를 숫자로, 숫자를 문자로 바꾸는 거에 대한 중요한 개념을 다뤘습니다.
'10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트 > 알고리즘 문제풀이' 카테고리의 다른 글
| 1-G (0) | 2024.03.09 |
|---|---|
| 1-F (0) | 2024.03.08 |
| 1-D (0) | 2024.03.06 |
| 1-C (0) | 2024.03.05 |
| 1-B counting star (0) | 2024.03.05 |