4
1

これのやつです。

問題

考え方

問題を見た時に「????」てなりませんでしたか?
自分はなりました。入力値がよく分からなかったです。
一緒に見ていきましょうか。

<入力される値>
入力は以下のフォーマットで与えられます。
X Y Z
(1,1,1) (1,2,1) ... (1,Y,1)
(2,1,1) (2,2,1) ... (2,Y,1)
...
(X,1,1) (X,2,1) ... (X,Y,1)
--
(1,1,2) (1,2,2) ... (1,Y,2)
(2,1,2) (2,2,2) ... (2,Y,2)
...
(X,1,2) (X,2,2) ... (X,Y,2)
--
...
--
(1,1,Z) (1,2,Z) ... (1,Y,Z)
(2,1,Z) (2,2,Z) ... (2,Y,Z)
...
(X,1,Z) (X,2,Z) ... (X,Y,Z)
--

一行の「X Y Z」の数字は下記を表します

「X Y Z」の次の行

(1,1,1) (1,2,1) ... (1,Y,1)

がどこを表すか考えてみましょうか。

問題文の図から下記の部分に当たります。
1111.png

そのまま見ていくと初めの部分は下記になります

--で区切られている2個目の段落を見てみましょう

3Dプリンタのように下から層をなすように入力値が渡されているのがわかります。

内容のイメージが湧きましたら、これをX方向から見た時の形を考えてコードを書いていきます。

解答コード

process.stdin.resume();
process.stdin.setEncoding('utf8');
// 自分の得意な言語で
// Let's チャレンジ!!
var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const [x, y, z] = lines[0].split(' ').map(item => Number(item));
  const result = new Array(z);
  
  let i = 1;
  for(let tempZ=0; tempZ<z; tempZ++){
      result[z - tempZ - 1] = new Array(y).fill('.');
      
      for(let tempX=0; tempX<x; tempX++){
          for(let tempY=0; tempY<y; tempY++){
              if(lines[i][tempY] === '#'){
                  result[z - tempZ - 1][tempY] = '#';
              }
          }
          i++;
      }
      i++;
  }
  result.map(item => console.log(item.join('')));
});

解説

実際に書いたところはreader.on('close', () => {以下のところです

  const [x, y, z] = lines[0].split(' ').map(item => Number(item));
  const result = new Array(z);
  
  let i = 1;
  for(let tempZ=0; tempZ<z; tempZ++){
      result[z - tempZ - 1] = new Array(y).fill('.');
      
      for(let tempX=0; tempX<x; tempX++){
          for(let tempY=0; tempY<y; tempY++){
              if(lines[i][tempY] === '#'){
                  result[z - tempZ - 1][tempY] = '#';
              }
          }
          i++;
      }
      i++;
  }
  result.map(item => console.log(item.join('')));

コメントを書くと下記になります

  // 入力値 x y z を取得しています
  const [x, y, z] = lines[0].split(' ').map(item => Number(item));

  // 結果の配列を入れる変数を定義しています
  const result = new Array(z);
  
  let i = 1; // iは入力値のラインの行です
  for(let tempZ=0; tempZ<z; tempZ++){
      // 下から1層目、二層目...と対応する結果配列の初期値を定義しています
      result[z - tempZ - 1] = new Array(y).fill('.');
      
      for(let tempX=0; tempX<x; tempX++){
          for(let tempY=0; tempY<y; tempY++){
              
              // 1個でも'#'があれば結果は'#'になります 
              if(lines[i][tempY] === '#'){
                  result[z - tempZ - 1][tempY] = '#';
              }
          }
          i++; // 次の行に移ります
      }
      i++; // 「---」の行を飛ばしています
  }

  // 結果の出力です
  result.map(item => console.log(item.join('')));

考え方として下記の考え方をしました。

感想

読んでいただきありがとうございます!

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1