1. 1 = I
  2. 3 = III
  3. 4 = IV (減算)
  4. 9 = IX (減算)
  5. 58 = LVIII
  6. 1994 = MCMXCIV
  7. 3999 = MMMCMXCIX
コース一覧
コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
整数をローマ数字に

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

ソート、探索、再帰などのアルゴリズムに加え、OS (プロセス、メモリ、ファイルシステム)、ネットワーク (TCP/IP、HTTP、DNS、CDN)、データベースまで、Web エンジニアに必要な CS の基礎を一本で学べる総合コースです。エンジニア転職を目指す学習者や、CS 出身でない現役エンジニアを対象としています。約 34 時間 (1 日 30 分 × 68 日) で 135 レッスンを修了でき、修了後は技術選定やシステム設計の議論に自信を持って参加できるようになります。

1
再帰の基礎
01. 階乗(再帰)5分
02. フィボナッチ数(再帰)5分
03. 累乗(再帰)5分
04. 配列の合計(再帰)5分
05. 桁数を数える(再帰)5分
06. 文字列を逆順(再帰)5分
07. ユークリッドの互除法(GCD)5分
08. 第1章まとめクイズ — 再帰の基礎5分
2
第2章 探索
01. 線形探索で位置を返す5分
02. 二分探索 (反復版)5分
03. 二分探索 (再帰版)5分
04. lower_bound (最初に >= target の位置)5分
05. ピーク要素検索5分
06. 回転ソート配列での探索5分
07. 第2章まとめクイズ5分
3
ソート
01. バブルソート実装5分
02. 選択ソート5分
03. 挿入ソート5分
04. マージソート5分
05. クイックソート5分
06. カウントソート5分
07. 比較関数つきソート5分
08. 第3章まとめクイズ5分
4
配列 / 文字列の応用
01. 双方向ポインタで和 = K5分
02. スライド窓の最大和5分
03. 回文判定5分
04. 重複なし最長部分文字列5分
05. 大きな数の文字列乗算5分
06. アナグラムグルーピング5分
07. 第4章まとめクイズ — 配列 / 文字列の応用5分
5
クラスと OOP
01. 長方形クラス(面積と周長)5分
02. スタッククラス(push と pop)5分
03. キュークラス(enqueue と dequeue)5分
04. 単方向リンクリスト5分
05. 二分探索木 (BST) への挿入5分
06. カウンタクラス(機能合成)5分
07. 第 5 章クイズ — クラスと OOP5分
6
動的計画法 (基礎)
01. メモ化フィボナッチ5分
02. DP配列でフィボナッチ5分
03. 階段の登り方5分
04. コイン両替最小枚数5分
05. 0/1 ナップサック問題5分
06. 最長共通部分列 (LCS)5分
07. 第6章まとめクイズ5分
7
総合演習
01. ソート済み 2 配列のマージ5分
02. 配列の k 回転5分
03. カッコの妥当性5分
04. ローマ数字を整数に5分
05. 整数をローマ数字に5分
06. 雨水を溜める5分
07. 最終総まとめクイズ5分
8
[OS] Section 1. OS とは
01. コンピューターとOSの役割15分
02. OSの歴史(バッチ→マルチタスク→マルチユーザー)15分
03. カーネルとユーザーランド15分
04. システムコールの仕組み15分
05. Linux / macOS / Windows のアーキ比較15分
9
[OS] Section 2. プロセスとスレッド
01. プロセスとは15分
02. スレッドとプロセスの違い15分
03. コンテキストスイッチ15分
04. スケジューラとアルゴリズム15分
05. プロセス間通信(IPC)15分
10
[OS] Section 3. メモリ管理
01. メモリ階層(レジスタ→キャッシュ→RAM→ディスク)15分
02. 仮想メモリ15分
03. ページングとスワップ15分
04. mmap とメモリマップトファイル15分
05. ガベージコレクション概要15分
11
[OS] Section 4. ファイルシステム
01. ファイルシステムとは15分
02. i-node とディレクトリ15分
03. ext4 / APFS / NTFS の違い15分
04. ジャーナリングと耐障害性15分
05. パーミッションと所有者15分
12
[OS] Section 5. 同期と並行性
01. レースコンディション15分
02. Mutex と Semaphore15分
03. デッドロック15分
04. 非同期と並行15分
05. イベントループと epoll15分
13
[ネットワーク] ネットワークの全体像
01. ネットワークとは8分
02. OSI 7階層モデル10分
03. TCP/IP 4階層モデル9分
04. パケットとフレーム9分
05. ルーター・スイッチ・ハブ9分
14
[ネットワーク] IP とルーティング
01. IPアドレス (IPv4 / IPv6)10分
02. サブネットマスクと CIDR11分
03. NAT とプライベートIP9分
04. ルーティングと経路選択10分
05. ファイアウォール基礎9分
15
[ネットワーク] TCP / UDP
01. TCP と UDP の違い9分
02. 3-way ハンドシェイク9分
03. 輻輳制御と再送10分
04. UDP の用途 (DNS / 動画 / ゲーム)8分
05. ポート番号と well-known port9分
16
[ネットワーク] HTTP / HTTPS
01. HTTP の基本10分
02. HTTP メソッド9分
03. HTTPS と TLS ハンドシェイク10分
04. HTTP/2 と HTTP/3 (QUIC)10分
05. REST API の設計原則10分
17
[ネットワーク] DNS とドメイン
01. DNS とは8分
02. レコードタイプ10分
03. 名前解決の流れ10分
04. DNS キャッシュと TTL9分
05. CDN の仕組みと Anycast10分
18
[ネットワーク] 応用
01. ロードバランサ (L4 / L7)10分
02. プロキシとリバースプロキシ9分
03. WebSocket とリアルタイム通信9分
04. gRPC と HTTP/2 利用10分
19
[データベース] データベースの基礎
01. データベースとは8分
02. RDB と NoSQL の違い8分
03. データベースの歴史8分
04. エンティティ関係モデル (ER)8分
05. 主キー・外部キー・候補キー8分
20
[データベース] 正規化
01. 正規化とは何か8分
02. 第1正規形8分
03. 第2正規形8分
04. 第3正規形8分
05. 非正規化のトレードオフ8分
21
[データベース] インデックスと B-tree
01. インデックスの役割8分
02. B-tree の仕組み8分
03. B+tree(実際の DB 実装)8分
04. ハッシュインデックス8分
05. カバリングインデックス8分
22
[データベース] トランザクションと ACID
01. トランザクションとは8分
02. ACID 特性8分
03. 分離レベル8分
04. MVCC(マルチバージョン同時実行制御)8分
05. デッドロックと回避8分
23
[データベース] クエリ最適化
01. クエリプランナの役割8分
02. EXPLAIN の読み方8分
03. Nested Loop / Hash / Merge Join8分
04. インデックスチューニング8分
05. 統計情報とカーディナリティ8分
24
[データベース] スケーリング
01. レプリケーション8分
02. シャーディング8分
03. CAP 定理8分
04. 結果整合性8分
05. NewSQL と分散 SQL8分

