왜 국비가 진도가 빠르다고 했는지 알겠다
벌써 약간 따라가기 벅차다
배열도 뭐 아는 내용이라 엄청 벅찬건 아닌데
푸는 예제들과 알고리즘을 한 번에 이해하기가 어렵다.. 꼭 복습이 필요하다
여튼 배열 복습 고고
/*
* 배열
* 1. 정수형 배열
* int[] arr = {1,2,3,4,5}
* int[] arr = new int[5];
* == === == 저장할 갯수
* 배열설정,배열명
* long[] arr=new long[];
* long[] arr={1L, 2L, 3L, 4L, 5L} => {1,2,3,4,5}
* long a=1 ==> a=1L
*
* int[] arr=new int[5]; // 0,0,0,0,0
* long[] arr=new long[5]; // 0L, 0L, 0L, 0L, 0L
*
* 2. 실수형 배열
* double[] arr = {1.0, 2.0, 3.0...};
* float[] arr = {1.0, 2.0, 3.0...}; (오류)
* float[] arr = {1.0F, 2.0F, 3.0F...}; (오류)
*
*
* 3. 문자형 배열
* char[] arr={'A', 'B', 'C' ...}
* char[] arr=new char[5]; '\0','\0','\0','\0'
* 4. 논리형 배열
* boolean[] arr={true, false, true..}
* boolean[] arr=new boolean[5]
* 5. 문자열 배열
* String[] arr={"홍길동", "심청이", "박문수"...}
*
*
*
*
*
*/
import java.util.Scanner;
public class 배열종류_1 {
public static void main(String[] args) {
// 3명의 학생 => 국어, 영어, 수학 점수를 입력받아서 총점, 평균, 학점, 등수
/*
* 배열 => 관련된 데이터를 모아서 관리
*
*/
// 국어 => 3명
int[] kor=new int[3];
int[] eng=new int[3];
int[] math=new int[3];
int[] total=new int[3];
double[] avg=new double[3];
char[] score=new char[3];
// 등수 저장 변수 => 3개 묶어서 처리
int[] rank=new int[3];
Scanner scan=new Scanner(System.in);
for(int i =0; i<3; i++)
{
System.out.print((i+1)+"번째 국어점수 입력:");
kor[i]=scan.nextInt();
System.out.print((i+1)+"번째 영어점수 입력:");
eng[i]=scan.nextInt();
System.out.print((i+1)+"번째 수학점수 입력:");
math[i]=scan.nextInt();
//총점
total[i]=kor[i]+eng[0]+math[i];
//평균
avg[i]=total[i]/3.0;
}
// 출력
for(int i=0; i<3; i++)
{
switch((int)(avg[i]/10))//정수, 문자, 문자열
{
case 10:
case 9:
score[i]='A';
break;
case 8:
score[i]='B';
break;
case 7:
score[i]='C';
break;
case 6:
score[i]='D';
break;
default:
score[i]='F';
}
}
// 등수 구하기 ==> 비교 (이차 for)
for(int i=0; i<3; i++)
{
rank[i]=1;
for(int j=0; j<3; j++)
{
if(total[i]<total[j])
{
rank[i]++;
}
}
}
// 출력
for(int i=0; i<3; i++)
{
System.out.printf("%d %d %d %d %.2f %c %d\n", kor[i], eng[i],
math[i], total[i], avg[i], score[i], rank[i]);
// 정수 %d, 실수 %
}
}
}
t배열을 설정하는 방법은 int[] arr = new int []; 이런식으로 써주면 된다'
배열은 사실 출력하는게 중요해서 출력하는 방법을 잘 숙지하는게 좋을 것 같다.
// for-each
public class 배열출력 {
public static void main(String[] args) {
int[] arr=new int[6];
// 초기화
for(int i=0; i<arr.length; i++) // index번호 이용
{
arr[i]=(int)(Math.random()*45)+1; //1~100사이의 난수를 생성
}
// 출력 => forEach 구문
for(int i: arr)
{
System.out.print(i+" ");
}
}
}
밑에가 향상된 for문이다. 저걸 활용해서 배열에 있는 요소들을 다 꺼내올 수 있다.
이때 주의할 점은 i는 배열의 요소이지 순서가 아니라는 점
// 요일 구하기
import java.util.Scanner;
public class 배열활용_1 {
public static void main(String[] args) {
String[] strWeek = {"일","월","화","수","목","금","토"};
/*
* 1년도 1월 1일 ~ 2020.12.30 => 총날수
* +2021.1월 1일 ~ 전달까지의 총날수
* +입력된 날짜
* ===================================
* %7 => 요일
* Calendar
*/
// 사용자가 년도-월-일을 입력을 받아서 처리
Scanner scan=new Scanner(System.in);
System.out.print("년도 입력:");
int year=scan.nextInt();
System.out.print("월 입력:");
int month=scan.nextInt();
System.out.print("일 입력:");
int day=scan.nextInt();
// 요일 구하기
// 1. 1년도 1월 1일 ~ 작년 (2020-12-31)
int total=(year-1)*365+(year-1)/4
-(year-1)/100
+(year-1)/400;
int[] lastDay= {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//윤년 조건
if((year%4==0 && year%100!=0)|| (year%400==0))
{
lastDay[1]=29;
}
else
{
lastDay[1]=28;
}
// 전달까지의 합
for(int i=0; i<month-1; i++)
{
total+=lastDay[i];
}
total+=day;
int week=total%7;
//출력
System.out.printf("%d년도 %d월 %d일 %s요일입니다.", year, month, day, strWeek[week]);
}
}
배열을 이용해서 요일 구하는 알고리즘
사실 이걸 이해를 다 못했는데 지금 일단 블로깅만 하고 노트북을 접어야 할것 같다
눈이 너무 피로하다...
내일 아침에 일어나서 이걸 해야지
ㅎ2
일어나서 달력만들기 했다
휴
솔직히 아예 안보고 한건 아닌데 윤달 조건 만들기+저번달까지 더해주기 빼고는 거진 다 내 손으로 쓴 코드들이다
오늘 날짜 입력했을때 자꾸 토요일이래서 답답했었는데
코드 수정하고 수요일이라고 뜨는 순간 박수쳤다
이게 즐거움이구나
여튼 내가 쓴 코드는 아래와 같다.
import java.util.Scanner;
public class 달력만들기연습 {
public static void main(String[] args) {
// 요일이 들어 있는 배열만들기
String[] week = {"일요일","월요일", "화요일","수요일","목요일","금요일","토요일"};
//사용자에게서 년, 월, 일 입력값 받기
Scanner scan=new Scanner(System.in);
System.out.print("년도를 입력하세요: \n");
int year = scan.nextInt();
System.out.print("달을 입력하세요: \n");
int month = scan.nextInt();
System.out.print("일을 입력하세요: \n");
int day = scan.nextInt();
//1월 1일부터 작년 말일까지 총 날짜 수 구하기
int total=(year-1)*365+(year-1)/4
-(year-1)/100
+(year-1)/400;
int[] lastDay = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//윤년조건
if((year%4==0&&year%10!=0)||year%400==0)
{
lastDay[1]=29;
}
else
{
lastDay[1]=28;
}
//저번달까지의 날짜수 total에 더해주기
for(int i=0; i<month-1; i++)
{
total+=lastDay[i];
}
// 마지막으로 오늘 날짜까지 더해주기
total+=day;
// 7로 나눠서 요일 알려주기
String today=week[total%7];
//출력
System.out.printf("%d년 %d월 %d일은 %s입니다", year, month, day, today);
}
}
이런 기능들은 자바 라이브러리에 다 있다는데
그래도 그 알고리즘을 이해하는게 중요하니까 어지간하면 다 이해해보려고 노력하는 중이다.
내가 코딩테스트를 보는 곳들을 지원할지 안할지는 모르겠지만 일단은 시도라도 해보려면.. 지금이라도 기초를 닦아놔야지
다음은 수업시간에 나온 문제인데 내가 풀지 못했던 마지막 한 문제이다.
제어문과 배열을 사용해야 하기 때문에 이해를 꼭 하고 넘어가야한다
public class 자바배열문제_10 {
public static void main(String[] args) {
System.out.println("====정렬전====");
int[] arr = new int [5];
for(int i =0; i<arr.length; i++)
{
arr[i]=(int)(Math.random()*100)+1;
}
for(int i: arr)
{
System.out.print(i+ " ");
}
System.out.println("\n====정렬후====");
// Arrays.sort(arr);
// for(int i: arr)
// {
// System.out.print(i+ " ");
// }
// for(int i=0; i<arr.length-1; i++)
// {
// for(int j=i+1; j<arr.length; j++)
// {
// if(arr[i]<arr[j])
// {
// int temp =arr[i];
// arr[i]=arr[j];
// arr[j]=temp;
//
// }
// }
// }
for(int i=0; i<arr.length-1; i++)
{
for(int j=i+1; j<arr.length; j++)
{
if(arr[i]>arr[j])
{
int temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
for(int i: arr)
{
System.out.print(i+ " ");
}
}
}
내가 풀지 수업시간에 해결하지 못한 부분은 저 정렬후 로직을 만들어 내는거 였다.
뭔가 비슷하게 찌끄렸는데 이해하고 썼다기보단 그냥 되는대로 적었는데 뭐 역시나 돌아가는 코드가 아니었다
지금은 이해를 한거 같다
2중 for문 에서 핵심은 세로-가로인거 같다.
i는 세로 j는 가로로 돌리는거라고 생각하면 생각보다 바퀴수 만들어 내는건 어렵진 않다.
총 아래로 4번 비교해야하고, 옆으로 비교하는건 i+1부터 해줘야 하니까
int temp를 써서 arr[i]값을 임시로 저장하는것도 잘 기억해야지
arr[i]값이 더 크면 arr[j]로 보내서 클수록 뒤로 보내는 로직을 만들었다
휴우우우
이정도 이해했으면 그래도 괜찮은거 같은데요
'programming > Gukbi' 카테고리의 다른 글
국비 교육 10일차 - 달력만들기 + 숫자 야구 게임 (0) | 2021.01.07 |
---|---|
국비 교육 9일차 - 배열 활용 (2) | 2021.01.06 |
국비 교육 7일차 - 2차 for문 (0) | 2021.01.04 |
국비 교육 6일차 - 반복문 (0) | 2020.12.31 |
국비 교육 5일차 - 조건문 (0) | 2020.12.31 |