9월 22일

Yullgiii·2023년 9월 22일
0
post-thumbnail

ADsP

오늘도 모의고사 슬슬 내일부터는 같이 할 사람이 구해져서 함께 복습을 할겸 다시 강의를 듣고
복습과 문제풀기를 병행할것이다.

내일 배움 캠프

알고리즘 문제를 풀어보고 시간이 된다면 CSS도 조금 해볼것이다.

Algorithm

문제 1. 점의 위치 구하기

문제 설명
사분면은 한 평면을 x축과 y축을 기준으로 나눈 네 부분입니다. 사분면은 아래와 같이 1부터 4까지 번호를매깁니다.

x 좌표와 y 좌표가 모두 양수이면 제1사분면에 속합니다.
x 좌표가 음수, y 좌표가 양수이면 제2사분면에 속합니다.
x 좌표와 y 좌표가 모두 음수이면 제3사분면에 속합니다.
x 좌표가 양수, y 좌표가 음수이면 제4사분면에 속합니다.
x 좌표 (x, y)를 차례대로 담은 정수 배열 dot이 매개변수로 주어집니다. 좌표 dot이 사분면 중 어디에 속하는지 1, 2, 3, 4 중 하나를 return 하도록 solution 함수를 완성해주세요.

제한사항
dot의 길이 = 2
dot[0]은 x좌표를, dot[1]은 y좌표를 나타냅니다
-500 ≤ dot의 원소 ≤ 500
dot의 원소는 0이 아닙니다.

class Solution {
    public int solution(int[] dot) {
        int x = dot[0];
        int y = dot[1];
        
        if ( x > 0 && y > 0) {
            return 1;
        } else if (x < 0 && y > 0) {
            return 2;
        } else if (x < 0 && y < 0) {
            return 3;
        } else {
            return 4;
        }
    }
}

풀이 순서....0단계인가보다 내가 풀수있으니까.
1.x와 y 좌표를 dot 배열로부터 가져와서!!
2.x와 y의 값에 따라 어느 사분면에 속하는지를 판별
3.x와 y 모두 양수일 경우: 제1사분면
4.x는 음수, y는 양수일 경우: 제2사분면
5.x와 y 모두 음수일 경우: 제3사분면
6.나머지 경우 (x는 양수, y는 음수): 제4사분면
이렇게 하면

입출력 예
| dot | result |
| --- | --- |
| [2, 4] | 1 |
| [-7, 9] | 2 |
나오게 된다

문제 2. 최댓값 만들기

문제 설명
정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

제한사항
0 ≤ numbers의 원소 ≤ 10,000
2 ≤ numbers의 길이 ≤ 100

import java.util.Arrays;

class Solution {
    public int solution(int[] numbers) {
        Arrays.sort(numbers);
        return numbers[numbers.length - 1] * numbers[numbers.length - 2];
    }
}

1.배열을 오름차순으로 정렬
2.가장 큰 값과 두 번째로 큰 값을 곱하여 최대값을 구함
그러면 문제 끝!!!!

회고

확실히 아무것도 하지 않을떄보다 쉬운 문제라도
고민을 해보며 풀어나가는것이 도움이 많이 된다고 느끼는중이다.

Java

이제 While 문부터 해서 문법을 복습을 할것이다!!!!!!!!!!
제발 복습해서 주말에는 끝내자!!!!!!!!!!

While && do while

while : 조건이 true일 동안 반복 수행

		//  💡 의도적인 무한 루프에 널리 쓰이는 코드
        while (true) {
            System.out.println("인간의 욕심은 끝이 없고");
            System.out.println("같은 실수를 반복한다.");
        }

3의 배수만 출력하기

		int i = 1;

		// ⚠️ 의도대로 작동하지 않음. 이유는?
        while (true) {
            if (i % 3 != 0) continue;  // 🔴
            System.out.println(i);

            if (i++ == 100) break;
        }

