본문 바로가기
자료구조,알고리즘

제1-1장: 변수, 배열, 반복문 (4/7)

by 세류오 2021. 5. 21.

📌 매일하는것이 제일 중요하다.


📚 학습내용

프로그래밍 문법을 정확히아는 지식보다, 알고있는 문법을 활용해 문제를 반복적으로 해결하다보면 얻어지는 패턴이 존재한다. 이러한 패턴들에 얼마나 내가 익숙하는지와 이를 통해 새로운 문제들을 해결할 수 있게되는 경험이 있다면 잘 할수 있을 것이다.

- 초기 변수값을 무조건 0으로 주게 된다면

초기 변수값을 습관적으로 0으로 대입시켜놓을 텐데 이런 상황에 정수를 입력받아 최대값을 구하는 문제가 발생한다면, 음수를 입력받을 때 0이 최대값으로 나오게 되버린다.
이 때 최초로 입력받는 정수를 초기값으로 준다면 뒤에 입력받을 값들과 자연스럽게 비교가되는 코드를 작성할 수 있을 것이다.

public static void main(String[] args) {

    Scanner kb = new Scanner(System.in);
    int n = kb.nextInt();
    int[] data = new int[n];// n개의 정수를 저장할 길이가 n인 배열 선언

    for (int i = 0; i < n; i++)
        data[i] = kb.nextInt();// 한줄이면 괄호를 안써도 되는구나
    kb.close();

    int sum = 0;
    int max = data[0];// 2.data[0]를 지정해 놓으면 자연스럽게 비교가 가능하다
    // - 습관적으로 변수의 초기값을 0으로 만드는 것을 주의하자
    for (int i = 0; i < n; i++) {
        sum += data[i]; // sum = sum + data[i]
        if (data[i] > max) // 1. data가 0보다 작을 때 오류가 생긴다
            max = data[i];
    }

    System.out.println("The sum is " + sum);
    System.out.println("The max is " + max);

    }

- 생각의 전환

n개의 정수를 입력받아 순서대로 배열에 저장한다.
그런다음 모든 정수들을 한 칸씩 오른쪽으로 shift하라.
마지막 정수는 배열의 첫 칸으로 이동하라.

처음에는 이동 순간마다 임시변수에 저장시켜주며 한칸씩 이동하는 그런 방법이 떠올랐다.

하지만

맨 마지막데이터만 따로 임시변수에 저장 후
for문을 이용해 나머지 변수들을 한칸씩 뒤로 이동시켜준다.
그리고 임시변수에 있는 변수를 0번째로 넣어주면 간단하게 끝낼 수 있다.

습관적으로 하지 말고 조금씩, 아주 조금만 더 생각을 해보면 좋은 코드를 만들어 낼 수 있고 바로 그것이 프로그래머가 필요한 자질이다

int tmp = data[n - 1];             //맨 마지막변수를 tmp에 저장
for (int i = n - 2; i >= 0; i--) {    //마지막-1번째 변수부터를 한칸씩 뒤로 이동
    data[i + 1] = data[i];
}
data[0] = tmp;                //마지막변수를 맨 앞에 대입

Tip) 모든 Class에 main함수가 존재해서 이클립스가 실행해야할 것을 알맞게 실행해 주어야 하는데 가끔 그렇지 않을 때가 존재한다.


Review

  • 문제를 해결하며 패턴을 습득하자
  • 습득한 패턴에 너무 의존하지 말고 더 쉽고 간단한 방법으로 코드를 만들어보자