문제 링크입니다: https://programmers.co.kr/learn/courses/30/lessons/1830
단순 구현이지만 여러 가지 케이스를 많이 고민해야 반례가 안 나오는 문제였습니다.
저도 계속 틀리다가 공부하는 식빵맘님 설명을 참고하여 반례를 해결할 수 있었습니다. 감사합니다.
또한, 저는 대문자 하나도 문자로 봤기 때문에 테스트 2에서 "SIGONG J O A"로 출력됩니다.
알고리즘은 아래와 같습니다.
1. 주어진 문자열을 순회하면서 크게 4 가지 케이스로 나눠야 합니다.
2. 규칙 1 && 규칙 2이 동시에 적용된 문자 처리 중
2.1 대문자라면 우선 추가하는데
2.1.1 규칙 1이 적용되어 있으므로 해당 문자가 마지막 문자라면 모순이므로 invalid 반환
2.1.2 다음 문자도 대문자라면 규칙 2에 어긋나므로 invalid 반환
2.1.3 다음 문자가 소문자인데 규칙 1이나 규칙 2에 사용된 특수기호가 아니라면 모순이므로 invalid 반환
2.2 소문자라면
2.2.1 규칙 2에 사용된 특수기호일 경우 규칙 1과 규칙 2 모두 적용된 문자를 찾았으므로 words에 추가하고 새로운 문자를 탐색하러 간다
2.2.2 그런데 만약 해당 문자가 규칙 1이나 규칙 2에 사용된 문자가 아니라면 모순이므로 invalid 반환
2.2.3 다음 문자도 소문자라면 모순이므로 invalid 반환
3. 규칙 1만 적용된 문자 처리 중
3.1 대문자라면 우선 추가하고
3.1.1 해당 문자가 마지막 문자이면 규칙 1이 적용된 문자 처리 완료했으므로 words에 추가
3.1.2 다음 문자도 대문자라면 규칙 1이 적용된 문자 처리 완료했으므로 words에 추가
3.1.3 다음 문자가 소문자이고 기존 규칙 1에 사용된 특수 기호가 아니므로 새로운 문자 시작을 뜻함 -> 규칙 1이 적용된 문자 처리 완료했으므로 words에 추가
3.2 소문자이고
3.2.1 해당 문자가 마지막 문자라면 모순이므로 invalid 반환
3.2.2 다음 문자가 소문자라면 규칙 1에 위반하므로 invalid 반환
4. 규칙 2만 적용된 문자 처리 중
4.1 대문자라면 우선 추가하고
4.1.1 해당 문자가 마지막 문자라면 규칙 2를 위반하므로 invalid 반환
4.1.2 다음 문자가 소문자이지만 규칙 2에서 사용된 특수 기호와 다르다면
4.1.2.1 다음 문자가 이미 사용된 특수 기호라면 규칙 위반이므로 invalid 반환
4.1.2.2 규칙 1이 적용되지 않은 상황에서 이전 문자 또한 규칙 2에서 사용된 특수 기호와 다르다면 규칙 위반이므로 invalid 반환
4.1.2.3 위 케이스에 해당하지 않을 경우 규칙 1에 해당하므로 규칙 1이 적용되기 시작되었다고 표시
4.2 소문자라면 규칙 2 적용된 문자 처리 완료했으므로 words에 추가
5. !(규칙 1 && 규칙 2) 즉, 새로운 문자 시작
5.1 대문자라면 우선 추가하고 규칙 1 적용되기 시작했다고 표시
5.1.1 해당 문자가 마지막 문자라면 해당 문자 words에 추가하고 규칙 1 해제
5.1.2 다음 문자가 소문자인데
5.1.2.1 이미 사용된 특수 기호라면 규칙 위반이므로 invalid 반환
5.1.2.2 이후 부분은 공부하는 식빵맘님 코드를 참고했고 주석을 그대로 가져왔습니다.
5.2 소문자인데
5.2.1 이미 사용된 특수 기호라면 규칙 위반이므로 invalid 반환
5.2.2 마지막 문자라면 규칙 1, 규칙 2에 해당하는 문자가 아니므로 invalid 반환
5.2.3 다음 문자 또한 소문자라면 규칙 위반이므로 invalid 반환
5.2.4 위 케이스에 해당하지 않는다면 규칙 2 적용 시작
6. words를 적절히 처리하여 답 반환
개발환경: Programmers IDE
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > programmers' 카테고리의 다른 글
[Programmers] [1차] 추석 트래픽 (0) | 2022.04.18 |
---|---|
[Programmers] [1차] 셔틀버스 (0) | 2022.04.15 |
[Programmers] 양궁대회 (0) | 2022.03.15 |
[Programmers] JadenCase 문자열 만들기 (0) | 2022.03.13 |
[Programmers] 행렬의 곱셈 (0) | 2022.03.12 |