Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[홍실] - 4주차 제출 #43

Open
wants to merge 7 commits into
base: hong-sile
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.idea/
57 changes: 57 additions & 0 deletions 1주차/홍실/BOJ_1051.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import static java.lang.Integer.*;

import java.util.Scanner;
import java.util.stream.Stream;

public class BOJ_1051 {

static int N;
static int M;
static int[][] map;

public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);

N = parseInt(scanner.next());
M = parseInt(scanner.next());
scanner.nextLine();
map = new int[N][M];

for (int i = 0; i < N; i++) {
String line = scanner.nextLine();
map[i] = splitToIntArray(line);
}

int answer = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
int size = calculateSize(i, j);
answer = max(size, answer);
}
}
System.out.println(answer);
}

public static int calculateSize(final int row, final int col) {
final int number = map[row][col];
int ans = 1;
int temp = 1;

while (temp + row < N && temp + col < M) {
if (map[row + temp][col] == number
&& map[row][col + temp] == number
&& map[row + temp][col + temp] == number) {
ans = temp + 1;
}
temp++;
}

return ans * ans;
}

public static int[] splitToIntArray(final String line) {
return Stream.of(line.split(""))
.mapToInt(Integer::parseInt)
.toArray();
}
}
59 changes: 59 additions & 0 deletions 1주차/홍실/BOJ_1213.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import static java.util.Comparator.*;

import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class BOJ_1213 {

static final String FAIL_MESSAGE = "I'm Sorry Hansoo";
static String middle = "";

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

String name = scanner.nextLine();

List<String> splitName = Stream.of(name.split(""))
.sorted(reverseOrder())
.collect(Collectors.toList());

System.out.println(solution(splitName));
}

private static String solution(List<String> splitName) {
List<String> alphas = new LinkedList<>();

while (!splitName.isEmpty()) {
String alpha = splitName.get(0);
splitName.remove(alpha);
int index = splitName.indexOf(alpha);

if (index == -1) {
if (middle.isBlank()) {
middle = alpha;
continue;
}
return FAIL_MESSAGE;
}

splitName.remove(alpha);
alphas.add(alpha);
}

Deque<String> answer = new LinkedList<>();
answer.add(middle);

for (String alpha : alphas) {
answer.addFirst(alpha);
answer.addLast(alpha);
}

return answer.stream()
.reduce(new StringBuilder(), StringBuilder::append, StringBuilder::append)
.toString();
}
}
47 changes: 47 additions & 0 deletions 1주차/홍실/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
## 백준 1051 : 숫자 정사각형

### 분석 과정

- N과 M이 50으로 한정되어 있어서 충분히 완전탐색으로 해도 가능하겠다 판단했습니다.
- row, col, 증분값으로 3중 for문 형식입니다.
- 좌측 상단에서 우측 하단순으로 탐색하는 형식이기에, 탐색하는 지점을 정사각형의 좌측 상단의 꼭짓점으로 여겼습니다.

### 문제 풀이 과정

1. row, col 2중 for문으르 좌측상단에서 우측 하단으로 각각의 지점을 탐색합니다.
2. 각각의 지점에서 for문으로 증분값 하나를 이용하여서, 정사각형을 탐색하였습니다. 이 떄, 한 변이라도 N, M값을 넘으면 반복문을 종료했습니다.
3. 정사각형의 최대 넓이를 기존의 max값과 비교해 더 큰 값으로 업데이트 해줍니다.

### 기타

- 꼭짓점에 들어가는 수가 자연수라고 잘못 읽어서, 0은 안되는 줄 알고 여러번 시도하다가 실패...
- 자바로 풀어보는 것이 처음이어서, 코드가 많이 너저분한데 연습해보겠습니다.

---

## 백준 1213: 팰린드롬 만들기

### 분석 과정

- 회문의 경우 중앙을 제외한 다른 부분의 알파벳은 짝을 이룬다는 특징을 이용해 그리디로 풀었습니다.
- 주어진 문자열에서 앞에서부터 탐색해나가며, 순차적으로 짝을 이루는 알파벳이 있는지 확인하려 했습니다.
- 이 때 이미 짝이 이뤄진 알파벳의 경우 다음 탐색 떄 짝을 이룰 수 없게 하기 위해, 기존 문자열에서 제거를 했습니다.
- 짝을 이루지 않는 중앙값의 경우 이미 중앙에 배치한 문자가 있는지로 회문을 이룰 수 있는지 판단했습니다.

### 문제 풀이 과정

1. 내림차순으로 문자열을 정렬합니다.
2. 입력된 문자열에서 짝을 이룬 문자는 제거를 할 것이기에, list형식으로 변환해줍니다.
3. 변환된 list가 비어있는지를 조건으로 반복문을 구성합니다.
1. 변환된 list의 가장 앞부분을 제거해줍니다.
2. 남겨진 list에서 짝을 이루는 문자가 있는지 봅니다.
- 짝을 이루는 문자가 없다면, 이미 중앙에 위치한 문자가 있는지 확인합니다.
- 이미 중앙에 위치한 문자가 있다면 회문을 구성할 수 없습니다.
- 이미 중앙에 위챃나 문자가 없다면 해당 문자를 중앙에 위치시킵니다.
- 짝을 이루는 문자가 있다면, 해당 문자를 제거하고, 별도의 list(alpha)에 저장합니다.
4. 반복문이 종료되면, 중앙값에 별도의 list(alpha)를 순회하며 앞과 뒤에 값을 추가합니다.

