# Day3 피어세션_9조 --- ### **Soap** #### P2920 : 음계 1. Scanner 로 입력받은 문자열을 split 으로 배열에 저장 2. Arrays.toString 으로 문자열로 변환 3. ascending , descending, mix 판별 4. 결과 출력 #### P8958 : OX 퀴즈 1. Scanner 로 입력받은 문자열을 split 으로 배열에 저장 2. Scoring 함수를 만들어 지정된 횟수만큼 반복 3. score, add 변수를 두어 문자열 배열을 순회하며 채점 4. 결과 출력 #### P11654 : 아스키 코드 1. 문자열 형태로 입력받아 charAt(0) 으로 char 변환 2. (int) 로 char -> (int) 변환 : =아스키 코드 3. 결과 출력 -> 테스트 해보니 (int) 붙이지 않아도 int 변수에 저장할 때 자동 변환 --- ### **KAI** #### P2920 : 음계 - 풀이과정 1. readLine() 메서드를 이용하여 받은 문자열을 split을 사용하여 공백을 기준으로 잘라서 배열을 만든다. 2. sorted()메서드를 사용하여 배열의 오름차순과 내림차순을 비교하여 출력하도록 의도함. #### P8958 : OX 퀴즈 - 풀이과정 1. 반복문을 통해 O일 경우 count를 중첩시키고, count를 최종점수에 넣어서 표현하도록 한다 - 작업과정 1. 입력되는 테스트 횟수를 testCount 변수에 할당한다. 2. 입력된 숫자만큼 반복되고, 입력되는 문자열을 한 글자씩 oxStringArray배열의 한 인덱스에 담는다. 3. oxStringArray 배열에 있는 요소들을 차례대로 O가 맞으면 점수를 증가시켜서 총합점수에 중첩시킨다. 4. O가 아니면 X이기 때문에 점수를 0점으로 초기화한다. #### P11654 : 아스키 코드 - 작업과정 1. ascilValue : ascilValue자체가 이미 입력받은 문자에 대한 아스키값을 갖고 있다. Character 타입을 가져와 UInt8? 타입으로 반환하기 때문에 강제 언래핑을 해줌 --- ### **웨이드** #### P2920 : 음계 - 구현 방식 - BufferedReader를 이용해서 문자열을 입력받습니다. - StringTokenizer를 이용해 공백 기준으로 분리한 뒤 정수로 변환해 리스트에 담습니다. - 각각 오름차순, 내림차순으로 정렬돼 있는 리스트 객체를 생성합니다. - 입력값을 담은 리스트를 오름차순, 내림차순 리스트와 비교하여 결괏값을 담고 출력합니다. - 의견 - List 생성에 하드 코딩 대신 Int Stream 사용 #### P8958 : OX 퀴즈 - 구현 방식 - BufferedReader를 이용해서 문자열을 입력받고 정수로 변환해 테스트 케이스 변수에 저장합니다. - 테스트 케이스 개수만큼 반복문을 돌도록 설정하고 반복문마다 퀴즈의 결과인 문자열을 입력받습니다. - 다시 문자열의 길이만큼 반복문을 돌도록 설정하고 char 형 배열에 문자열의 원소들을 옮겨 담습니다. - 점수(score)와 연속된 횟수(count)를 나타내는 변수들을 각각 0으로 초기화합니다. - 다시 char 형 배열의 크기만큼 반복문을 돌도록 설정하고 문자가 'O'일 때는 count의 수를 1 증가시키고, score에 더해줍니다. 문자가 'X'일 때는 count를 다시 0으로 초기화시킵니다. - 각 테스트 케이스마다 점수를 출력합니다. - 팀원들의 방식 참고 - String[] test = bf.readLine().split(""); => split을 사용해 한 번에 배열에 담은 후, for-each문 사용 #### P11654 : 아스키 코드 - 구현 방식 - BufferedReader를 이용해서 문자열을 입력받습니다. - 문자열을 char 형으로 바꿀 수 있게 charAt을 사용합니다. - 아스키 코드값을 출력하기 위해 다시 int로 형 변환을 하여 출력합니다. - 팀원들의 방식 참고 - String 타입의 선언을 거치지 않고 바로 int 변수로 선언 - int n = System.in.read(); 사용 --- ### **yelly** - 공통 설계 의도: - `BufferedReader`가 사용자 입력을 버퍼해서 전달하기 때문에 `Scanner` 보다 입력 성능이 뛰어나기 때문에 사용. - 문자열 파싱에 `StringTokenizer`를 사용한 이유는 여러 개의 문자들을 하나씩 처리하기 용이한 메서드를 제공해주기 때문에 사용. #### J2920 : 음계 - 현재 음계가 이전 음계보다 높으면 `+1`, 낮으면 `-1`을 누적해서 더하면 마지막 계산된 누적값에 따라 연속해서 증가인지 감소인지를 알 수 있다. - 누적값이 +7이면 연속해서 증가했음을 의미 - 누적값이 -7이면 연속해서 감소했음을 의미 - +7도 -7도 아니면 증가와 감소를 반복했음을 의미 - `StringTokenizer`를 통해 반복문을 실행하면 맨 처음의 음계는 비교할 이전 음계가 없다. - 따라서 이전 음계 초기값은 1~8과 상관없는 값인 `9`로 설정 > 웨이드: `StringTokenizer`에 전달하는 구분자는 디폴트가 `" "`이라서 명시적으로 `" "`를 전달하지 않아도 된다. > 적용해볼 수 있는 방법: > Alex와 웨이드, Soap가 사용한 방법으로 List와 List는 `equals()`로 List의 내부 값이 모두 동일한지 비교가 가능하다. (Alex: Array도 가능) #### J8958 : OX 퀴즈 - 연속해서 정답을 맞출 때마다 연속인지 아닌지를 체크해주는 변수 `int chain`을 0으로 초기화 - 연속해서 정답을 맞출때 마다 `+1`씩 누적으로 더해준다. - 한 번이라도 틀리면 연속 기록이 깨지므로 `chain`은 0으로 초기화된다. - 매번 점수를 맞출 때마다 +1점씩이지만, 연속해서 맞출 경우 연속으로 맞춘 횟수만큼 추가 점수를 얻는다. > Alex: 연속을 체크해주는 `chain` 변수가 `0`이 아닌 `1`이면서 `chain`만 누적 점수에 더해주면 로직이 똑같아진다. #### J11654 : 아스키 코드 - `String.charAt(int index)`을 사용하면 문자열의 index에 해당하는 값을 추출할 수 있다. - 추출한 문자열을 `int` 타입으로 타입 캐스팅 해주면 ASCII 코드가 된다. > 적용해 볼 수 있는 방법: > Alex: `System.in.read()` -> 자바에서는 기본적으로 ASCII로 입력되므로 `System.in.read()`로 입력받은 값을 바로 타입 캐스팅하면 Swift 처럼 한 줄로 표현 가능. --- ### **Alex** #### P2920 : 음계 처음에 String answer =" "; 이렇게 초기화를 했는데, 나중에 불필요한 거 같아서 String answer; 이렇게 값을 안 넣어줌 String이 불변이라서 값을 변경하면 새로운 인스턴스를 만들고 그게 메모리 낭비가 될 거 같아서. 근데 요즘 가비지 컬렉터가 잘 돼 있어서 굳이 이 부분을 신경쓰지 않아도 될 거 같다. 근데, String answer; 를 하면 이게 null값이 되는 건데 null을 불필요하게 만들 필요는 없을 거 같다. 만약 실수로 잊어버리면 null값이 코드에 돌아다니기 때문. Optional을 의식적으로 써보기 #### P8958 : OX 퀴즈 변수를 여러개 쓰고 if를 여러개 쓰면서 가독성이 많이 떨어졌다. 변수를 많이 안 쓰는 방법을 고려하기 #### P11654 : 아스키 코드 int n = System.in.read(); 를 활용해서 바로 int값으로 받는 방법이 있었다. 자바에서는 가장 기본 입력 스트림이 InputStream 다. System.in은 InputStream 타입의 필드라고 한다. 그래서 System.in.read();를 할 때 int값으로 받는 것 같다. 원래 컴퓨터는 모든 입력값을 숫자로 받고서 그 다음에 야스키코드의 문자에 대응시켜 문자로 변환하는 것으로 알고 있다. char 타입으로 변환시키기 전의 원시값을 먼저 받는 방식으로 보인다.