if 뒤 쪽의 i 가 조건을 충족해서 뒤쪽에 i++ 까지 닿지 않아서 i는 계속 1로 반복됨

       while (true) {
            if (i2++ == 100) break;
            if ((i2 - 1) % 3 != 0) continue;

이런식으로 바꾸면 되긴한데 계속 i-1을 써야하기에 작성자의 의도를 파악하기엔 생각을 또 해야하니까 가독성이 좋지 않다 그래서 가독성을 좋게 하기위해선

		int i = 1;
        
        while (true) {
            int cur = i++;

            if (cur == 100) break;
            if (cur % 3 != 0) continue;
            
            System.out.println(cur);

        }

do while(일단 진행시켜봐....!!!!!!)

		int enemies = 0;

        System.out.println("일단 사격");

        do {
            System.out.println("탕");
            if (enemies > 0) enemies--;
        } while (enemies > 0);

        System.out.println("사격중지 아군이다");

중첩으로 사용하는 문장 예제

public class ex04 {
    public static void main(String[] args) {
        final int LINE_WIDTH = 5;

        int lineWidth = LINE_WIDTH;

        while (lineWidth > 0) {
            int starsToPrint = lineWidth--;
            while (starsToPrint-- > 0) {
                System.out.print("*");
            }//줄바꿈 없음
            System.out.println();
        }//줄바꿈용 빈공간 println!!

        //  for 문으로 다시 작성
        for (int i = LINE_WIDTH; i > 0; i--) {
            for (int j = i; j > 0; j--) {
                System.out.print("@");
            }
            System.out.println();
        }
    }
}

메소드!!!!!!!!!!!

  • 타 언어의 함수 function 과 같은 개념
  • 자바는 모든 것이 클래스의 요소이므로 메소드 method 라 부름

메소드의 의미 1. 반복을 최소화

  • 한 번 이상 실행될 수 있는 일련의 작업들을 묶어두는 것

  • static : 정적 메소드 (클래스 메소드) 에서 호출하려면(main 등) 붙어야 함
    • 정적이 아닌 메소드 (인스턴스 메소드) 는 객체지향 섹션에서 배울 것
  • 매개변수 parameter : 각각 자료형과 변수명을 적음. 없을 시 빈 괄호
    • 호출할 때 넣는 값 (add(3, 4) 의 3과 4)을 인자 argument 라고 함
    • 강의에서는 자주 인자라고 통일하여 부를 것
  • return : 반환하는 값이 있을 때, 맨 마지막에 붙임

문법적으로는 위의 사진처럼 정도만 알아도 되지만 제대로 알기위해선 실제 내가 써보는것이 중요!!!!!!!!

  • return 은 블록을 종료하므로 이후의 코드 무효화 - 컴파일 에러 발생
  • 반환값의 자료형을 바꿔 볼 것 *(short, long, 기타…)
    • 반환값이나 인자의 자료형에 어긋날 경우 컴파일 에러 발생
  • ⚠️ 외부의 변수 값을 바꾸는 것은 좋은 메서드가 아님
//  ⭐️ 다른(정해진) 인자들과 사용시 맨 마지막에 놓을 것
    static String descClass (int classNo, String teacher, String... kids) {
        return "%d반의 담임은 %s 선생님, 원생들은 %s 입니다."
                .formatted(classNo, teacher, String.join(", ", kids));
    }

메소드 더 알아보기

메소드 오버로딩

  • 같은 메소드 이름, 다른 매개변수
  • 다른 자료형의 값들로 같은 성질의 작업을 정의할 때
	static int add(int a, int b) { return a + b; }

    //  매개변수의 개수가 다름
    static int add(int a, int b, int c) { return a + b + c; }

    //  매개변수의 자료형이 다름
    static double add(double a, double b) { return a + b; }

    //  매개변수의 자료형 순서가 다름
    static String add(String a, char b) { return a + b; }
    static String add(char a, String b) { return a + b; }

    //  ⚠️ 반환 자료형이 다른 것은 오버로딩 안 됨 - 다른 함수명 사용
    //  static double add(int a, int b) { return (double) (a + b); }

원시형 매개변수 vs 참조형 매개변수

	//  ⭐️ 원시값은 '복사해서' 가져옴
    //  메소드 내부에서 값을 변경해도 원본에 영향 끼치지 않음
    static void modifyIntArg (int num) {
        System.out.printf("수정 전: %d%n", num++);
        System.out.printf("수정 후: %d%n", num);
    }

    //  ⭐️ 참조값은 주소값이므로 원본 그 자체를 가리킴
    static  void modifyAryElem (int[] ary) {
        System.out.printf("수정 전: %d%n", ary[1]++);
        System.out.printf("수정 후: %d%n", ary[1]);
    }

재귀 메소드 (자바에선 권하지 않음!!!!!!!!!!)

  • 스스로를 호출하는 메소드
  • 호출시마다 메모리에 스택이 축적 - 초과시 스택오버플로우 stack overflow 에러
		static void upTo5 (int start) {
        System.out.println(start);
        if (start < 5) {
            upTo5(++start);
        } else {
            System.out.println("-- 종료 --");
        }
    }

  • 다른 메소드를 호출한 메소드는 호출된 메소드가 종료될 때까지 메모리에 남아 있음
    • 호출이 반복될수록 위와 같이 메소드들이 쌓이게 됨
		static int factorial (int num) {
        return num == 0 ? 1 : num * factorial(--num);
    }

꼬리 재귀 최적화

  • 재귀 코드를 내부적으로 루프 형태로 바꿔서 스택이 쌓이지 않도록 함
  • ⚠️ 자바에서는 현재 기본적으로 제공하지 않음 (보안 등 문제…)
  • 반복 횟수가 너무 많아지는 작업에는 사용하지 말 것!

키보드 입력 받기 (당장은 아니지만 어마무시하게 많이 쓰임)

  • Scanner : 키보드 입력이나 파일 등로부터 텍스트 값을 받아오기 위한 클래스
  • [System.in](http://System.in) : InputStream 의 인스턴스, 입력받은 값들의 흐름
    next : 스페이스를 비롯한 공백 단위로 끊어서 (토큰으로) 문자열을 받음

nextLine : 줄바꿈 단위로 끊어서 문자열을 받음

회고

복 습 끝 더 이상 무슨 말이 필요하리...
나는 이번주 복습을 계획하고 복습을 끝냈음에 어마무시한 만족감을 느끼는 중이다 그 누구도 말릴수없다,,,
후....

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글