プログラミング自主学習 DAY81 CodingTest
縦読み
<問題説明>
文字列 my_string と整数 m、c が与えられた場合、my_stringを一列に m 文字ずつ横に並べたとき、左から c 番目の列にある文字を文字列として返す solution 関数を作成してください。
<制限事項>
my_string は小文字のアルファベットで構成されています。
1 ≤ m ≤ my_stringの長さ ≤ 1,000
mはmy_stringの長さの約数のみが与えられます。
1 ≤ c ≤ m
<入出力例>
my_string | m | c | result |
---|---|---|---|
"ihrhbakrfpndopljhygc" | 4 | 2 | "happy" |
"programmers" | 1 | 1 | "programmers" |
<入出力例の説明>
入出力例 #1
例題1のmy_stringを1行に4文字ずつ書くと、次のようになります。
1列目 | 2列目 | 3列目 | 4列目 |
---|---|---|---|
i | h | r | h |
b | a | k | r |
f | p | n | d |
o | p | l | j |
h | y | g | c |
2列目に書かれた文字を縦に読むと、happyとなるため、"happy"を返します。
入出力例 #2
例題2のmy_stringは、mが1であるため、縦に"programmers"を書くことと同じです。したがって、1列目に書かれた文字を縦に読むと、programmersになります。したがって、"programmers"を返します。
感想
正直、問題を理解するに結構苦戦しました。
問題を繰り返しながら読むたびに思い浮か浮かべたの言葉は「これは韓国語ですか?」でした。
my_stringは1次元のchar[]配列であるため、最初は問題のm,cを活用してchar[][] 配列を生成し、my_stringの値を初期化されていなchar[][]に入れようと思いましたが、とても効率が悪く厄介でした。
まず、次元が値がうため、二重for文も難しい状況で、count=0という変数を宣言し、初期化しました。
class Solution {
int count = 0;
しかし、二重for文はとても効率が悪いため、考えに考えた結果、配列を作らずに、for文だけで答えを得る方法が思いつきました。
for文の初期式、条件式、増減式を活用することでした。めったに増減式は触らないタイプですが、効率のために以下のようにコードを作成し、問題を解決しました。
class Solution {
int count = 0;
public String solution(String my_string, int m, int c) {
StringBuilder sb = new StringBuilder();
for(int i=c-1 ; i<my_string.length(); i+=m){
sb.append(my_string.charAt(i));
}
return sb.toString();
}
}
ps
int count = 0;を消すの忘れました、、、
Embedded Systemの会社だったら絶対叱られたと思います。(笑)
Discussion