Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240622 페어프로그래밍(내 코드는 내가 이해해야지..!) 본문

개발Article

[TIL]20240622 페어프로그래밍(내 코드는 내가 이해해야지..!)

최밤빵 2024. 6. 23. 02:10

오늘의 페어 프로그래밍! ( 또 다른 전공자 동원님과 페어팀이 되었다.)

오늘은 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주차지만 새로운 팀원들을 만나면서 하루하루 배워가는게 늘어가고있어서 많은 배움과 동시에 반성도 하게 된 하루였다. 코드 뜯어보느라 너무 많은시간이 지났다. 다시 공부하러 갑니다!