Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[온보딩] - 박준수 Problem1 문제 제출합니다. #7

Open
wants to merge 58 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
cecf2e5
feat: 기능목록/에러 처리 정의
GaBaljaintheroom Jul 12, 2023
8752a4e
feat: 페이지 입력 받기
GaBaljaintheroom Jul 12, 2023
966512d
feat: 페이지 최대합 메서드
GaBaljaintheroom Jul 12, 2023
7579e64
feat: 페이지 최대곱 메서드
GaBaljaintheroom Jul 12, 2023
ec1a5cb
feat: 페이지 최대값 메서드
GaBaljaintheroom Jul 12, 2023
997e1d7
feat: 승자 구하는 메서드
GaBaljaintheroom Jul 12, 2023
ab00a1e
refactor: 승자 구하는 메서드 수정
GaBaljaintheroom Jul 12, 2023
aeab2b7
fix: 스트림 재할당 문제 해결
GaBaljaintheroom Jul 12, 2023
f8f551b
feat: 책 페이지 에러 기능정의 추가
GaBaljaintheroom Jul 12, 2023
8d149d4
feat: 책 페이지 불일치 에러 처리 메서드 추가
GaBaljaintheroom Jul 12, 2023
e2a394d
feat: 책 시작/마지막 페이지 에러 처리 메서드 추가
GaBaljaintheroom Jul 12, 2023
c509bfa
fix: 페이지 에러 처리 수정
GaBaljaintheroom Jul 12, 2023
2dac8d3
feat: 페이지 길이 에러 처리 추가
GaBaljaintheroom Jul 12, 2023
979a687
feat: 페이지 입력 전체 에리 식별 메소드 추가
GaBaljaintheroom Jul 12, 2023
a468627
refactor: util 패키지 분리
GaBaljaintheroom Jul 12, 2023
abdec91
Test: ErrorHandler 테스트코드 작성
GaBaljaintheroom Jul 13, 2023
2305b5f
Test: finWinner테스트 코드 작성
GaBaljaintheroom Jul 13, 2023
359a6c8
Test: PageHandler테스트 코드 작성
GaBaljaintheroom Jul 13, 2023
a2e7edb
feat: 기능 목록/에러처리 정의
GaBaljaintheroom Jul 13, 2023
993d7ef
feat: String을 Stack으로 변경하는 메서드 추가
GaBaljaintheroom Jul 13, 2023
975574a
feat: 중복된 문자 제거 메서드 추가
GaBaljaintheroom Jul 13, 2023
afc3db3
feat: 결과 반환 메서드 추가
GaBaljaintheroom Jul 13, 2023
0331c21
refactor : 중복확인 메서드 추가
GaBaljaintheroom Jul 13, 2023
b47d87a
feat: Cryptogram 길이 에러 처리 메서드 추가
GaBaljaintheroom Jul 13, 2023
8f4a9be
feat: Cryptogram 소문자 에러처리 메서드 추가
GaBaljaintheroom Jul 13, 2023
dd9ab9b
refactor: 에러 핸들러 메소드 분리
GaBaljaintheroom Jul 13, 2023
ab7384c
feat: 기능목록/에러 처리 정의
GaBaljaintheroom Jul 14, 2023
36e6783
feat: 숫자 범위 에러처리 메소드 작성
GaBaljaintheroom Jul 14, 2023
0106e2a
feat: 3,6,9횟수 반환하는 메소드 작성
GaBaljaintheroom Jul 14, 2023
0af20f9
feat: 3,6,9포함 확인 메서드 작성
GaBaljaintheroom Jul 14, 2023
11686fd
feat 3,6,9 횟수 증가 메서드 작성
GaBaljaintheroom Jul 14, 2023
2567051
feat: 람디식 메서드 추가
GaBaljaintheroom Jul 14, 2023
0b07754
feat: 기능 목록/에러 처리 정의
GaBaljaintheroom Jul 17, 2023
68c870a
feat: 알파벳 매핑 메서드 작성
GaBaljaintheroom Jul 17, 2023
ac50d75
feat: 알파벳 대소문자 변경 메소드 작성
GaBaljaintheroom Jul 17, 2023
d02ea67
feat: 문제 결과 반환 메서드 작성
GaBaljaintheroom Jul 17, 2023
348ccc1
feat: Alphabet, Sentence 도메인 분리
GaBaljaintheroom Jul 17, 2023
1487fc5
feat: 알파벳 상수 추출
GaBaljaintheroom Jul 17, 2023
5b98e1c
feat: 기능 목록/에러 처리 정의
GaBaljaintheroom Jul 23, 2023
f8eca92
feat: Main 입력값 Map으로 변환 메서드 작성
GaBaljaintheroom Jul 23, 2023
4a4b256
feat: Main 입력값 중 닉네임 List로 변환 메서드 작성
GaBaljaintheroom Jul 23, 2023
174ea3b
feat: 중복된 닉네임의 이메일 저장 메서드 작성
GaBaljaintheroom Jul 23, 2023
d56ac72
feat: 크루 개수 에러 처리 메서드 작성
GaBaljaintheroom Jul 23, 2023
c5e1585
feat: 이메일 형식 에러 처리 메서드 작성
GaBaljaintheroom Jul 23, 2023
813c83a
feat: 이메일 길이 에러 처리 메서드 작성
GaBaljaintheroom Jul 23, 2023
2866bd0
feat: 닉네임 길이 에러 처리 메서드 작성
GaBaljaintheroom Jul 23, 2023
0f7fff2
feat: 닉네임 한글 에러 처리 메서드 작성
GaBaljaintheroom Jul 23, 2023
0c4a9b4
refactor: crew 객체 분리
GaBaljaintheroom Jul 23, 2023
b4d89ca
refactor: Crew 클래스 수정
GaBaljaintheroom Jul 24, 2023
3b7e5ea
feat: Crews 객체 분리
GaBaljaintheroom Jul 24, 2023
068fb9f
feat: NameSeparate 객체 분리
GaBaljaintheroom Jul 24, 2023
97a37ce
refactor: 크루 수 에러처리 메서드
GaBaljaintheroom Jul 24, 2023
ee46a77
refactor: 이메일 형식 에러처리 메서드
GaBaljaintheroom Jul 24, 2023
5b4923e
refactor: 이메일 길이 에러처리 메서드
GaBaljaintheroom Jul 24, 2023
b19d429
refactor: 닉네임 길이 에러처리 메서드
GaBaljaintheroom Jul 24, 2023
3bff344
refactor: 닉네임 한글 에러처리 메서드
GaBaljaintheroom Jul 24, 2023
baf0783
refactor: 에러처리 오류 해결
GaBaljaintheroom Jul 24, 2023
ad37a30
refactor: duplicateNames 메서드 분리
GaBaljaintheroom Jul 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions docs/PROBLEM1.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,16 @@
| [97, 98] | [197, 198] | 0 |
| [131, 132] | [211, 212] | 1 |
| [99, 102] | [211, 212] | -1 |

