-
[백준 알고리즘] 단계별로 풀어보기 - 4단계 1차원 배열 JAVA코딩테스트/백준 2023. 6. 20. 17:20
📑 Q10807
배열 문제길래 배열을 이용해서 문제를 풀어보려고했다.
근데 배열에는 요소 추가가 메서드가 없는 게 아닌가? 그래서 list를 이용해서 풀었는데 선언해둔 배열을 가지고 그 배열의 i번째 요소에 값을 넣어주는 형식으로 사용하면 됐다.
array[i] = Integer.parseInt(st.nextTonken()); 이런식으로 for문을 사용해서 값을 넣어도 된다.
또 하나 짚고 넘어가야할 포인트는 확장 for문과 일반 for문이다. 확장 for문이 왜이렇게 헷갈리는지.
확장 for문은 for(변수선언(배열 각 번지 자료형) : 배열(컬렉션)){반복구문} 이렇게 작성해주는 것이다.
for(int i : Arr){} 이라는 확장for문이 있을때 i는 단순히 순번을 나타내는 변수가 아니라. Arr 배열에 i번째 값을 의미한다.
int[] arr = {2,3,4}; for(int i : arr){ System.out.println(i); // 2 3 4 }
이것이 일반 for문과 확장 for문의 차이이다.
package step4; import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; public class Q1_10807 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int num = Integer.parseInt(br.readLine()); /*int[] array = new int[count];*/ List<Integer> list = new ArrayList<>(); int count =0; StringTokenizer st = new StringTokenizer(br.readLine()," " ); for(int i=0; i<num;i++){ list.add(Integer.parseInt(String.valueOf(st.nextToken()))); //array[i] = Integer.parsInt(st.nextToken()); } Integer target = Integer.parseInt(br.readLine()); /** * 확장 for문을 사용하게 되면, * 만약 1 4 1 2 4 2 4 2 3 4 4를 입력받았을 때 * 1번쨰 있는 값 4 * 4번째 있는 값 4 * 1번째 있는 값 4 * 2반째 있는 값 1 * 4번째 있는 값 4 * 이런식으로 늘어나게 된다. */ //for(int i : list){ for(int i=0; i<list.size(); i++){ // target == arr[i] if(list.get(i).equals(target)){ count++; } } // bw.write(list.toString()); bw.write(Integer.toString(count)); bw.close(); } }
📑 Q10871
package step4; import java.io.*; import java.util.StringTokenizer; public class Q2_10871 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine()," "); int N = Integer.parseInt(st.nextToken()); int targetNum = Integer.parseInt(st.nextToken()); //배열 선언 int[] arr = new int[N]; st = new StringTokenizer(br.readLine()," "); //값 할당, 배열 값 초기화 //근데 굳이 배열에 넣지 않고 그냥 st.nextToken으로 읽어 온 값을 지역변수에 담아서 비교해도 된다. for(int i=0; i<arr.length; i++){ arr[i] = Integer.parseInt(st.nextToken()); if(arr[i]<targetNum){ sb.append(arr[i]).append(" "); } } bw.write(sb.toString()); bw.close(); } }
📑 Q10818
배열을 만들어서 값을 비교했는데 배열을 만들지 않고, 문제에 나와있는 (모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.)의 값을 넣거나 아래처럼 Integer의 max, min값을 구해서 넣어도 된다.
int intMin = Integer.MAX_VALUE; // 2147483647
int intMax = Integer.MIN_VALUE; //-2147483648package step4; import java.io.*; import java.util.StringTokenizer; public class Q3_10818 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int N = Integer.parseInt(br.readLine()); int[] arr = new int[N]; StringTokenizer st = new StringTokenizer(br.readLine(), " "); //배열에 값 할당. for(int i =0; i<N; i++){ arr[i] = Integer.parseInt(st.nextToken()); } int max = arr[0], min = arr[0]; for(int i =0; i<N; i++){ if(max < arr[i]) max = arr[i]; if(min > arr[i]) min = arr[i]; } /** * 만약 배열에 값을 할당하지 않을거면 * int maxValue = -99999999; * int minValue = 999999999; * max랑 min의 임의의 수 즉)문제 조건에 나와있는 수를 할당하고. * 이 maxValue와 현재 st.nextToken으로 읽고 있는 수를 비교해서 min, max값을 정한다. */ sb.append(min).append(" ").append(max); /*sb.append(max);*/ bw.write(sb+"\n"); bw.close(); } }
📑 Q2562
1. for문으로 전역변수에 값 할당.
package step4; import java.io.*; public class Q4_2562 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int max = 0; int index = 0; for(int i=0; i<9;i++){ int currentNum = Integer.parseInt(br.readLine()); if(max < currentNum) { max = currentNum; index = i+1; } } bw.write(max + "\n" + index); bw.close(); } }
2. Collections메서드 max(),, list 메서드 indextOf() 활용
package step4; import java.io.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Q4_2562_2 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); List<Integer> list = new ArrayList<>(); for(int i=0; i<9; i++){ list.add(Integer.parseInt(br.readLine())); } //list int max = Collections.max(list); int index = list.indexOf(max); System.out.println(max); System.out.println(index+1); } }
3. 배열을 선언하고 값을 할당해서 구할 수도 있다.
📑 Q10810
package step4; import java.io.*; import java.util.StringTokenizer; /** * 바구니 총 개수 : N * 공 : 1번부터 N번 까지 * 공을 넣는 횟수 : M * 바구니에 공은 1개만 넣을 수 있다. * 이미 공이 있는 경우 들어있는 공을 빼고, 새 공을 넣는다. */ public class Q5_10810 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int basketN = Integer.parseInt(st.nextToken()); int ballTimes = Integer.parseInt(st.nextToken()); //int형 배열의 초기값은 0으로 할당된다. //따라서 공이 없는 경우를 따로 0으로 초기화시킬 필요는 없다. int[] basketInBall = new int[basketN]; for(int i=0; i<ballTimes; i++){ st = new StringTokenizer(br.readLine()," "); int startN = Integer.parseInt(st.nextToken()); int endN = Integer.parseInt(st.nextToken()); int ballN = Integer.parseInt(st.nextToken()); for(int j= startN; j<=endN; j++ ){ basketInBall[j-1] = ballN; } } //bw.write(); for(int allBall : basketInBall){ //System.out.println(sb.toString().strip()); strip()은 공백 문자 제거 bw.write(allBall+" "); } bw.close(); } }
📑 10813
package step4; import java.io.*; import java.util.StringTokenizer; /** * 바구니 개수 : N * 공은 1개씩 들어있고, 처음 공의 번호는 바구니와 같은 번호 * M번 공을 바꾸려고 한다, 바구니 2개를 선택해서 두 바구니에 공을 교환한다. */ public class Q6_10813 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(st.nextToken()); //바구니 개수 int M = Integer.parseInt(st.nextToken()); //공은 바꿀 횟수 int [] basket = new int[N]; //바구니의 번호에 해당하는 공 넣기 for(int i=1;i<=basket.length;i++){ basket[i-1] = i; } for(int i=0; i<M; i++){ st = new StringTokenizer(br.readLine(), " "); int temp = 0; int j = Integer.parseInt(st.nextToken())-1; int k = Integer.parseInt(st.nextToken())-1; temp = basket[j]; basket[j]=basket[k]; basket[k]=temp; } for(int i :basket){ sb.append(i).append(" "); } bw.write(sb.toString()); bw.close(); } }
📑 5597
푸는데 시간이 좀 걸린 문제이다. 1번부터 30번까지 출석번호가 있는데 그 중 28명만 과제를 냈다 했을 때 내지 않은 학생의 번호를 구하는 문제이다.
처음엔 배열 2개를 만들어서 30명의 학생을 저장하고 또다른 하나엔 input 받은 28개의 번호를 저장해서. 값을 비교 하려고 했는데 생각보다 쉽지 않았다.
아래 코드는 고민이 담긴 코드. 정답은 아니다.
package step4; import java.io.*; import java.util.Arrays; public class Q7_5597 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringBuilder sb = new StringBuilder(); int[] submitArr = new int[10]; int[] student = new int[12]; /* int num=1; Arrays.fill(arr,num++);*/ //학생 배열 값 초기화. for (int i = 0; i < student.length; i++) { student[i] = i + 1; } /** * 사용자가 입력한 값으로 배열이 초기화됨. * 즉) 과제를 제출한 학생들. */ for (int i = 0; i < submitArr.length; i++) { submitArr[i] = Integer.parseInt(br.readLine()); } Arrays.sort(submitArr); /*for (int i = 0; i < submitArr.length; i++) { for (int j =i; j < student.length; j++) { if (submitArr[i] == student[j]) { break; } else { sb.append(student[j]); } } }*/ for (int i=0; i<student.length; i++){ if (submitArr[i] != student[i]) { sb.append(student[i]); } } // bw.write(Arrays.toString(submitArr)); /** * break는 해당 if문만 종료시키지만, return은 해당 메소드가 호출된 곳까지 종료시킨다. * 즉, if문을 포함한 메소드 자체를 종료시킨다. */ /* for(int i=0; i<30; i++){ if(submitArr[i] == i+1){ //return; break; }else{ sb.append(i+1); i--; } }*/ bw.write(sb + "\n"); bw.close(); /* bw.write(Arrays.toString(submitArr)); bw.close(); */ } }
정답은 아래 코드.
import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringBuilder sb = new StringBuilder(); int[] arr = new int[31]; for(int i=0; i<28; i++){ int input = Integer.parseInt(br.readLine()); arr[input] = 1; } for(int i =1; i<arr.length;i++){ if(arr[i] == 0 ){ sb.append(i).append("\n"); } } bw.write(sb.toString()); bw.close(); } }
📑 Q3052
배열 파트라 배열에 담으려고만 생각했는데 아예 HashSet에 담아버림 되겠다. 중복된 숫자 제거 후 숫자 세기는 무저건 set 이라 생각하자.
package step4; import java.io.*; import java.util.Arrays; import java.util.HashSet; import java.util.List; public class Q8_3052 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); Integer[] arr = new Integer[10]; // 크기가 10인 배열 생성 for(int i=0; i<10; i++){ int input = Integer.parseInt(br.readLine()); arr[i] = input %42; } HashSet<Integer> set = new HashSet<>(Arrays.asList(arr)); //중복을 제거해서 저장함. sb.append(set.size()); bw.write(sb.toString()); bw.close(); } }
아예 set만 이용하면 아래와 같다.
package step4; import java.io.*; import java.util.Arrays; import java.util.HashSet; import java.util.List; public class Q8_3052 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); HashSet<Integer> set = new HashSet<>(); for(int i=0; i<10; i++){ Integer input = Integer.parseInt(br.readLine()); set.add(input%42); //set.add(Integer.valueOf(br.readLine()) % 42); } sb.append(set.size()); bw.write(sb.toString()); bw.close(); } }
https://wonisdaily.tistory.com/256
나는 String형을 int형으로 변환할 때 별 생각 없이 Integer.parseInt(String s)를 사용했었는데, 다른 답변을 보니 Integer.valueOf(String s)를 사용했더라, 그 차이는 위의 포스팅에 정리해뒀다. 결론적으로 Integer 타입을 반환해야 된다면 Integer.valueOf를 사용하는게 나을 것 같다. 여기서는 int 형의 input의 값을 set에 넣을때 오토 박싱되어 Integer형의 값을 갖는 Set에 저장된 것 같다.
📑 Q10811
package step4; import java.io.*; import java.util.Arrays; import java.util.StringTokenizer; /** * 바구니의 총 개수 N * M번 바구니의 순서를 역순으로 만든다. * 순서를 역순으로 바꿀 때, 역순 범위를 정하고, 그 범위 안에 들어있는 바구니의 순서를 바꾼다. */ public class Q9_10811_2 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); int[] arr = new int[N]; for(int i = 0; i<N; i++){ arr[i] = i + 1; } for(int i=0;i<M;i++) { st = new StringTokenizer(br.readLine(), " "); int from = Integer.parseInt(st.nextToken()) -1; int to = Integer.parseInt(st.nextToken()) -1; for(int j =from; j<=to;j++,to--){ int temp = arr[j]; arr[j] = arr[to]; arr[to] = temp; } /** * 1번부터 4번을 역순 * 2 1 4 3 5 * * from&j 0, to 3, * = 3 1 4 2 5 * * from&j 1, to 2 * = 3 4 1 2 5 * * from&j 2 to 1 * * */ } for(int i=0; i<arr.length;i++){ sb.append(arr[i]).append(" "); } bw.write(sb.toString().trim()); bw.close(); } }
이번 문제의 생각 정리는 따로 포스팅으로 작성!
https://wonisdaily.tistory.com/266
📑 Q1546
import java.io.*; import java.util.Arrays; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int N = Integer.parseInt(br.readLine()); double[] arr = new double[N]; StringTokenizer st = new StringTokenizer(br.readLine(), " "); for(int i=0; i<N;i++){ arr[i] = Double.parseDouble(st.nextToken()); } double max = 0; double sum = 0; //점수 중 최대 값 구하기 for(int i=0; i<arr.length; i++){ if(max < arr[i]){ max = arr[i]; } sum += arr[i]; } bw.write(String.valueOf((sum*100/max/arr.length))); bw.close(); } }
위에 정답처럼 코드를 간편하게 구할 수 있는데 나는 너무 쪼개서 어렵게 생각하는 것 같다. 사고의 유연함이 필요하다.
package step4; import java.io.*; import java.util.Arrays; import java.util.StringTokenizer; public class Q10_1546 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int N = Integer.parseInt(br.readLine()); double[] arr = new double[N]; StringTokenizer st = new StringTokenizer(br.readLine(), " "); for(int i=0; i<N;i++){ arr[i] = Double.parseDouble(st.nextToken()); } //최대값 구하기 double max = 0; for(int i=0; i<arr.length; i++){ if(max < arr[i]){ max = arr[i]; } } //점수 위조하기 for(int i=0; i<arr.length; i++){ // if(arr[i] < max) { arr[i] = arr[i] / max * 100; // } } bw.write(Arrays.toString(arr)+"\n"); double sum = 0; //위조된 점수로 다시 평균 구하기 for(double score : arr){ sum += score; } /*bw.write(String.valueOf((sum*100/max/arr.length)));*/ bw.write(String.valueOf(sum / arr.length)); bw.close(); } }
반응형'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 2908번 - 숫자 뒤집기(JAVA) (0) 2023.07.07 [백준 알고리즘] 10811번 바구니 뒤집기 - JAVA (0) 2023.06.20 [백준 알고리즘] 단계별로 풀어보기 - 3단계 반복문 JAVA (0) 2023.06.02 [백준 알고리즘] 단계별로 풀어보기 - 2단계 조건문 JAVA (0) 2023.04.27 [백준 알고리즘] 단계별로 풀어보기 1단계 JAVA (0) 2023.04.14