2
1
paiza×Qiita記事投稿キャンペーン「プログラミング問題をやってみて書いたコードを投稿しよう!」

Paiza×Qiitaキャンペーン Javaで解説してみた【B 名刺バインダー管理 編】

Last updated at Posted at 2024-08-28

問題へのリンク

解答コード

詳細

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		final int N = scanner.nextInt();
		final int M = scanner.nextInt();
		scanner.close();

		int page = (M - 1) / N + 1;
		int index = M - (page - 1) * N;

		if ((page & 1) == 1) {
			page++;
		} else {
			page--;
		}
		
		System.out.println((N * (page - 1)) + (N - index + 1));
	}
}


解説

詳細

paizaで重要なのは、コードの記述能力というよりも、どれだけ問題を整理できるかです。

まず、Mが何ページ目の何番目にあるかを考えます。

ページ
・先頭のページを1とすると M から N で割った時、端数切り上げにする必要があります
⇒ M / N だと端数切捨てになってしまいます。切り上げるためには (M - 1) / N + 1 にする必要があります。

閾値(境界線にあたる値)を意識したら気づけます
例1: M = 1 N = 3
1 / 3 ⇒ 0
( 1 - 1 ) / 3 + 1 ⇒ 1
例2:M = 3 N = 3
3 / 3 ⇒ 1
( 3 - 1 ) / 3 + 1 ⇒ 1
例3:M = 4 N = 3
4 / 3 ⇒ 1
( 4 - 1 ) / 3 + 1 ⇒ 2

次にそのページの何番目のポケットに入っているかを計算します
M から N * (page - 1) を引くと良いでしょう

では、page と index を使って目的の数値を求めます
page が奇数の場合、裏面は次のページになります(page++)
page が偶数の場合、裏面が前のページになります(page--)
例ではbit演算で行っていますが(一番右のbitが1なら奇数)2で割って余り0なら偶数です(余り1なら奇数で覚えると、マイナスの時困るので気をつけましょう)

index = 1 の時、裏から見るとポケットは一番右(N)に
index = N の時、裏から見るとポケットは一番左(1)になります

ですのでN - index + 1 番目のポケットに入っていることになります

ですので数字になおすと N * (page- 1) + (N - index + 1 )
になります。

Paizaのコツ

プログラミングのコツは、やりたいことをしっかり分解して、自分のできることに細分化していくことです。
数億行クラスの複雑な処理を行うプログラムも、一行単位なら初心者でもかけるものしか使ってません。
Bランクだと、まだ特殊なアルゴリズムは要求されません。
素直かつ冷静に、コードに落とし込めるよう練習していきましょう。

2
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
2
1