230823
Day8 문제풀이
코드
import java.io.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int countItem = 0;
countItem += (N / 14);
N %= 14;
countItem += (N / 7);
countItem += N % 7;
System.out.println(countItem);
}
}
중요
- 그리디 알고리즘 : 선택을 해야 할 때마다 눈앞의 최선의 선택을 하는 알고리즘. 너무 많은 반복이 필요한 동적 프로그래밍을 보완하기 위한 알고리즘.
230824
Day9 문제풀이
코드
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tk = new StringTokenizer(br.readLine());
int N = Integer.parseInt(tk.nextToken());
int K = Integer.parseInt(tk.nextToken());
String[][] ground = new String[N][N];
int[][] point = new int[N][N];
for(int i=0; i<N; i++) {
tk = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++) {
ground[i][j] = tk.nextToken();
}
}
int max = 0;
int[][] area = {{1,0}, {0,-1}, {0,0}, {0,1}, {-1,0}};
for(int k=0; k<K; k++) {
tk = new StringTokenizer(br.readLine());
int Y = Integer.parseInt(tk.nextToken()) - 1;
int X = Integer.parseInt(tk.nextToken()) - 1;
for(int l=0; l<area.length; l++) {
try {
if(ground[Y+area[l][0]][X+area[l][1]].equals("0")) point[Y+area[l][0]][X+area[l][1]]++;
else if(ground[Y+area[l][0]][X+area[l][1]].equals("@")) point[Y+area[l][0]][X+area[l][1]] += 2;
if(max < point[Y+area[l][0]][X+area[l][1]]) max = point[Y+area[l][0]][X+area[l][1]];
} catch(Exception e) {}
}
}
System.out.print(max);
}
}
중요
- 완전 탐색 알고리즘 : 모든 경우의 수를 체크하는 방법
- 코드 자체의 가독성만 본다면 이차원 배열이 낫지만, 일차원 배열을 사용하면 속도와 성능 면에서 조금 더 개선될 수 있다고 한다.
지금은 데이터의 양이 적지만 방대한 양의 자료를 사용해야 할 땐 일차원 배열을 고려해봐도 좋을 듯 하다.
230825
Day10 문제풀이
코드
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] temp = br.readLine().split(" ");
int[] goorm = {Integer.parseInt(temp[0]) - 1, Integer.parseInt(temp[1]) - 1};
temp = br.readLine().split(" ");
int[] player = {Integer.parseInt(temp[0]) - 1, Integer.parseInt(temp[1]) - 1};
boolean[][] visitGoorm = new boolean[N][N];
boolean[][] visitPlayer = new boolean[N][N];
String[][] board = new String[N][N];
for(int i=0; i<N; i++) {
StringTokenizer tk = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++) {
board[i][j] = tk.nextToken();
}
}
visitGoorm[goorm[0]][goorm[1]] = true;
visitPlayer[player[0]][player[1]] = true;
int pointGoorm = playGame(board, visitGoorm, goorm, N);
int pointPlayer = playGame(board, visitPlayer, player, N);
if(pointGoorm > pointPlayer) System.out.print("goorm " + pointGoorm);
else System.out.print("player " + pointPlayer);
}
public static int playGame(String[][] board, boolean[][] visit, int[] user, int N) {
boolean isBreak = false;
while(true) {
if(isBreak) break;
String[] go = new String[2];
go[0] = board[user[0]][user[1]].substring(0, board[user[0]][user[1]].length()-1);
go[1] = String.valueOf(board[user[0]][user[1]].charAt(board[user[0]][user[1]].length()-1));
if(go[1].equals("L")) {
for(int i=0; i<Integer.parseInt(go[0]); i++) {
user[1]--;
if(user[1] < 0) user[1] = N-1;
if(visit[user[0]][user[1]]) {
isBreak = true;
break;
}
//방문처리
if(!visit[user[0]][user[1]]) visit[user[0]][user[1]] = true;
}
} else if(go[1].equals("R")) {
for(int i=0; i<Integer.parseInt(go[0]); i++) {
user[1]++;
if(user[1] > N-1) user[1] = 0;
if(visit[user[0]][user[1]]) {
isBreak = true;
break;
}
//방문처리
if(!visit[user[0]][user[1]]) visit[user[0]][user[1]] = true;
}
} else if(go[1].equals("U")) {
for(int i=0; i<Integer.parseInt(go[0]); i++) {
user[0]--;
if(user[0] < 0) user[0] = N-1;
if(visit[user[0]][user[1]]) {
isBreak = true;
break;
}
//방문처리
if(!visit[user[0]][user[1]]) visit[user[0]][user[1]] = true;
}
} else {
for(int i=0; i<Integer.parseInt(go[0]); i++) {
user[0]++;
if(user[0] > N-1) user[0] = 0;
if(visit[user[0]][user[1]]) {
isBreak = true;
break;
}
//방문처리
if(!visit[user[0]][user[1]]) visit[user[0]][user[1]] = true;
}
}
}
int point = 0;
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(visit[i][j]) point++;
}
}
return point;
}
}
중요
- 1L을 1 L 로 분할하는 것은 좋았으나, 무턱대고 글자대로 자르다보니 103L이 103 L 이 아닌 1 0 3 L로 분할되는 문제가 발생하였고 이를 파악하는 것이 늦어 시간을 많이 잡아먹었다.
앞으로 split으로 분할할 때 내가 원하는 대로 분할한 것이 맞는지 다시 한 번 생각해봐야겠다.