백준 배열 나머지 3052번
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] arr = new int[10];
for(int i=0;i<arr.length;i++) {
int a = scan.nextInt();
arr [i]=a%42;
}//나머지 정렬
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;
}
}
}//선택정렬
int count=1;
for(int i=0;i<arr.length-1;i++) {
if(arr[i]!=arr[i+1]) {
count++;
}
} //선택정렬하고 비교. 선택정렬을 배우기 전에 풀 때는 어려웠는데 배우고나니 기존에 하던 방식으로 쉽게 풀림
System.out.println(count);
}
}
또는
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[]src =new int[10]; //값을 받을 함수
boolean[] bool=new boolean[42]; //42로 나눈 나머지의 개수는 아무리 많아도 42개.
int count=0;
Arrays.fill(bool, true); //bool배열을 전부 true로 채워버림
for(int i=0; i<src.length;i++) {
src[i]=sc.nextInt(); //먼저 값들을 받아서 넣어 놓고
src[i] %=42; //받은 값들을 42로 나눈 나머지값으로 치환
예시로, {39, 40, 41, 0, 1, 2, 40, 41, 0, 1}
if(bool[src[i]]) {
bool[src[i]] = false;
count++;
}
}
// i가 0일때 bool[39]값에 false를 넣음,
//i가 1일때 bool[40]값에 false
//i가 2일때 bool[41]값에 false
//i가 3일때 bool[ 0 ]값에 false
//i가 4일때 bool[ 1 ]값에 false
//i가 5일때 bool[ 2 ]값에 false
//i가 6일때 bool[40]값에 false
//i가 7일때 bool[41]값에 false
//i가 8일때 bool[ 0 ]값에 false
//i가 9일때 bool[ 1 ]값에 false
인데, bool[n]값이 겹친다! 따라서 [39],[40],[41],[0],[1],[2] 값에만 false가 들어감.
// if문은 for반복문 안에 있다. true면 true !=false니까 count가 추가되지 않고,
false면 false=false니까 count가 추가되며, for에 의해 반복적으로 조건확인 및 실행을 거친다.
즉, 중복되지 않는 나머지값들의 개수가 구해지는 것이다.
System.out.println(count);
}
}
eclipse BreakEx01
break;는 가장 가까운 반복문에서 탈출시켜 준다.
break는 조건문과 함께 사용한다.
break가 있을 때 출력되는건 1~4까지지만, 4번만 돈게 아니라 5번 돌며 실행하다가 break에 걸려서 빠져나온 것이다.
위치에 따라 결과가 다르게 나오므로 주의할 것
조건을 한줄만 쓸 때 {}는 생략이 가능하다. if(조건) break;
eclipse BreakEx02
무한루프-반복의 횟수를 정확히 가늠할 수 없을 때 무한루프를 만들고 break로 빠져나오도록 처리
단, break는 조건문과 함께 사용하므로 나올 조건을 파악해야 한다.
for문도 무한루프를 만들 수는 있지만 가독성이 좋지 않아 while문으로 무한루프를 쓰는 편이다.
eclipse BreakEx03
중첩반복문의 탈출
break는 가장 가까운 반복문에서 탈출시킨다. 따라서 방법이 필요.
옛날에는 boolean flag=false를 넣고 flag가 true가 되면 break를 쓰는 방법도 썼지만!
요즘은 다르게. 반복문에 이름을 붙인다. 형식은 "이름:for~~"처럼. 이름은 맘대로.
하고 break 이름;을 하면 이름이 붙은 반복문에서 탈출 가능
eclipse Quiz17
출력문의 위치를 볼 것. 어차피 break걸리고 빠져나가니까 마지막에 필요한 출력문을 break가 들어간 곳에 넣어도 됨.
eclipse Quiz18
빠져나가는 구문. 입력값이 0일 때를 먼저 실행하고 else if나 else 조건을 걸면 0입력 후 뒤에 틀렸습니다가 나오지 않는다.
왜? 0일 때 break로 빠져나가버리니까 뒤를 실행하지 않음.
if(answer==0) break;구문을 맨 위에 따로 만들어도 된다. 3가지 조건을 서로 붙일 필요 없이 break구문 하나 만들고
나머지 둘만 묶어 간단하게 표현해도 됨. 어차피 빠져나가니까.
eclipse ContinueEx01
continue는 반복문을 한번 뛰어넘는 역할을 한다. break랑 사용방법은 똑같음
i값은 증가하고 다음 반복문을 실행한다.
i++; 위치에 유의. continue가 먼저 나오면 무한루프를 돈다. i가 1->continue->i<=10이 true->i=1...
만약 if문에 {}를 사용하지 않을 거라면 시작하자마 i++를 할 거기 때문에 0부터 실행.
+)return; -이 자리에서 '메인의 종료'를 시킨다는 걸 의미. 조만간 배울 것...
eclipse ArraySearch
배열을 다루는 방법
탐색->순차탐색(처음부터 마지막까지 or 마지막부터 처음까지), 이진탐색(중간부터)
단, 이진탐색의 전제조건: 중복없이, 순서대로 나열되어 있다는 전제조건이 필요.
if(arr[i]==fint) { //찾은 경우
index=i; //인덱스의 값을 수정
break; //탈출
}
index가 -1로 선언하는 이유는? 찾는 숫자가 배열 안에 없을 때를 위하여. 0이면 인덱스0번이 되는데 이는 배열 안에 있음
eclipse ArraySearch2
순차탐색과 문자열 비교
자바에서 문자열 비교를 ==으로 하면 false로 인식해버린다(이유는 나중에 배움).
비교하려면 문자열.equals(") 를 사용! 암기할 것
eclipse ArraySearch3
이진탐색-절반으로 나눠가며 찾아가는 과정
전제조건-순서대로 나열된 데이터
글로보면 이해 안된다. 식으로 보자
low=0
high=배열길이-1
mid = (low+high)/2
if(입력값이 중간값보다 크다)
low=mid+1 //중간부터 끝으로 줄여가기
if(입력값이 중간값보다 작다)
high=mid-1 //중간부터 앞으로 줄여가기
조건을 넣을 때 low<=high로 넣었는데, 인덱스 처음과 끝이므로 당연한 것
단 실행이 계속되다 보면 low가 high를 넘어가는 순간이 온다.(false) 이때 멈춘다.
eclipse ArraySort
정렬-총 7가지가 있다
선택정렬-가장 쉬운 정렬방법. but 숫자가 크면 느려진다
퀵정렬-가장 빠른 정렬방법. 아직 안 배움
자리바꾸기
int x=10;
int y=20;
int temp=x;
x=y;
y=temp;
배웠던 거다. 빈상자만들기
for문-이전과 다르게 arr.length-1에서 -1을 하는 이유 : 다 돌아갈 필요 없다! 정렬을 진행하다 보면 마지막은 진행하기 전에 알아서 정렬되어 있을 거니까!------>바깥 for문
단, 비교할때는 마지막거까지 비교를 해줘야 하기 때문에 -1을 하지 않는다. ---->안 for문
int j=i+1 ---->i 다음꺼랑 비교를 하는 것. 1이면 2~끝까지, 2면 3~끝까지, 3이면 4~끝까지.
i는 arr.length-1까지기 때문에 j+1이면 딱 배열의 마지막까지 비교됨
arr[i]>arr[j] //오름차순. 내림차순은 부등호만 반대로 하면 됨.
이렇게 하면 배열 안이 알아서 오름차순으로 정리된다.
단! Arrays.sort(arr); 을 해 주면 식 세울 필요 없이 바로 정리된다. 외우면 좋다.