### 기타

- 오랫만에 스트림 문법도 연습하는 겸, 스트림을 의식적으로 특정 부분에서 사용해봤습니다.
-
78 changes: 78 additions & 0 deletions 2주차/홍실/BOJ_13901.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class BOJ_13901 {

static final int obstacle = -1;

static int R;
static int C;
static int K;
static int[][] map;
static int[] dx = {0, 0, -1, 1};
static int[] dy = {-1, 1, 0, 0};
static List<Integer> moveDir = new ArrayList<>();

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

R = scanner.nextInt();
C = scanner.nextInt();
scanner.nextLine();
K = scanner.nextInt();
scanner.nextLine();

map = new int[R][C];

for (int i = 0; i < K; i++) {
int br = scanner.nextInt();
int bc = scanner.nextInt();
scanner.nextLine();
map[br][bc] = obstacle;
}

int sr = scanner.nextInt();
int sc = scanner.nextInt();
scanner.nextLine();

for (int i = 0; i < 4; i++) {
moveDir.add(scanner.nextInt());
}

int temp = 0;
int endCount = 0;
while (true) {
int dir = moveDir.get(temp);
for (int i = 0; i < 4; i++) {
if (sr + dy[i] < 0
|| sr + dy[i] >= R
|| sc + dx[i] < 0
|| sc + dx[i] >= C
|| map[sr + dy[i]][sc + dx[i]] == obstacle) {
endCount++;
}
}
if (endCount == 4) {
break;
}
while (true) {
if (sr + dy[dir - 1] < 0
|| sr + dy[dir - 1] >= R
|| sc + dx[dir - 1] < 0
|| sc + dx[dir - 1] >= C
|| map[sr + dy[dir - 1]][sc + dx[dir - 1]] == obstacle) {
break;
}
map[sr][sc] = obstacle;
sr += dy[dir - 1];
sc += dx[dir - 1];
}
temp = (temp + 1) % 4;
endCount = 0;
}

System.out.print(sr + " ");
System.out.print(sc);
}
}
111 changes: 111 additions & 0 deletions 2주차/홍실/BOJ_2580.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class BOJ_2580 {

static class Point {

int row;
int col;

public Point(final int row, final int col) {
this.row = row;
this.col = col;
}
}

static final int BLANK = 0;

static int[][] sdocu = new int[9][9];
static List<Point> blankPoints = new ArrayList<>();
static int[][] answer = new int[9][9];

private static void solve(int count) {
if (count == blankPoints.size()) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
answer[i][j] = sdocu[i][j];
}
}
return;
}

Point blankPoint = blankPoints.get(count);
final Point section = calculateSection(blankPoint.row, blankPoint.col);
for (int number = 1; number <= 9; number++) {
if (checkSection(section, number)
&& checkRow(blankPoint, number)
&& checkCol(blankPoint, number)) {
sdocu[blankPoint.row][blankPoint.col] = number;
solve(count + 1);
sdocu[blankPoint.row][blankPoint.col] = BLANK;
}
}
}

private static boolean checkRow(final Point point, final int number) {
for (int i = 0; i < 9; i++) {
if (sdocu[point.row][i] == number) {
return false;
}
}
return true;
}

private static boolean checkCol(final Point point, final int number) {
for (int i = 0; i < 9; i++) {
if (sdocu[i][point.col] == number) {
return false;
}
}
return true;
}

private static boolean checkSection(final Point section, final int number) {
final int sectionRow = section.row * 3;
final int sectionCol = section.col * 3;

return sdocu[sectionRow][sectionCol] != number
&& sdocu[sectionRow][sectionCol + 1] != number
&& sdocu[sectionRow][sectionCol + 2] != number
&& sdocu[sectionRow + 1][sectionCol] != number
&& sdocu[sectionRow + 1][sectionCol + 1] != number
&& sdocu[sectionRow + 1][sectionCol + 2] != number
&& sdocu[sectionRow + 2][sectionCol] != number
&& sdocu[sectionRow + 2][sectionCol + 1] != number
&& sdocu[sectionRow + 2][sectionCol + 2] != number;
}

private static Point calculateSection(final int row, final int col) {
final int rowSection = row / 3;
final int colSection = col / 3;
return new Point(rowSection, colSection);
}

public static void main(String[] args) {
input();
solve(0);
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
System.out.print(answer[i][j] + " ");
}
System.out.println();
}
}

private static void input() {
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < 9; i++) {
final String line = scanner.nextLine();
final String[] split = line.split(" ");
for (int j = 0; j < 9; j++) {
sdocu[i][j] = Integer.parseInt(split[j]);
if (sdocu[i][j] == BLANK) {
blankPoints.add(new Point(i, j));
}
}
}
}

}
Loading