## 기능 목록

1. 페이지의 각 자리 합을 구하는 메서드
2. 페이지의 각 자리 곱을 구하는 메서드
3. 페이지의 연산 중 가장 큰 수를 구하는 메서드
4. 포비와 크롱 중 점수를 비교해 승자를 구하는 메서드

## 에러 처리

1. 시작 면이나 마지막 면이 나오면 에러 발생
2. 포비와 크롱의 길이는 무조건 2 / 아니었을 때 에러 발생
3. 책 왼쪽, 오른쪽 페이지 불일치 에러 발생
11 changes: 11 additions & 0 deletions docs/PROBLEM2.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,14 @@
| --- | --- |
| "browoanoommnaon" | "brown" |
| "zyelleyz" | "" |

## 기능 목록

1. String을 Stack으로 변경하는 메서드
2. cryptogram에 중복된 문자열을 제거 메소드
3. 결과 반환 메서드

## 에러 처리

1. cryptogram의 길이가 1이상 1000이하가 아니면 에러
2. cryptogram이 소문자로만 이루어져 있지 않으면 에러
10 changes: 10 additions & 0 deletions docs/PROBLEM3.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,13 @@
| --- | --- |
| 13 | 4 |
| 33 | 14 |

## 기능 목록

1. 1부터 숫자까지 반복해서 3, 6, 9가 들어있는 횟수를 반환하는 메소드
2. 3,6,9 횟수 증가 메소드
3. 문자열에 3, 6, 9가 있는지 판단하는 메소드

## 에러 처리

1. 숫자의 범위는 1부터 10,000 이하
10 changes: 10 additions & 0 deletions docs/PROBLEM4.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,13 @@
| word | result |
| --- | --- |
| "I love you" | "R olev blf" |

## 기능 목록

1. 알파벳표를 반대 알파벳으로 매핑하는 메서드
2. 알파벳 대소문자 판별 메서드
3. 문제 결과를 반환하는 메서드

## 에러 처리

