22. [Java] 세로 읽기
https://school.programmers.co.kr/learn/courses/30/lessons/181904
- 문자열 my_string과 두 정수 m, c
- my_string을 한 줄에 m 글자씩 가로로 적었을 때
- 왼쪽부터 세로로 c번째 열에 적힌 글자들을 문자열로 return하기
- my_string은 영소문자로 이루어져 있다.
- 1 ≤ m ≤ my_string의 길이 ≤ 1,000
- m은 my_string 길이의 약수로만 주어진다.
- 1 ≤ c ≤ m
예시
my_string = "ihrhbakrfpndopljhygc"
m = 4 이면, 다음처럼 나열됨
ihrh
bakr
fpnd
oplj
hygc
c = 2일 때, 각 줄의 2번째 문자만 추출 → "happy"
정답코드
- StringBuilder 선언
- 문자열
my_string
을 한 줄에m
글자씩 끊어서 가로로 쓰기 - 그런 다음, 세로 방향으로
c
번째 열의 문자들만 뽑기 - 이걸 코드로 구현하려면 "몇 번째 문자를 뽑을지" 정확히 계산해야 한다.
class Solution {
public String solution(String my_string, int m, int c) {
StringBuilder sb = new StringBuilder();
int rows = my_string.length() / m;
for (int i = 0; i < rows; i++) {
int index = i * m + (c - 1); // c는 1부터 시작, 인덱스는 0부터
sb.append(my_string.charAt(index));
}
return sb.toString();
}
}
예시
my_string = "ihrhbakrfpndopljhygc"
m = 4 // 한 줄에 4글자씩
c = 2 // 세로 두 번째 열 문자만 뽑기
문자열의 길이를 m만큼 나눠서 가로로 써보면 아래와 같다.
행의 개수는 my_string.length()가 된다.
0: i h r h ← 인덱스 0~3
1: b a k r ← 인덱스 4~7
2: f p n d ← 인덱스 8~11
3: o p l j ← 인덱스 12~15
4: h y g c ← 인덱스 16~19
우리가 가져오고 싶은 건 각 줄의 2번째 문자이다. ( h, a, p, p, y )
줄 번호 ( | 계산식 / 인덱스 | 문자 |
---|---|---|
0 | 0 × 4 + (2 - 1) = 1 |
|
1 | 1 × 4 + (2 - 1) = 5 |
|
2 | 2 × 4 + (2 - 1) = 9 |
|
3 | 3 × 4 + (2 - 1) = 13 |
|
4 | 4 × 4 + (2 - 1) = 17 |
|
이렇게 index = i * m + (c - 1)
공식을 쓰면 원하는 문자만 추출할 수 있다.
💡 왜 c-1 을 하는가?
- 인덱스는 0부터 시작한다.
- 그런데 문제에서 주어지는
c
는 1부터 시작한다. - 예를 들어, 1번째 열이라면 실제로는 인덱스
0
이니까c - 1
해주는 것이다.
비슷한 유형 문제