밤빵's 개발일지
[TIL]20240622 페어프로그래밍(내 코드는 내가 이해해야지..!) 본문
오늘의 페어 프로그래밍! ( 또 다른 전공자 동원님과 페어팀이 되었다.)
오늘은 6번부터 11번까지 문제를 풀었다.
어제 TIL을 정리하고, 문제를 조금씩 봤는데 어렵다..... 이제는 봤던 문제들도 아니라서 새벽부터 풀어보기 시작.
▶ 7번 문제 : 자연수 뒤집어 배열로 만들기
큰 숫자 'n'을 받아서 그 숫자의 각 자리 숫자를 배열에 담아서 반환한다.
class Solution {
public int[] solution(long n) {
int length = Long.toString(n).length();
int[] answer = new int[length];
for (int i = 0; i < length; i++) {
answer[i] = (int) (n % 10);
n /= 10;
}
return answer;
}
}
int length = Long.toString(n).length(); → 숫자 n을 문자열로 변환 해서 그 길이를 구한다. n이 12345 라면 문자열의 길이는 5. 그래서 length의 길이는 5가 된다.
int[] answer = new int[length]; → length 길이 만큼의 빈 배열을 만들어준다. 이 배열에 각 자리 숫자를 넣을거다.
for ( int i = 0; i < length; i ++) {
answer[ i ] = (int) (n%10);
n /= 10;
} → for반복문에서 index = 0 length보다 작을 때 까지 하나씩 증가하면서 반복한다.
answer의 배열은 처음에 [0, 0, 0, 0, 0]
첫 번째 반복,
n % 10 = 5
answer [0]에 5를 넣는다. 배열은 [ 5, 0, 0, 0, 0]이 된다.
n = 12345/ 10 = 1234가 된다.
두 번째 반복,
n % 10 = 4
answer [1]에 4를 넣는다. 배열은 [ 5, 4, 0, 0, 0 ]이 된다.
n = 1234 / 10 = 123이 된다.
세 번째 반복,
n % 10 = 3
answer [2]에 3를 넣는다. 배열은 [ 5, 4, 3, 0, 0]이 된다.
n = 12345/ 10 = 12가 된다.
네 번째 반복,
n % 10 = 2
answer [3]에 2를 넣는다. 배열은 [ 5, 4, 3, 2, 0]이 된다.
n = 12345/ 10 = 1이 된다.
다섯 번째 반복,
n % 10 = 1
answer [4]에 1을 넣는다. 배열은 [ 5, 4, 3, 2, 1]이 된다.
n = 12345/ 10 = 1이 된다.
n = 1 /10 은 0이 된다.
[5, 4, 3, 2, 1]이 반환된다.
answer[ i ] = (int) (n%10); → n을 10으로 나눈 나머지. 나머지 수를 answer 배열의 1번째 칸에 넣는다.
n이 12345라면 12345 % 10 = 5 answer[0]에 5를 넣는다.
n /= 10; → n을 10으로 나눠서 마지막 자리 숫자를 제거한다.
n이 12345 라면 12345 / 10 = 1234가 된다.
모든 자리 숫자를 배열에 넣은 후 return anwer; 로 배열을 반환한다.
▶ 8번 문제 : 문자열을 정수로 바꾸기
말 그대로 문자열을 정수로 변환한다.
class Solution {
public int solution(String s) {
int answer = 0;
String data = "";
for(int i=0; i<s.length(); i++){
data += s.charAt(i);
}
return Integer.parseInt(data);
}
}
String data = ""; → 문자열 data에 String s의 각 문자를 하나씩 넣는다.
for (int i = 0; i < s.length() ; i ++) {
data += s.charAt(i);
} → i가 0부터 s.length()보다 작을 때 까지 하나씩 증가하면서 반복된다.
data += s.charAt(i); 는 s의 i번째 문자를 data에 추가한다.
String s 가 12345 일 때,
첫 번째 반복,
s. charAt (0) 은 1 이니까 data는 "1" 이 된다.
두 번째 반복,
s. charAt (1) 은 2니까 data는 "12" 가 된다.
세 번째 반복,
s. charAt (2) 는 3 이니까 data는 "123" 이 된다.
네 번째 반복,
s. charAt (3) 은 4니까 data는 "1234" 가 된다.
다섯 번째 반복,
s. charAt (4) 는 5니까 data는 "12345" 가 된다
반복이 끝난 후 data는 "12345" 가 된다.
return Integer.parseInt(data); →는 문자열 data를 정수로 변환한다.
12345 가 된다.
"parse메서드는 문자열을 숫자나 다른 데이터 타입으로 변환해주는 역할을 한다. "
▶ 9번 문제 : 정수 제곱근 판별
숫자 'n'이 어떤 숫자 'i'의 제곱인지 확인하고, 만약 그렇다면 'i'보다 1큰 수의 제곱을 반환한다. 만약 'n'이
어떤 숫자의 제곱이 아니라면 -1을 반환한다.
class Solution {
public long solution(long n) {
long answer = 0;
for (long i = 1; i <= n; i++) {
if (i * i == n) {
answer = (i + 1) * (i + 1);
break;
}
else answer = -1;
}
return answer;
}
}
long answer = 0; → aswer에 처음에 0을 넣어둔다.
for(long i = 1; i <= n; i++) {
if ( i * i == n) {
answer = ( i + 1) * ( i + 1);
break;
} else answer = - 1; → for문은 반복해서 1부터 n까지 하나씩 증가하면서 반복한다.
숫자 n이 9 라면,
answer은 처음에 0. 반복문 시작.
i가 1일 때 1 * 1 = 9 가 아니니까 answer = -1
i가 2일 때 2 * 2 = 9 가 아니니까 answer = -1
i가 3일 때 3 * 3 = 9 가 맞다. 그래서 ( 3 + 1 ) * ( 3 + 1)인 16을 answer에 저장하고, 반복문 종료!
if ( i * i == n) 은 i의 제곱이 n과 같은지 확인하고, 만약 같다면 n은 i의 제곱이다.
anwer에 저장 했을때 참이면 break;로 반복문을 종료한다.
만약 거짓이라면, answer에 -1을 설정하고 계속 반복 되면서 참인 i를 찾지못하면 answer은 -1이 된다.
▶ 10번 문제 : 정수 내림차순으로 배치하기.
→ 이 문제는 아직 풀지못해서, 다른 풀이들을 봐도 잘 모르겠어서, 내일도 풀어보고 수정 할 예정🫨
알아 둘 메서드 :
split(); : 긴 문자열을 잘라서 여러 개의 작은 문자열로 만든다.
예를 들어 "hello world" 라는 문자열이 있다고 하면, split(,); 메서드를 사용해서 ,를 기준으로 나누면
'hello' , 'world' 두 개의 단어로 나눌 수 있다.
text = "apple, banana, cherry" 이 text를 쉼표를 기준으로 문자열을 잘라서 세 개의 과일 이름 리스트를 만들 수 있다.
result = text.split( ' , ')
print(result) = ['apple', 'banana', 'cherry']
Arrays.sort(); : 배열 안에 있는 숫자나 글자들을 순서대로 정렬해주는 메서드다. 숫자를 작은 수 부터 큰 수로 나열하거나, 글자를 알파벳 순서대로 나열하는 것을 말한다.
예를 들어,
int [ ] numbers = { 5, 2, 9, 1, 5, 6};
Arrays.sort(numbers);
print(Arrays.toString(numbers));
출력 : [ 1, 2, 5, 5, 6, 9]
Arrays.sort(str_arr,Collections.reverseOrder()); : 배열 내림차순 정렬
▶ 11번 문제 : 하샤드 수
x가 하샤드 수인지 확인하는 문제. 하샤드 수란 숫자 x가 각 자리 숫자의 합으로 나누어지는 숫자 이다.
class Solution {
public boolean solution(int x) {
boolean answer = true;
int sum = 0;
while (true) {
sum += x % 10;
if (x < 10) break;
x = x / 10;
}
return answer = (x % sum == 0)? true:false;
}
}
boolean answer = true; → boolean의 기본값을 true로 설정한다.
int sum = 0; → x의 각 자리 숫자의 합을 저장할 변수 .
while ( true ) {
sum += x % 10;
if ( x < 10)
break;
x = x / 10;
} → while 반복문으로 sum += x % 10; 은 x의 나머지 숫자를 sum에 더한다.
예를 들어, x가 123이라면 123 % 10 은 3. sum + 3
숫자 x를 18로 설정했을 때,
answer은 true, sum 은0
첫 번째 반복,
sum += 18 % 10 → sum = 8
x = 18 / 10 → x = 1 ( 한 자리 수니까 반복 종료!)
if ( x < 10) break; sms x가 한 자리 수가 되면 반복문을 종료한다.
예를 들어, x가 3이라면 더 이상 나눌 필요가 없으니 반복문을 끝낸다.
x = x / 10; 은 x를 10으로 나눠서 나머지 수를 제거한다.
return answer = ( x % sum == 0 ) ? true : false; → x가 sum으로 나눠 떨어지는지를 확인한다.
나누어 떨어지면 true 아니면 false를 반환한다. < 삼항 연산자 >
18 % 8 == 0 이 아니니까 false를 반환 한다.
😯오늘의 회고
오늘도 페어프로그래밍을 하면서 많은 걸 느꼈다. 동원님이 네비게이터로 내가 푼 문제들에 대해 부분질문을 하셨는데 ,
나는 내가 풀어놓고도 내 코드를 설명하지 못했다. 이건 내가 내 코드에 대해 누군가에게 설명할 일 이없었으니 그런 걸 수도 있지만, 나는 아직 문제를 풀 때 이해하기보다 어디서 본 거 외워서 써먹는 느낌이라 그럴 수도 있을것같다. 내가 설명하지못하면 내 코드가 아니다! 라는 말에 오늘 종일 생각이 많아졌다. 어제 쓴 TIL에는 풀었으면 됐지란 생각에 간단히 적고 말았는데, 오늘은 일단 내 코드들을 뜯어보기 시작했다.(진도가 한참 느려서 마음은 급한 상태) 아직 많이 풀어 본 문제는 없지만, 확실히 알아도 하나하나 보니 이해되는게 다른 느낌이다. 고민하다가 못 푼 문제들은 접근방법을 구글링해서 따라하는 편이였는데, 그 뒤에도 다시 내 껄로 만들기 위한 연습을 해야겠다. 내 문제는 지금 문제를 푼다해도 다시 이 문제를 접했을 때, 아 나 이거 본 적있는데! 하면서 풀이를 찾고 그대로 풀어내는 방식이라 이건 이해를 했다고는 말할 수 없는 거였다. 아직 2주차지만 새로운 팀원들을 만나면서 하루하루 배워가는게 늘어가고있어서 많은 배움과 동시에 반성도 하게 된 하루였다. 코드 뜯어보느라 너무 많은시간이 지났다. 다시 공부하러 갑니다!
'개발Article' 카테고리의 다른 글
[TIL]20240624 JAVA3주차 다시 시작! (0) | 2024.06.25 |
---|---|
[WIL]20240623 객체지향프로그래밍/JVM (0) | 2024.06.23 |
[TIL]20240621 혼란의 본 과정 5일차... 인텔리제이 에러 (0) | 2024.06.22 |
[TIL]20240620 2주차에서 못 벗어나고 있다..! (1) | 2024.06.21 |
[TIL]20240619 JAVA2주차 뿌시기 (0) | 2024.06.20 |