23.02.02
- 25일 해야할 일
- [x] 코딩테스트 시험!
- [x] 자바 이론 공부
- [x] 프로그래머스 문제 풀기!
- 제가 블로그에 올리기 전에 노션에 따로 적어 놓는데 노션에서 자꾸 한글이 안써져요 ㅠㅠㅠ왜일까요 …?
- 결국 문제를 풀고 3번 문제를 풀고 있는데, 시간이 부족하네여 ㅠㅠ
- sc.nextInt(); 이 부분에서 에러가 났는데, 왜 나는지 모르겠어서 계속해서 다시 풀었습니다..ㅎㅎㅎ
- 자바 환경에서 문제열을 확인할 떄, 문자열을 문자 배열로 만드는 것은 charAt() 메소드보다 메모리 효율성
솔리드를 다시 복습하고 있습니다!
- Solid 스펙 읽기: Solid의 기본 원칙과 목적을 이해하기 위해서는 공식 Solid 스펙을 읽어보시는 것이 좋습니다.
- 웹 개발 이해: Solid을 사용하려면 HTML, CSS, JavaScript 등 웹 개발에 대한 이해가 필요합니다.
- Linked Data와 시맨틱 웹 이해: Solid은 Linked Data 기반입니다. Linked Data와 시맨틱 웹의 기초를 이해하는 것이 중요합니다.
- Solid 프로그래밍 라이브러리 공부: Solid에서 사용할 수 있는 라이브러리는 Solid.js 자바스크립트 라이브러리와 RDF.js 라이브러리 등이 있습니다. 이 라이브러리를 익히면 Solid을 사용하는 법을 더 잘 이해할 수 있습니다.
- Solid 앱 살펴보기: 이미 만들어진 Solid 앱을 살펴보세요. 어떻게 만들어졌는지, 제공하는 기능이 무엇인지 알아보시면 Solid의 실제 애플리케이션
단일 책임 원칙(Single Responsibility Principle)은 프로그래밍에서 클래스나 모듈이 단 한 가지 책임만 가져야 한다는 것을 의미합니다. 즉, 클래스나 모듈은 변경 사유가 단 한 가지만 있어야 하며, 다른 부분에 대해서는 영향을 미치지 않아야 합니다.
예를 들어, 주문 처리 시스템이 있다고 가정해봅시다. 주문 정보를 저장하는 클래스와 주문을 전송하는 클래스가 있습니다. 이 두 클래스는 단일 책임 원칙에 따라 분리되어야 합니다. 즉, 주문 정보를 저장하는 클래스는 오직 주문 정보를 저장하는 역할만 해야 하고, 주문을 전송하는 클래스는 오직 주문을 전송하는 역할만 해야 합니다. 이렇게 각 클래스는 각기 다른 책임을 가지게 되어 개발자는 이를 수정하고 테스트하기 쉽게 됩니다
개방/폐쇄 원칙은 소프트웨어 개발에서 아키텍처와 설계의 개선을 위한 원칙 중 하나입니다. 이 원칙은 소프트웨어의 구성 요소가 확장에 열려 있지만 변경에는 폐쇄되어 있어야 한다는 것을 의미합니다.
예시로, 개방/폐쇄 원칙을 적용한 경우, 새로운 기능을 추가할 때는 기존의 코드를 수정하지 않고 새로운 클래스나 모듈을 추가하여 기능을 확장할 수 있습니다. 그러나, 기존의 구성 요소를 변경할 때는 그 구성 요소의 테스트 코드를 통과하는 것을 보장하며, 기존의 구성 요소를 변경하지 않도록 주의해야 합니다.
나머지는 다시 정리해보기!
항해99 알고리즘 코딩테스트
하. 물건을 구매해볼까?
르탄이가 1000원을 가지고 편의점에서 물건을 사려고 한다. 편의점에는 500원, 100원, 50원, 10원이 충분히 있고, 편의점 직원은 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 르탄이가 편의점에서 물건을 사고 1000원 지폐 한 장을 냈을 때, 받을 잔돈의 개수를 구하는 프로그램을 작성하여라. (단, 물건의 가격은 10원 이상 1000원 미만이며, 1원 단위는 고려하지 않는다.)
- 아래 답안 포맷을 참고하여 답안을 작성해주시기 바랍니다.
- Java 답안
public class Main {
public int solution(int num) {
int answer = 0;
return answer;
}
public static void main(String[] args) {
Main method = new Main();
int num1 = 160;
System.out.println(method.solution(num1));
}
}
public static void main(String[] args) throws IOException {
//그냥 풀었을 때
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //BufferedReader 정수를 읽는데 사용
int cost = Integer.parseInt(br.readLine());
cost = 1000-cost;
int num =0;
while(cost>0){
if(cost/500>0){
num += cost/500;
cost = cost%500;
}
else if(cost/100>0){
num += cost/100;
cost = cost%100;
}
else if(cost/50>0){
num += cost/50;
cost = cost%50;
}
else if(cost/10>0){
num += cost/10;
cost = cost%10;
}
else{
num += cost/1;
}
}
System.out.println(num);
그리디로 풀었을 경우!
어차피 계산할때부터 애초에 금액이 1000원의 남은 잔돈을 가지고 나머지 금액을 계속 빼가는 방식입니다.
즉, 500원을 최대한 빼주면 적어도 500원이 새로 생기는 경우는 없을 겁니다.
우리는 이런 추측을 바탕으로 100원이나 50원 10원 5원에도, 적용할 수 있습니다.
각 금액별로 딱 한번씩만 값을 나누면서 그 값을 num에 저장하면됩니다. 그러면 정답이 나오게 됩니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cost = Integer.parseInt(br.readLine());
int[] coinArr = {500, 100, 50, 10};
cost = 1000 - cost;
int num = 0;
for (int i = 0; i < 4; i++) {
if (cost / coinArr[i] > 0) {
num += cost / coinArr[i];
cost = cost % coinArr[i];
}
}
System.out.println(num);
중. 동그라미 엑스로 숫자를?
"OOXXOXXOOO"와 같은 OX문의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
(단, OX문의 결과는 0보다 크고 80보다 작은 문자열이 주어진다. 또한 문자열은 O와 X만으로 이루어져 있다.)
- 아래 답안 포맷을 참고하여 답안을 작성해주시기 바랍니다.
- Java 답안 포맷
public class Main {
public int solution(String s) {
int answer = 0;
return answer;
}
public static void main(String[] args) {
Main method = new Main();
String s = "OXOOOXXXOXOOXOOOOOXO";
System.out.println(method.solution(s));
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.nextLine();
int n = a.charAt(0) - '0'; //횟수 설정
for (int i = 0; i < n; i++) {
int count = 0;
int sum = 0;
String str = sc.nextLine(); //문자열 받아옴
String[] arr = str.split(""); //한글자 단위로 배열 저장
for (int j = 0; j < arr.length; j++) {
if (arr[j].equals("O")) { //점수 계산
count++;
sum += count;
} else {
count = 0;
}
}
System.out.println(sum); //점수 출력
}
sc.close();
}
}
상. 지뢰 탐지가 필요해!
windows에서 지원하는 지뢰 찾기 게임을 한번쯤은 해 보았을 것이다. 특히 르탄이는 지뢰찾기의 매니아로 알려져 있다. 지뢰 찾기 map은 N*N의 정사각형 모양으로 각 칸에는 숫자가 들어가 있거나 지뢰가 들어가 있다. 빈 칸에는 숫자 0이 들어있다고 생각하자.
map의 어떤 칸에 적혀 있는 숫자는, 그 칸과 인접해 있는 여덟 개의 칸 중에서 지뢰가 들어 있는 칸이 몇 개인지를 나타내 준다. 물론 인접한 칸이 map 내부에 있는 경우에 대해서만 생각하면 된다. 예제를 보면 더 잘 이해할 수 있을 것이다.
이번 문제는 조금 업그레이드 된 지뢰 찾기로, 한 칸에 한 개의 지뢰가 있는 것이 아니고, 한 칸에 여러 개(1 이상 9 이하)의 지뢰가 묻혀 있는 게임이다. 따라서 map의 어떤 칸에 적혀 있는 숫자는, 그 칸과 인접해 있는 여덟 개의 칸들에 들어 있는 지뢰의 총 개수가 된다.
이미 windows 지뢰찾기 같은 것을 마스터한 르탄이는, map에서 지뢰에 대한 정보만이 주어졌을 때, 르탄이는 map을 완성하고 싶다고 한다. N과 지뢰의 위치가 주어졌을 때, 르탄이를 도와서 지뢰 찾기 map을 완성하는 프로그램을 작성하시오.
(단, 1 ≤ N ≤ 1,000 이며, 배열의 각 요소에는 지뢰 찾기 map에 대한 정보가 주어지는데 '.' 또는 숫자로 이루어진 문자열이 들어온다. '.'는 지뢰가 없는 것이고 숫자는 지뢰가 있는 경우로 그 칸의 지뢰의 개수이다. 한 줄은 N개의 문자로 이루어져 있다.)
출력
N개의 줄에 걸쳐서 완성된 지뢰 찾기 map을 출력한다. 지뢰는 ''로 출력하며. 10 이상인 경우는 'M'(Many)으로 출력하면 된다. map은 숫자 또는 'M' 또는 ''로만 이루어져 있어야 한다.
- 아래 답안 포맷을 참고하여 답안을 작성해주시기 바랍니다.
- Java 답안 포맷
public class Main {
public char[][] solution(int N, char[][] ary) {
int[] x = {1, -1, 0, 0, 1, 1, -1, -1};
int[] y = {0, 0, 1, -1, 1, -1, 1, -1};
char[][] answer = new char[N][N];
return answer;
}
public static void main(String[] args) {
Main method = new Main();
int N = 5;
char[][] chars = {{'1', '.', '.', '.', '.'},
{'.', '.', '3', '.', '.'},
{'.', '.', '.', '.', '.'},
{'.', '4', '.', '.', '.'},
{'.', '.', '.', '9', '.'}};
System.out.println(Arrays.deepToString(method.solution(N, chars)));
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class P1996 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
char[][] map = new char[n][n], mine = new char[n][n];
// 8방 탐색을 하기 위한 xy 배열에 넣기
int[] dx = { -1, -1, -1, 0, 0, 1, 1, 1 }, dy = { -1, 0, 1, -1, 1, -1, 0, 1 };
for (int i = 0; i < n; i++) {
String tmp = br.readLine();
for (int j = 0; j < n; j++)
map[i][j] = tmp.charAt(j);
}
// 배열 입력받기
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int cnt = 0;
if (map[i][j] != '.') {
mine[i][j] = '*';
continue;
}
else
for (int k = 0; k < 8; k++) {
if (i + dx[k] < 0 || i + dx[k] >= n || j + dy[k] < 0 || j + dy[k] >= n)
continue;
if (map[i + dx[k]][j + dy[k]] > '0')
cnt += map[i + dx[k]][j + dy[k]] - '0';
}
if (cnt < 10)
mine[i][j] = (char) (cnt + '0');
else
mine[i][j] = 'M';
}
}
for (int i = 0; i < n; i++)
System.out.println(mine[i]);
}
}
AI가 짠 코드입니당 ㅎㅎㅎ 역시..나보다.. 잘해욤...
import java.util.Scanner;
public class Main {
static int n, m;
static char[][] map;
static int[][] mine = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
sc.nextLine();
map = new char[n][m];
for (int i = 0; i < n; i++) {
map[i] = sc.nextLine().toCharArray();
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (map[i][j] == '.') {
int cnt = 0;
for (int k = 0; k < 8; k++) {
int x = i + mine[k][0];
int y = j + mine[k][1];
if (x >= 0 && x < n && y >= 0 && y < m && map[x][y] == '*') {
cnt++;
}
}
map[i][j] = (char) (cnt + '0');
}
}
}
for (int i = 0; i < n; i++) {
System.out.println(map[i]);
}
}
}