Skip to main content

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"

정답코드

  1. StringBuilder 선언
  2. 문자열 my_string을 한 줄에 m글자씩 끊어서 가로로 쓰기
  3. 그런 다음, 세로 방향으로 c번째 열의 문자들만 뽑기
  4. 이걸 코드로 구현하려면 "몇 번째 문자를 뽑을지" 정확히 계산해야 한다.
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 )

my_string을 m글자씩 끊어 세로 배열로 생각 각 줄에서 (c - 1)번째 문자를 추출해 결과에 추가 (2).png
이걸 인덱스로 풀어보면 다음과 같다.

줄 번호 (i)

계산식 / 인덱스

문자

0

0 × 4 + (2 - 1) = 1

h

1

1 × 4 + (2 - 1) = 5

a

2

2 × 4 + (2 - 1) = 9

p

3

3 × 4 + (2 - 1) = 13

p

4

4 × 4 + (2 - 1) = 17

y

이렇게 index = i * m + (c - 1) 공식을 쓰면 원하는 문자만 추출할 수 있다.

💡 왜 c-1 을 하는가?
  • 인덱스는 0부터 시작한다.
  • 그런데 문제에서 주어지는 c는 1부터 시작한다.
  • 예를 들어, 1번째 열이라면 실제로는 인덱스 0이니까 c - 1 해주는 ​것이다.

비슷한 유형 문제