整数をローマ数字に

大きい記号から削っていくと、4 が IIII になる

1994 をローマ数字にしたいとき、まず M を 1 つ取って 994、次に D を取って 494、と大きい記号から順に引いていく手が思い浮かびます。実際この方針で 3 は III、58 は LVIII と正しく出ます。

つまずくのは 4 と 9 です。4 は I を 4 回並べて IIII になってしまいます。正解は IV で、同じ記号を 4 回続けて書くことは許されていません。

貪欲がうまくいく表と、いかない表

大きいほうから取れるだけ取る、という進め方を貪欲法と呼びます。日本の硬貨で 380 円を作るときは、100 円を 3 枚、50 円を 1 枚、10 円を 3 枚と大きい順に選ぶだけで必ず最小枚数になります。

Python

coins = [500, 100, 50, 10, 5, 1] amount = 380 # 大きいほうから取れるだけ取る、で最小枚数に届く

ところが額面が 1, 3, 4 のような並びだと話が変わります。6 を作るとき、貪欲では 4 + 1 + 1 の 3 枚になりますが、正解は 3 + 3 の 2 枚です。第 6 章の硬貨の問題を動的計画法で解いたのは、こうした額面では貪欲が成立しないからでした。

ローマ数字の記号を 7 個のまま使うと、まさにこの「成立しない表」になります。4 と 9 のところで詰まるからです。逆に言えば、この問題の設計判断は 1 つだけで、貪欲が成立するように表のほうを作り替えられないか、という点に絞られます。4 と 9 の位置に現れる 2 文字の並びを、2 文字としてではなく 1 つの記号として表に混ぜてしまえば、あとは大きいほうから取れるだけ取るだけになります。

