https://www.inflearn.com/course/java-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0 가 출처입니다
인프런 사이트에서 무료로 제공되고 있는 강의이고 해당 강의에서 정리한 내용을 바탕으로 복습겸 적습니다.
사용자로부터 N개의 정수를 입력받은 후 합과 최대값을 구하여 출력하는 코드
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // 입력받는 객체생성
int n = sc.nextInt(); // 정수형 n 변수에 스캐너 객체
int[] data = new int[n]; // 정수형 배열 data 생성
for(int i=0;i<n;i++){ // 배열 크기만큼 반복문
data[i] = sc.nextInt(); // 배열 인덱스에 정수 값 입력
}
sc.close();
int sum = 0;
// int max = 0;
// 음수 해결법
int max = data[0]; // 실제 배열안의 요소 중 하나를 max에 넣는다.
for(int i=0;i<n;i++){
// for문의 시작도 1부터 해도됨.
sum += data[i]; // sum = sum + data[i]
// 배열 인덱스 안의 값들을 추출하여 sum이라는 변수에 더하면서 저장
if(data[i] > max){
max = data[i];
}
}
// 이 로직은 잘 구현이 된 로직인가 ?
// 음수를 넣어보자 => max 값이 인식되지 않음
System.out.println("Total : "+sum);
System.out.println("Max num : "+max);
}
}
결과
* 포인트
int max = 0;
for(int i=0;i<n;i++){
sum += data[i];
if(data[i] > max){
max = data[i];
}
}
max 의 값은 0으로 초기화가 되어 있어 data 배열안에 어떠한 음수를 넣어도 0과 작을테니 for문 안의 if문은 전혀 실행이 될 수 없습니다.
이 로직을 어떻게 수정하면 좋을까요 ? 한 번 생각해보세요
음수의 값도 최대값으로 판단할 수 있는 방법은 max의 초기화 작업부분인
int max = 0;
부분을 수정해야 합니다. - 어... 그럼 -100을 넣어야 하나요 ...? 라고 생각하실 수도 있겠지만 좀더 로직다운 로직을 구현하기 위해 다른 생각을 해야합니다.
바로 배열안에 저장되어 있는 요소를 max 변수에 초기화시켜주는 것이죠.
수정!
int max = data[0]; // 실제 배열안의 요소 중 하나를 max에 넣는다.
for(int i=0;i<n;i++){
// for문의 시작도 1부터 해도됨.
sum += data[i]; // sum = sum + data[i]
// 배열 인덱스 안의 값들을 추출하여 sum이라는 변수에 더하면서 저장
if(data[i] > max){
max = data[i];
}
}
이렇게 max의 값을 data 배열의 요소 중 하나로 초기화를 해두면 음수의 최대값도 출력이 되는 결과를 볼 수 있습니다.
결과
다음은 n개의 정수를 입력받아 요소들을 이동시키는 작업입니다.
- n개의 정수를 입력받아 순서대로 배열에 저장한다. - 그 다음 모든 정수들을 한 칸씩 오른쪽으로 shift 한다. - 마지막 정수는 배열의 첫 칸으로 이동
요로코롬
해당 로직을 코드로 구현하기전에 먼저 머리속으로 생각해야 합니다. 저것을 과연 어떻게 옮길까 어떤 방법을 생각할까 .... 라고요
사실 처음할때는 이 로직을 구현하기가 상당히 버겁습니다. 그래도 좀만 더 생각해보면 답이 나와요
여러분들은 어떻게 생각하셨나요 ?
처음에는 보통 첫번째 배열 인덱스부터 옮기는 방법을 생각할 겁니다. 하지만 머리속으로 로직을 짜다보니 아 이거 .... 너무 복잡한데 ? 라고 생각하실겁니다.
반대로 생각해보겠습니다. 명제는 마지막 요소를 배열의 처음 인덱스로 움직인다 하였습니다.
그럼 마지막 요소를 먼저 어느 변수에다가 저장해 놓고 끝에서부터 0번째까지 역순차 로직을 구현하면 될까 ...?
끝까지 생각하세요 맞습니다.
코드
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] data = new int[n];
for(int i=0;i<n;i++) {
data[i] = sc.nextInt();
}
sc.close();
int tmp = data[n-1]; // 마지막의 값을 tmp에 저장
for(int i=n-2;i>=0;i--) { // 배열의 마지막에서 2번째부터 순차진행
data[i+1] = data[i]; // 요소들 당기기 작업
}
data[0] = tmp; // 마지막 값을 배열의 첫번째 인덱스에 저장
for(int i=0;i<n;i++) {
System.out.println("data arr["+i+"] : "+data[i]);
}
}
- 먼저 배열의 마지막 요소를 tmp 라는 변수에 저장합니다. - 반복문을 배열의 마지막에서 2번째 인덱스부터 시작하여 0까지 회전시킵니다. - 반복문 안에는 끝자리에 끝자리 이전의 값을 넣어주어 배열의 요소를 당깁니다 data[9] = data[8] data[8] = data[7] 이런식으로요
- 마지막으로는 "먼저 배열의 마지막 요소를 tmp 라는 변수에 저장합니다. "에서 저장했던 tmp를 배열의 첫번째 인덱스로 넣어줍니다.
해당 코드를 보고 분석하면서 그리고 손으로 직접 디버깅하면서 해보세요 이해가 아주 잘 갈겁니다.