[Routine] 25 주차 시작!
in Daily on Routine
![[Routine] 25 주차 시작!](/assets/img/daily/routine/2023/2023-07-09/2023-07-09-myroutine-25th.png)
“2023년 07월 03일 부터 07월 09 까지의 나의 루틴.”
#목차
25주차
2023-07-03
- 오늘은 개발바닥의 이력서 주제의 유튜브를 보며 출근하였다.
- 느낀 점은 나 또한 너무 넓이만 신경 쓰고 깊이에 신경을 안 쓰는 거 같다는 생각을 하였다.
- 다시 한번 깊이에 신경 쓰는 공부를 해야겠다고 생각하였다.
2023-07-04
- 오늘도 개발바닥의 이력서 영상을 보며 출근하였다.
- 신입, 경력 분 들의 실력들이 정말 대단하다고 다시 한번 느꼈다.
- 역시 세상에는 열심히 꾸준히 하는 사람들이 정말 많구나 느꼈다.
2023-07-05
- 오늘도 어김없이 개발바닥의 이력서 영상을 보면서 출근하였는데, 그 이유는 나 또한 조만간 이력서를 수정해야겠다는 생각을 하였다.
- 왜냐하면 이력서를 수정하고 언 2개월이 지났는데 내가 또 무엇이 부족한지 어떠한 내용을 수정해야 하는지 확인하기 위해서 수정해야겠다는 생각을 하였다.
2023-07-06 스터디
- 오늘은 영한 님의 인강을 들으며 출근하였다.
- 개발바닥의 영상을 보면서 느낀 거지만 나 또한 너무 옆으로 넓고 얕게 지식을 쌓으려는 경향이 강했던거 같다.
- 자바와 스프링에 대해 깊게 공부해야겠다는 생각을 하였다.
스터디 BOJ_10871
문제
- 문제
- 아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다.
- 이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다.
A A B C D D a f z z 0 9 1 2 1 a 8 E W g 6 P 5 h 3 k x
<그림 1>
- 한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다.
- 심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다.
- 그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:
- Aa0aPAf985Bz1EhCz2W3D1gkD6x
- 칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.
- 입력
- 총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.
- 출력
- 영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다.
입력 예제1 출력 예제 1 ABCDE Aa0FfBb1GgCc2HhDd3IiEe4Jj abcde 01234 FGHIJ fghij 입력 예제1 출력 예제 1 AABCDD Aa0aPAf985Bz1EhCz2W3D1gkD6x afzz 09121 a8EWg6 P5h3kx
- 출력
- 총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.
풀이
// file: 풀이.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// 1) 첫 번째 방법
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[][] words = new char[5][15]; // 문자 하나씩 저장하기 위한 이중 배열 선언
// 다섯 줄의 단어(word)를 입력 받아 words 배열에 담음
for (int i = 0; i < 5; i++) { // 5번 반복
String word = br.readLine();
for (int j = 0; j < word.length(); j++) { // 입력한 값의 개수만큼 반복
// charAt() 해당 인덱스의 값을 반환해줌
words[i][j] = word.charAt(j); // words i번째 j번 방에 입력한 문자열 word 변수의 j번째 값 넣기
}
}
// 세로로 읽어들인 문자들을 출력함
// String이 아닌 StringBuilder를 사용한 이유?
// String의 경우 기존에 선언한 값에 추가(+=)한 경우 새로운 객체로 탄생하게 된다.
// 하지만, StringBuilder의 경우 sb.append("xxx") 새로운 값을 추가하게 되면 기존 StringBuilder의 객체에 새로운 값이 추가된다.
StringBuilder sb = new StringBuilder();
for (int j = 0; j < 15; j++) {
for (int i = 0; i < 5; i++) {
if (words[i][j] != '\0') { // \0은 널 문자(Null character)를 나타낸다. 즉, null이 아닐때
sb.append(words[i][j]); // 횡(row)로 append해주기
}
}
}
System.out.println(sb);
// -------------------------------------------------------------
// 2) 두 번째 Stream API를 이용한 방법
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // BufferedReader를 사용하여 입력을 처리
String[] words = new String[5]; // 문자열 배열 words를 선언
for (int i = 0; i < 5; i++) { // 반복문을 사용하여 5개의 문자열을 입력 받고, words 배열에 저장
words[i] = br.readLine();
}
String result = IntStream.range(0, 15) // IntStream을 사용하여 0부터 14까지의 범위를 생성. 이 숫자들은 문자열의 인덱스를 나타낸다.
// .mapToObj()를 사용하여 각 인덱스에 대해 아래의 연산을 수행
.mapToObj(j -> IntStream.range(0, 5) // 내부적으로 또 다른 IntStream을 생성하여 0부터 4까지의 범위를 나타낸다. 이 숫자들은 각 문자열의 인덱스이다
.filter(i -> j < words[i].length()) // .filter()를 사용하여 해당 인덱스에 문자가 있는지 확인하고, 필요한 경우 해당 문자열에서 문자를 가져온다.
.mapToObj(i -> words[i].charAt(j)) // .mapToObj()를 사용하여 문자를 문자 객체로 변환
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString()) // .collect()를 사용하여 내부 인덱스(IntStream의 요소)에 대해 필터링된 문자를 차례대로 StringBuilder 객체에 추가
.collect(Collectors.joining()); // .collect(Collectors.joining())을 사용하여 각 인덱스의 문자들을 모아 하나의 문자열로 만든다.
System.out.println(result);
}
}
2023-07-07
- 오늘도 어김없이 영한 님의 인강과 함께
Back to [Routine] 24 주차 시작!
Continue with [Routine] 26 주차 시작!