同じ記号は 3 回続くことがある

表から 1 つ選んで 1 回引く、という書き方だと 3000 が M 1 つで止まります。MMM にするには、その記号が引けなくなるまで引き続ける必要があります。逆に 4 回以上続くことは、表を作り替えた後なら起こりません。

つまり外側は表を上から順に見るだけ、内側は同じ記号を使い切るまで、という二段構えになります。

表の並び順も効いてきます。大きいほうから見ていないと、1000 に対して 500 の記号を 2 つ当ててしまいます。作った表を上から読み直して、値が単調に減っているかを一度確かめてください。

なお、外側は表の行数ぶんしか回らず、内側も同じ記号が 4 回以上続かないので、入力の大きさによらず反復回数は一定です。num が 1 でも 3999 でも、かかる時間はほとんど変わりません。計算量を O(1) と書ける、めずらしい部類の問題です。

前のレッスンと合わせて、同じ対応関係を両方向に実装したことになります。片方は隣を見比べる走査、もう片方は表を上から削る貪欲。同じ題材でも、変換の向きが変わるだけで使う道具がまるごと入れ替わるのは、覚えておく価値があります。

やってみよう

intToRoman(num) を実装してください。num は 1 から 3999 までの整数です。貪欲法を使い、対応するローマ数字の文字列を返してください。

要件

  1. 関数 intToRoman(num) を実装し、ローマ数字文字列 を返す
  2. 減算表記 を含む 13 個の値表を使い、貪欲法 で削っていく
  3. 値表は 大きい順 に並べ、while num >= value で同じ記号を必要回数追加する

入出力例

intToRoman(1) → "I" intToRoman(3) → "III" intToRoman(4) → "IV" intToRoman(9) → "IX" intToRoman(58) → "LVIII" intToRoman(1994) → "MCMXCIV" intToRoman(3999) → "MMMCMXCIX"

ヒント

値表は `(1000, 'M')` から `(1, 'I')` まで 13 個。`減算表記` を含めるのがポイント

外側 `for` で値表を回り、内側 `while` で同じ記号を続けて追加する

`3000 = MMM` のように、同じ記号を最大 3 回まで使うケースがあるので `while` を `if` にしない

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 雨水を溜める

    棒グラフ状の `高さ配列` で `溜まる雨水量` を求める。`左右の最大値配列` を使う `O(n)` 解と `O(1)` の双方向ポインタ解を学ぶ。

  • 最終総まとめクイズ

    再帰 / 探索 / ソート / 双方向ポインタ / スタック / DP の `7 章ぶん` の理解度を 1 問の総合クイズで確認する。

  • コンピューターとOSの役割

    OS がハードウェアを抽象化しアプリと利用者の橋渡しをする役割を、資源管理と抽象化という二つの軸で初学者にも分かるように整理します。

  • プロセスとは

    実行中のプログラムをカーネルが管理する単位であるプロセスの構成要素と、fork で複製し exec で中身を入れ替える OS の基本動作モデルを解説します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 動的計画法部分問題の結果を保存して再利用する手法
  • 設計何をどう作るかを決める前工程
  • 判断YES/NO 分岐を表す菱形
  • 反復色やフォントを繰り返して秩序を生む
  • 計算量入力サイズに対する処理時間の伸び方
  • 関数処理に名前を付けて再利用できる単位
main.py
学習モード
エディタを読み込んでいます

メモ

整数をローマ数字に

⌘S で保存