백준 2167번: 2차원 배열의 합 + 2508번: 사탕 박사 고창영 + 2535번: 아시아 정보올림피아드(JAVA)

won·2023년 3월 16일
0

알고리즘 문제풀이

목록 보기
25/32

2167번: 2차원 배열의 합

https://www.acmicpc.net/problem/2167

이 문제는 한번 읽어봤을 때 문제 이해가 좀 제대로 안된다.
나는 만약 1 3 2 3 의 입력이 들어온다면
(0,3) (1,1) (1,2) (1,3) (1,4) 의 값을 모두 구하는 것인줄 알았는데
(0,3)과 (1,3)값만 구하는 것 이였다.


그림과 같은 방식으로 구해야 한다는 것.

문제 이해만 한다면 크게 어렵지는 않다.
for문으로만 돌려도 시간 초과나 런타임 에러는 나지 않는다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

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));

		StringTokenizer st;
		st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		int arr[][] = new int[n][m];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < m; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		int k = Integer.parseInt(br.readLine());
		for (int i = 0; i < k; i++) {
			int sum = 0;
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());
			int d = Integer.parseInt(st.nextToken());
			
			for (int o = a-1; o < c; o++) {
				for (int p = b-1; p < d; p++) {
					sum += arr[o][p];
					
				}
			}
			bw.write(String.valueOf(sum)+"\n");
		}
		bw.flush();
		bw.close();
		br.close();
	}
}

2508번: 사탕 박사 고창영

https://www.acmicpc.net/problem/2508

거의 다 풀었는데 배열 인덱스 오류가 나서 애먹었다..
내가 돌렸을땐 거의 모든 테스트 케이스에서 오류가 안나서 다른 사람 풀이를 보고 아주 살짝 고쳤다.

테스트케이스 시작때마다 한번 개행 해줘야 오류가 안난다.

package problem_solved;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class n2508 {
	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;
		int T = Integer.parseInt(br.readLine());
		
		for (int k = 0; k < T; k++) {
			br.readLine();
			st = new StringTokenizer(br.readLine());
			int r = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());
			char[][] arr = new char[r][c];
			for (int i = 0; i < r; i++) {
				String str = br.readLine();
				arr[i] = str.toCharArray();
			}
			int count = 0;

			// 가로 확인
			for (int i = 0; i < r; i++) {
				for (int j = 0; j < c-2; j++) { //c-2 만큼 돔
					if (arr[i][j] == '>' && arr[i][j + 1] == 'o' && arr[i][j + 2] == '<') {
						count++;
					}
					
				}
			}
			for (int j = 0; j < c; j++) {
				for (int i = 0; i < r-2; i++) { //r-2만큼 돔
					
					if (arr[i][j] == 'v' && arr[i + 1][j] == 'o' && arr[i + 2][j] == '^') {
							count++;
					}
					
				}
			}
			bw.write(String.valueOf(count) + "\n");
		}
		bw.flush();
		br.close();
		bw.close();
	}
}

2535번: 아시아 정보올림피아드

https://www.acmicpc.net/problem/2535

이 문제는 어렵진 않은데 엄청 헷갈린다.
배열을 여러개 두고 그 배열을 모두 정렬한 뒤
배열의 요소들을 이용 해 확인을 하는 것이라..

학생들의 국가, 번호, 점수 배열을 다 따로뒀고
국가별 메달 수 배열을 또 따로두어 해결했다.

정렬은 편하게 선택 정렬을 했다. 시간초과는 나지 않았다.

package problem_solved;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class n2535 {
	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 N = Integer.parseInt(br.readLine());
		StringTokenizer st;
		int[] stuNum = new int[N];
		int[] stuCon = new int[N];
		int[] score = new int[N];
		int[] Consum = new int[N];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			stuCon[i] = Integer.parseInt(st.nextToken());
			stuNum[i] = Integer.parseInt(st.nextToken());
			score[i] = Integer.parseInt(st.nextToken());
		}

		for (int i = 0; i < N; i++) {
			for (int j = i + 1; j < N; j++) {
				if (score[i] < score[j]) {
					swap(score,i, j);
					swap(stuCon,i, j);
					swap(stuNum,i, j);
				}
			}
		}
	

		int gold=0;
		Consum[stuCon[0]] +=1;
		int silver=1;
		Consum[stuCon[1]] +=1;
		int bronze=0;
		
		for(int i=2;i<N;i++) {
			if(Consum[stuCon[i]]<2) {
				bronze=i;
				break;
			}
		}

		bw.write(stuCon[gold]+" "+stuNum[gold]+"\n");
		bw.write(stuCon[silver]+" "+stuNum[silver]+"\n");
		bw.write(stuCon[bronze]+" "+stuNum[bronze]);
		bw.flush();
		br.close();
		bw.close();
		
	}

	public static void swap(int[] arr,int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	
	}
}
profile
뭐라도 하자

0개의 댓글