본문 바로가기

programming/Gukbi

국비 교육 8일차 - 배열

728x90
반응형

왜 국비가 진도가 빠르다고 했는지 알겠다

벌써 약간 따라가기 벅차다

 

배열도 뭐 아는 내용이라 엄청 벅찬건 아닌데

푸는 예제들과 알고리즘을 한 번에 이해하기가 어렵다.. 꼭 복습이 필요하다

 

여튼 배열 복습 고고

 

/*
 * 	배열
 * 		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]로 보내서 클수록 뒤로 보내는 로직을 만들었다

 

휴우우우

 

이정도 이해했으면 그래도 괜찮은거 같은데요

 

 

 

 

 

 

728x90
반응형