2021.04.19
24일차
입사 43일차.
나는 일단 좋다 싶으면 시작한다.
사서 일을 하거나 일을 벌여 놓는 스타일이라는 뜻이다.
현재 진행중인 리액트를 이용한 ToDoList, 학교후배와 진행하는 하이브리드 웹 프로젝트를 퇴근시간과 주말을 이용하여 진행중인데 남는 시간에 백준, 프로그래머스, 코드업에서 문제를 풀어보기로 했다.
1. 문제
문제 설명
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로 가입하는 유저들이 카카오 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것입니다.
"네오"는 다음과 같이 7단계의 순차적인 처리 과정을 통해 신규 유저가 입력한 아이디가 카카오 아이디 규칙에 맞는 지 검사하고 규칙에 맞지 않은 경우 규칙에 맞는 새로운 아이디를 추천해 주려고 합니다. 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다. |
크게 어렵지 않은 문제다.
이런 문제들을 풀때는 코딩테스트에 유용한 메소드들을 많이 사용해보고 필요할때 가져다 쓰면 된다.
2. 풀이
class Solution { public String solution(String new_id) { String answer = new_id; // 1단계(소문자로 변환) // String변수명.toLowerCase(); 를 사용하면 문자열안의 대문자를 찾아서 소문자로 변환시켜준다. answer = answer.toLowerCase(); // 2단계(특수문자 제거) // 정규표현식을 사용한다. 문제에서 소문자, 숫자, 특수문자( '-', '_', '.' ) 만을 허용했기 때문에, Not을 뜻하는 ^를 사용 // 일치하지 않는 문자들을 ""로 치환 String chk2 = "[^a-z0-9-_.]"; answer = answer.replaceAll(chk2, ""); // 3단계(연속된 .제거) // [ ]뒤의 {n, }는 괄호안의 문자의 최소반복횟수를 뜻한다. 최소2번이상 반복되면 반복되는 모든 문자들을 치환하는 방법 String chk3 = "[.]{2,}"; answer = answer.replaceAll(chk3, "."); // 4단계(첫,마지막 글자 .제거) // ^[ ]는 시작문자, [ ]$는 끝문자를 뜻한다. 일치할 경우 치환하는 방식을 사용했다. String chk4 = "^[.]|[.]$"; answer = answer.replaceAll(chk4, ""); // 5단계(빈 문자열이면 'a') // 내가 이 문제를 포스팅하게 된 계기다. 이클립스에서 answer == ""를 작성했을 때 제대로 작동했지만 // 프로그래머스에서는isEmpty()만 제대로 작동한다. if(answer.isEmpty()) answer = "a"; // 6단계(15자까지 표시) // substring(시작Index, 끝Index)를 사용해서 15자리까지만 표시하도록 문자열을 잘랐다. if(answer.length() >= 16) { answer = answer.substring(0, 15); String chk6 = "[.]$"; answer = answer.replaceAll(chk6, ""); } // 7단계(2자리 이하면 마지막글자를 반복) // charAt( Index )은 Index에 해당하는 문자 1개를 표시한다. // Index는 0부터 시작하므로, (문자열의 총 길이 - 1) 은 마지막을 표시하는 Index 이다. while (answer.length() < 3) { answer += answer.charAt(answer.length()-1); } return answer; } } |
isEmpty() 때문에 소중한 30분이 날아가버렸다.
실제 코딩테스트에 참여했다면 1문제를 더 풀 수 있는 시간을 날려버린셈이다.
조금 더 유연하게 대처하지 못한 나에게 화가 나는 문제였다,
'코딩테스트' 카테고리의 다른 글
[코테/JAVA] 2021 카카오 채용연계형 인턴십 : 숫자 문자열과 영단어 (0) | 2021.10.11 |
---|---|
[코테/JAVA] 월간 코드 챌린지 시즌3 : 없는 숫자 더하기 (0) | 2021.10.11 |
[코테/JAVA] 월간 코드 챌린지 시즌1 : 내적 (0) | 2021.05.06 |
[코테/JAVA] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) : 행렬 테두리 회전하기 (0) | 2021.05.02 |
[코테/JAVA] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) : 로또의 최고 순위와 최저 순위 (0) | 2021.04.27 |
댓글