1. word의 길이 에러 처리
15 changes: 15 additions & 0 deletions docs/PROBLEM6.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,18 @@
| forms | result |
| --- | --- |
| [ ["[email protected]", "제이엠"], ["[email protected]", "제이슨"], ["[email protected]", "워니"], ["[email protected]", "엠제이"], ["[email protected]", "이제엠"] ] | ["[email protected]", "[email protected]", "[email protected]"] |


## 기능 목록

1. 두 글자 이상 연속 판단 메서드
2. 중복된 닉네임의 이메일을 저장하는 메서드
3. 결과 오름차순 정렬 후 중복 제거 메서드

## 에러 처리

1. 크루의 개수 에러 처리
2. 이메일 형식 에러 처리
3. 이메일 길이 에러 처리
4. 닉네임 길이 에러 처리
5. 닉네임 한글 에러 처리
23 changes: 21 additions & 2 deletions src/main/java/onboarding/Problem1.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,29 @@
package onboarding;


import java.util.List;
import java.util.stream.Stream;

import static onboarding.problem1.util.ErrorHandler.isNotCorrectPage;
import static onboarding.problem1.util.PageHandler.*;
import static onboarding.problem1.util.findWinner.getWinner;


class Problem1 {


public static final int isNotCorrectPage = -1;


public static int solution(List<Integer> pobi, List<Integer> crong) {
int answer = Integer.MAX_VALUE;
return answer;

if (isNotCorrectPage(pobi) || isNotCorrectPage(crong)) {
return isNotCorrectPage;
}
int pobiMaxPage = getMaxPage(getPageSumMax(pobi), getPageMultiMax(pobi));
int crongMaxPage = getMaxPage(getPageSumMax(crong), getPageMultiMax(crong));

return getWinner(pobiMaxPage, crongMaxPage);

}
}
47 changes: 45 additions & 2 deletions src/main/java/onboarding/Problem2.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,51 @@
package onboarding;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Objects;

import static onboarding.problem2.CrypErrorHandler.checkCryptogram;

public class Problem2 {
public static String solution(String cryptogram) {
String answer = "answer";
return answer;

checkCryptogram(cryptogram);
Deque<Character> cryptogramStack = convertStringToStack(cryptogram);
Deque<Character> resultStack = removeDuplicateChar(cryptogramStack);

return resultPassword(resultStack);
}

private static Deque<Character> convertStringToStack(String cryptogram){
Deque<Character> stack = new ArrayDeque<Character>();
for (char word : cryptogram.toCharArray()){
stack.add(word);
}
return stack;
}

private static Deque<Character> removeDuplicateChar(Deque<Character> cryptogram) {
Deque<Character> resultStack = new ArrayDeque<Character>();
while (!cryptogram.isEmpty()){
Character word = cryptogram.removeFirst();
if (isDuplicate(resultStack, word)){
resultStack.removeLast();
continue;
}
resultStack.addLast(word);
}
return resultStack;
}

private static String resultPassword(Deque<Character> resultStack) {
StringBuilder password = new StringBuilder();
while (!resultStack.isEmpty()){
password.append(resultStack.removeFirst());
}
return password.toString();
}

private static boolean isDuplicate(Deque<Character> resultStack, Character word) {
return !resultStack.isEmpty() && Objects.equals(word, resultStack.peekLast());
}
}
51 changes: 49 additions & 2 deletions src/main/java/onboarding/Problem3.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,55 @@
package onboarding;

import java.util.stream.IntStream;

public class Problem3 {

public static final String NUMBER_RANGE_ONE_TO_THOUSAND = "숫자의 범위는 1부터 10000 이하입니다.";
public static final char TREE = '3';
public static final char SIX = '6';
public static final char NINE = '9';
public static int solution(int number) {
int answer = 0;
return answer;
validateNumberRange(number);
return getCount(number);
}

private static void validateNumberRange(int number) {
if (number < 1 || number > 10000){
throw new IllegalArgumentException(NUMBER_RANGE_ONE_TO_THOUSAND);
}
}

public static int getCount(int number){
int count = 0;
for (int i = 1; i <= number; i++){
String num = String.valueOf(i);
count = upCount(count, num);
}
return count;
}

private static int upCount(int count, String num) {
for (int j = 0; j < num.length(); j++){
if (isInclude369(num, j)){
count++;
}
}
return count;
}

private static boolean isInclude369(String num, int j) {
return num.charAt(j) == TREE || num.charAt(j) == SIX || num.charAt(j) == NINE;
}


// 람다식으로 바꾸었을 때
public static int getResult(int number){
return IntStream.rangeClosed(1, number)
.mapToObj(String::valueOf)
.mapToInt(num -> Math.toIntExact(num.chars()
.filter(ch -> ch == TREE || ch == SIX || ch == NINE)
.count()))
.sum();
}

}
6 changes: 4 additions & 2 deletions src/main/java/onboarding/Problem4.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package onboarding;

