알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://programmers.co.kr/learn/courses/30/lessons/12918
코딩테스트 연습 - 문자열 다루기 기본
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다. 제한 사항 s는 길이 1
programmers.co.kr
Think🤔
모든 문자가 숫자면 true를 리턴해준다.
charAt으로 하나하나 비교해서 각 자리의 값이 1~9사이면 true를 반환 하나라도 틀리면 false를 반환하게 한다.
Solution✍
class Solution {
public boolean solution(String s) {
boolean answer = true;
if(s.length() != 4 && s.length() != 6){
return false;
}
for(int i=0; i<s.length(); i++){
if(s.charAt(i) < 48 || s.charAt(i) > 57){
return false;
}
}
return answer;
}
}
문제를 보면 문자열의 길이가 4 또는 6이므로 길이가 1,2,3 같은 조건에 맞지 않으면 false를 반환시켜 줘야한다.
아스키 코드를 이용해서 48~57까지가 숫자 0~9를 나타내므로 그 사잇값이 아닌 값이 나오면 false를 리턴하면 된다.
Review🤩
엄청난 코드를 두 가지 봤다.
하나는 try catch문을 이용해서 NumberFormatException의 예외가 발생하면 false를 리턴하는 방식이고,
다른 하나는 매치스를 이용한 방법이다.
class Solution {
public boolean solution(String s) {
if(s.length() == 4 || s.length() == 6){
try{
int x = Integer.parseInt(s);
return true;
} catch(NumberFormatException e){
return false;
}
}
return false;
}
}
직접 작성해 보았고, int x라는 변수를 하나 만들어서 형 변환이 불가능 하면 NumberFormatException이 발생해서 false를 반환 시킨다. 하지만 예외는 실제 예외 상황일때만 사용하는거라 적절하지는 않은 것 같다.
class Solution {
public boolean solution(String s) {
if(s.length() == 4 || s.length() == 6){
return s.matches("(^[0-9]*$)");
}
return false;
}
}
matches를 살펴보면
^ : 문자열 시작
$ : 문자열 종료
* : 앞 문자가 없을 수도 무한정 많을 수도
[] : 문자의 집합이나 범위를 나타내면 - 기호로 범위를 나타냄
여기서 좀 더 나아가서 길이 검사도 정규식으로 표현할 수 있다고 한다.
class Solution {
public boolean solution(String s) {
return s.matches("(^[0-9]{4}|{6}$)");
}
}
단 한줄로 길이까지 검사했다.
{} : 횟수 또는 범위를 나타낸다고 한다. 총 4번 나오거나 6번 나오면 범위에 맞음
'Algorithm' 카테고리의 다른 글
[프로그래머스] 서울에서 김서방 찾기 (0) | 2021.12.12 |
---|---|
[프로그래머스] [1차] 비밀지도 (0) | 2021.12.12 |
[프로그래머스] 문자열 내 마음대로 정렬하기 (0) | 2021.12.07 |
[프로그래머스] 문자열을 정수로 바꾸기 (0) | 2021.12.06 |
[프로그래머스] 문자열 내림차순으로 배치하기 (0) | 2021.12.03 |