일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- dfs
- BOJ
- SWEA
- 카카오블라인드코딩테스트
- 리액트
- React.js
- Algorithm
- Java
- 백준
- programmers
- 달빛클럽1기
- 노마드코더
- SoftwareExpertAcademy
- 알고리즘
- 달빛클럽 1기
- 재귀
- JPA
- 프로그래머스
- 노마드코더 강의
- 인플레이션에서 살아남기
- Array
- React
- 달빛캠퍼스
- Stack
- 경제공부
- 달빛클럽
- ReactJS로 영화 웹 서비스 만들기
- 자바
- HashMap
- 완전탐색
- Today
- Total
th42500의 TIL
[Java] 2021 KAKAO BLIND RECRUIMENT- 신규 아이디 추천 본문
https://programmers.co.kr/learn/courses/30/lessons/72410?language=java
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
오늘의 알고리즘 스터디 문제는 쉽지만 많은 것들을 배울 수 있었던 문제 였다.
✔ 입출력 예시
💡 포인트
1️⃣ 각 규칙의 단계에 맞게 순서대로 과정이 이루어져야 한다.
2️⃣ 정규표현식을 사용하면 더 효율적인 코드를 구현할 수 있다.
1️⃣ 정규표현식을 사용하지 않은 첫번째 시도
❓ 풀이과정
1️⃣ toLowerCase()를 이용하여 모두 소문자로 변경
2️⃣ 문자열 new_id를 char형으로 분리하여 제시된 조건에 부합할 경우에만 StringBuilder에 append()
3️⃣ 연속된 .이 없을 때까지 while문을 이용해서 . 한 개로 변환
4️⃣ 문자열의 첫번째 문자와 마지막 문자 모두를 검사하고 .이 있다면 substring()을 이용하여 . 문자열 제거
5️⃣ ~ 6️⃣ 문자열의 길이에 따라 단계 시행
7️⃣ 만약, 1️⃣ ~ 6️⃣의 단계를 수행한 new_id의 길이가 3보다 작다면 3이상이 될때까지 while문을 이용하여 마지막 문자 추가
✔ 소스코드
public class Solution { // 신규 아이디 추천
public static void main(String[] args) {
String new_id = "...!@BaT#*..y.abcdefghijklm";
// String new_id = "z-+.^.";
// String new_id = "=.=";
// String new_id = "123_.def";
// String new_id = "abcdefghijklmn.p";
// String new_id = ".....";
// String new_id = "a";
// String new_id = "/dfeSg/Ew.";
System.out.println(solution(new_id));
}
private static String solution(String new_id) {
// 1단계
new_id = new_id.toLowerCase();
// System.out.println("1단계 : " + new_id);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < new_id.length(); i++) {
char ch = new_id.charAt(i);
if (('a' <= ch && ch <= 'z') || ('0' <= ch && ch <= '9') || ch == '-' || ch == '_' || ch == '.') { // 2단계
sb.append(ch);
}
}
new_id=sb.toString();
// System.out.println("2단계 : " + new_id);
// 3단계
while(new_id.contains("..")) {
new_id = new_id.replace("..", ".");
}
// System.out.println("3단계 : " + new_id);
// 4단계
if(new_id.charAt(0) == '.') {
new_id = new_id.substring(1);
}
if(new_id.length() >= 1 && new_id.charAt(new_id.length()-1) == '.') {
new_id = new_id.substring(0, new_id.length()-1);
}
// System.out.println("4단계 : " + new_id);
if (new_id.length() == 0) { // 5단계
new_id = "a";
} else if (new_id.length() >= 16) { // 6단계
// System.out.println("16자 이상입니다.");
new_id = new_id.substring(0, 15); // 문자열 자르기
if (new_id.charAt(new_id.length() - 1) == '.') {
new_id = new_id.substring(0, new_id.length()-1);
}
}
// System.out.println("5~6단계 : " + new_id);
// 7단계
if (new_id.length() <= 2) {
char ch = new_id.charAt(new_id.length() - 1);
while (true) {
if (new_id.length() >= 3) {
break;
}
new_id += ch;
}
}
// System.out.println("7단계 : " + new_id);
return new_id;
}
}
2️⃣ 정규표현식을 사용하지 않은 두번째 시도
❓ 풀이과정
👉 풀이 방법은 위와 같다 다만 스터디원들과 함께 리뷰를 한 결과 코드를 더 깔끔하게 작성할 수 있는 방법을 알아냈다.
2️⃣ Character.isLowerCase()로 소문자인지 확인, Character.isDigit()로 숫자인지 확인
4️⃣ startsWith()로 첫 문자 판단, endsWith()로 마지막 문자 판단
✔ 소스코드
public class Solution { // 신규 아이디 추천
public static void main(String[] args) {
String new_id = "...!@BaT#*..y.abcdefghijklm";
// String new_id = "z-+.^.";
// String new_id = "=.=";
// String new_id = "123_.def";
// String new_id = "abcdefghijklmn.p";
// String new_id = ".....";
// String new_id = "a";
// String new_id = "/dfeSg/Ew.";
System.out.println(solution(new_id));
}
private static String solution(String new_id) {
// 1단계
new_id = new_id.toLowerCase();
// System.out.println("1단계 : " + new_id);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < new_id.length(); i++) {
char ch = new_id.charAt(i);
if (Character.isLowerCase(ch) || Character.isDigit(ch) || ch == '-' || ch == '_' || ch == '.') { // 2단계
sb.append(ch);
}
}
new_id=sb.toString();
// System.out.println("2단계 : " + new_id);
// 3단계
while(new_id.contains("..")) {
new_id = new_id.replace("..", ".");
}
// System.out.println("3단계 : " + new_id);
// 4단계
if(new_id.startsWith(".")) {
new_id = new_id.substring(1);
}
if(new_id.endsWith(".")) {
new_id = new_id.substring(0, new_id.length()-1);
}
// System.out.println("4단계 : " + new_id);
if (new_id.length() == 0) { // 5단계
new_id = "a";
} else if (new_id.length() >= 16) { // 6단계
// System.out.println("16자 이상입니다.");
new_id = new_id.substring(0, 15); // 문자열 자르기
if (new_id.charAt(new_id.length() - 1) == '.') {
new_id = new_id.substring(0, new_id.length()-1);
}
}
// System.out.println("5~6단계 : " + new_id);
// 7단계
if (new_id.length() <= 2) {
char ch = new_id.charAt(new_id.length() - 1);
while (true) {
if (new_id.length() >= 3) {
break;
}
new_id += ch;
}
}
// System.out.println("7단계 : " + new_id);
return new_id;
}
}
해당 문제는 정규표현식을 사용하여 풀이를 하면 더 깔끔하다고 한다.
나중에 정규표현식을 사용한 소스코드도 업로드를 할 예정이다.
'Algorithm > Programmers' 카테고리의 다른 글
[Java] 프로그래머스 동적계획법(Dynamic Programming) Lv3 - 등굣길 (0) | 2022.04.18 |
---|---|
[Java] 프로그래머스 해시 Lv1 - 폰켓몬 (0) | 2022.04.04 |
[Java] 2019 카카오 개발자 겨울 인턴십 - 크레인 인형뽑기 게임 (0) | 2022.03.24 |
[Java] 2021 KAKAO BLIND RECRUITMENT - 메뉴리뉴얼 (0) | 2022.03.22 |
[Java] 2019 KAKAO BLIND RECRUITMENT - 오픈채팅방 (0) | 2022.03.17 |