import onboarding.problem4.Sentence;

public class Problem4 {
public static String solution(String word) {
String answer = "";
return answer;
return new Sentence(word).getResult();
}

}
8 changes: 5 additions & 3 deletions src/main/java/onboarding/Problem6.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package onboarding;

import java.util.List;
import onboarding.problem6.Crews;

import java.util.*;

public class Problem6 {
public static List<String> solution(List<List<String>> forms) {
List<String> answer = List.of("answer");
return answer;
return new Crews(forms).getResultEmail();
}

}
35 changes: 35 additions & 0 deletions src/main/java/onboarding/problem1/util/ErrorHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package onboarding.problem1.util;

import java.util.List;

public final class ErrorHandler {

public static boolean validateLeftRightPage(List<Integer> user) {
if (user.get(0) == (user.get(1) - 1)) {
return true;
}
return false;
}

public static boolean validateStartOrEndPage(List<Integer> user) {
if (user.get(0) >= 1 && user.get(1) <= 400) {
return true;
}
return true;
}

public static boolean validatePageLength(List<Integer> user) {
if (user.size() == 2) {
return true;
}
return false;
}

public static boolean isNotCorrectPage(List<Integer> user) {
if (validateLeftRightPage(user) && validateStartOrEndPage(user) && validatePageLength(user)) {
return false;
}
return true;
}

}
30 changes: 30 additions & 0 deletions src/main/java/onboarding/problem1/util/PageHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package onboarding.problem1.util;

import java.util.List;
import java.util.stream.Stream;

public final class PageHandler {
public static Stream<String> getPage(List<Integer> user) {
return user.stream().map(Object::toString);
}

public static int getPageSumMax(List<Integer> user) {
Stream<String> page = getPage(user);
return page.mapToInt(str -> str.chars()
.map(Character::getNumericValue)
.sum())
.max().orElseThrow(NullPointerException::new);
}

public static int getPageMultiMax(List<Integer> user) {
Stream<String> page = getPage(user);
return page.mapToInt(str -> str.chars()
.map(Character::getNumericValue)
.reduce(1, (a, b) -> a * b))
.max().orElseThrow(NullPointerException::new);
}

public static int getMaxPage(int pageSumMax, int pageMultiMax) {
return Math.max(pageSumMax, pageMultiMax);
}
}
32 changes: 32 additions & 0 deletions src/main/java/onboarding/problem1/util/findWinner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package onboarding.problem1.util;

public final class findWinner {
public static final int CRONG_WIN = 2;
public static final int POBI_WIN = 1;
public static final int NO_WINNER = 0;

public static int getWinner(int pobiMaxPage, int crongMaxPage) {
if (isPobiWin(pobiMaxPage, crongMaxPage))
return POBI_WIN;

if (isCrongWin(pobiMaxPage, crongMaxPage))
return CRONG_WIN;

return NO_WINNER;
}

public static boolean isPobiWin(int pobiMaxPage, int crongMaxPage) {
if (pobiMaxPage > crongMaxPage) {
return true;
}
return false;
}

public static boolean isCrongWin(int pobiMaxPage, int crongMaxPage) {
if (crongMaxPage > pobiMaxPage) {
return true;
}
return false;
}

}
26 changes: 26 additions & 0 deletions src/main/java/onboarding/problem2/CrypErrorHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package onboarding.problem2;

public final class CrypErrorHandler {

public final static String CRYP_LENGTH_IS_ONE_TO_HUND= "1이상 1000이하인 문자열이어야합니다.";
public final static String CRYP_COMPOSE_BY_SMALL_LETTER = "cryptogram은 소문자로만 이루어져 있습니다.";
private static void validateCrypLength(String cryptogram) {
if (cryptogram.length() < 1 || cryptogram.length() > 1000){
throw new IllegalArgumentException(CRYP_LENGTH_IS_ONE_TO_HUND);
}
}

private static void validateCrypSmallLetter(String cryptogram) {
for (char word : cryptogram.toCharArray()){
if (!Character.isLowerCase(word)){
throw new IllegalArgumentException(CRYP_COMPOSE_BY_SMALL_LETTER);
}
}
}

public static void checkCryptogram(String cryptogram){
validateCrypLength(cryptogram);
validateCrypSmallLetter(cryptogram);
}

}
Loading