[25.07.02 TIL] ๊ฐœ์ธ ๊ณผ์ œ

๊น€์˜๋ฏผยท2025๋…„ 7์›” 2์ผ

๐ŸŽฏ ์˜ค๋Š˜์€ ์•„์นจ์— ์ฝ”๋”ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ปค๋ฆฌ์–ด ์„ธ์…˜ ๊ฐ•์˜์— ์ด์–ด ํƒ€์ž„์–ดํƒ ์ด๋ ฅ์„œ ์ž‘์„ฑ ์‹œ๊ฐ„์ด ์žˆ์—ˆ๋‹ค.
๊ทธ ํ›„์—” ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ฐœ์ธ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.


โฐ ์•„์นจ์— ์ฝ”๋”ฉ

โœ… ๋ฌธ์ž์—ด์˜ ๋งˆ์ง€๋ง‰ ๋‹จ์–ด ๊ธธ์ด ๊ตฌํ•˜๊ธฐ

// solved 1
class Solution {
  int lengthOfLastWord(String s) {
	  // trim() -> ์•ž ๋’ค์˜ ๊ณต๋ฐฑ ์ œ๊ฑฐ(์ œ๊ฑฐ๋œ ์ƒˆ ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜)
	  // split(String seperator) -> ๋ฌธ์ž์—ด์—์„œ seperator๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜๋จ
    var splitString = s.trim().split(' ');
    // hello world -> ["hello", "world"]
    // List.first (List[0]) or List.last( => List[List.length - 1])
    return splitString.last.length;
  }
}

๐Ÿ‘‰ ๋‹ค๋ฅธ ์ฝ”๋“œ 1

// solved 2
class Solution {
  int lengthOfLastWord(String s) {
    String res = "";
//    
    for (var i = s.length-1; i >=0; i--) {
      if(s[i]== " " && res.isNotEmpty) return res.length;       
      if(s[i] == " ") {
        continue;
      }
      res+= s[i];
    }
    return res.length;
  }
}
// s = " hello world "
// i = 6 / s[i] = " "
// res = "dlrow"
// res.length = 5

๐Ÿ‘‰ ๋‹ค๋ฅธ ์ฝ”๋“œ 2

// solved 3
class Solution {
  int lengthOfLastWord3(String s) {
    int length = 0;
    int i = s.length - 1;
//
    while (i >= 0 && s[i] == ' ') {
      i--;
    } 
    while (i >= 0 && s[i] != ' ') {
      length++;
      i--;
    }
    return length;
  }
}

--

๐Ÿ’ฌ ์ปค๋ฆฌ์–ด ์„ธ์…˜ ๊ฐ•์˜

๐Ÿ’ญ ์˜คํ›„์— ์ด๋ ฅ์„œ ์ž‘์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ, ๊ฐ•์˜๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์ด๋ ฅ์„œ๋ฅผ ์จ๋ณด๋Š” ์‹œ๊ฐ„์„ ์ž ๊น ๊ฐ€์กŒ๋Š”๋ฐ, ์•„์ง ํ”„๋กœ์ ํŠธ์—๋Š” ๋„ฃ์„ ๋‚ด์šฉ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋น„์›Œ๋‘์—ˆ๋‹ค.

์บ ํ”„๊ฐ€ ๋๋‚˜๊ณ  ๋‚˜๋ฉด ํ”„๋กœ์ ํŠธ์— ์“ธ ๋‚ด์šฉ์ด ๋งŽ์ด ์ƒ๊ธฐ๋ฉด ์ข‹๊ฒ ๋‹ค.


๐Ÿฅฝ ๊ฐœ์ธ ๊ณผ์ œ

๐Ÿ‘ฉโ€๐Ÿ’ป ์ž‘์—…

๐Ÿ“ data.dart

import 'dart:convert';
import 'dart:io';
import 'package:rpg_game/character.dart';
import 'package:rpg_game/monster.dart';
// ๋ฐ์ดํ„ฐ ๋กœ๋“œ
class Load {
  // ๋ชฌ์Šคํ„ฐ ํŒŒ์ผ ๋กœ๋“œ
  List<Monster> loadMonster() {
    final file = File("../assets/monster.csv");
    List<String> monsterLine = file.readAsLinesSync(encoding: utf8);
    // ํŒŒ์ผ ์—ฌ๋ถ€ ํ™•์ธ
    if (!file.existsSync()) {
      print("ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
      exit(1);
    } else {
      List<Monster> monster = [];
      // ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
      for (var line in monsterLine) {
        var parts = line.split(",");
        monster.add(Monster(
          name: parts[0],
          hp: int.parse(parts[1]),
          attack: int.parse(parts[2]),
          defense: 0,
        ));
      }
      // ๊ฐ’ ์ „๋‹ฌ
      return monster;
    }
  }
  // ์บ๋ฆญํ„ฐ ๋ฐ์ดํ„ฐ ๋กœ๋“œ
  Character loadChar() {
    //
  }
}
// ๋ฐ์ดํ„ฐ ์ €์žฅ
class Save {
  void saveData(dynamic result) {
    //
  }
}

๐Ÿ’ฌ ๋จผ์ € ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ, ์•„์ง ๊ทธ ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ›๋Š” ๊ฒƒ๊นŒ์ง€ ์™„๋ฃŒ๋˜์ง€๋Š” ์•Š์•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  file.readAsLinesSync(encoding: utf8) ์ฝ”๋“œ๋กœ ํ•œ์ค„์”ฉ ์ฝ๊ณ , ํ•œ๊ธ€์ด ๊นจ์ง€์ง€ ์•Š๋„๋ก ์ธ์ฝ”๋”ฉ๊นŒ์ง€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

!file.existsSync() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•˜์˜€๋‹ค.

๐Ÿ’ฌ ์šฐ์„  ๋ชฌ์Šคํ„ฐ ๋ถ€๋ถ„๋งŒ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ, ๋ฌธ์ œ์—†์ด ๋กœ๋“œํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์บ๋ฆญํ„ฐ ๋ถ€๋ถ„๋„ ์ž‘์—…ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.


๐Ÿ“ ๊ทธ ์™ธ

๐Ÿ’ฌ character, monster, utils ํŒŒ์ผ์€ ํ•œ๋‘์ค„ ์ถ”๊ฐ€๋œ ๊ฒƒ์ด๋ผ ์ƒ๋žตํ•˜๊ฒ ๋‹ค.

๋‹จ์ˆœํžˆ ๋กœ๋“œ(์‹คํ–‰๋˜๋Š”์ง€ ์—ฌ๋ถ€ ํ™•์ธ ์ „), ์ฃผ์„ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.


๐Ÿ“ game.dart

  // ๊ฒŒ์ž„ ์‹œ์ž‘
  void startGame() {
    print("์บ๋ฆญํ„ฐ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š” : ");
    // ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋“ค์–ด์˜ค๋Š”์ง€ ๊ฒ€์ฆ
    String? charName = stdin.readLineSync()!;
    print("๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค!");
    character.name = charName;
    character.showStatus();
    while (true) {
      // ๋žœ๋ค ๋ชฌ์Šคํ„ฐ ์ถœํ˜„
      var randomMonster = getRandomMonster();
      monster.remove(randomMonster);
      // ์ „ํˆฌ ์ง„ํ–‰
      var result = battle(randomMonster);
      if (!result) {
        print("์‚ฌ๋ง");
        break;
      }
      // ์ „ํˆฌ ์„ฑ๊ณต
      print("๋‹ค์Œ ๋ชฌ์Šคํ„ฐ์™€ ๋Œ€๊ฒฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? y/n");
      // ์ „ํˆฌ ์ง€์† ์—ฌ๋ถ€
      String? next = stdin.readLineSync()!.trim();
      if (next == "N" || next == "n") {
        break;
      } else {
        //battle();
      }
    }
    String? saveInput = stdin.readLineSync()!.trim();
    if (saveInput == "Y" || saveInput == "y") {
      //save();
    }
    ;
  }

๐Ÿ’ฌ ๊ฒŒ์ž„ ๋กœ์ง์€ ์ž‘์„ฑํ•˜๋‹ค๊ฐ€ battle ์˜ ๋ฐ˜๋ณต์„ ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž‘์—…์„ ๋”ฐ๋กœ ๋บ๋‹ค.

์œ„์™€ ๋™์ผํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์šฐ์„  ์ž‘์—…์„ ์œ„ํ•ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ๊ตฌํ˜„ํ•ด๋‘๊ธด ํ–ˆ์ง€๋งŒ ์™„๋ฃŒ๋˜์ง„ ์•Š์•˜๋‹ค.


// ์ „ํˆฌ ์ง„ํ–‰ ๋กœ์ง
  bool battle(Monster monster) {
    while (true) {
      // ์บ๋ฆญํ„ฐ ํ„ด
      print("${character.name}์˜ ํ„ด");
      print("ํ–‰๋™์„ ์„ ํƒํ•˜์„ธ์š” (1: ๊ณต๊ฒฉ, 2: ๋ฐฉ์–ด) : ");
      // ํ–‰๋™ ๋ถ„๊ธฐ
      String? action = stdin.readLineSync()!.trim();
      // ์ž…๋ ฅ ๊ฒ€์ฆ ๋ฐ ํ–‰๋™ ์ถœ๋ ฅ
      bool actionInput = false;
      while (!actionInput) {
        if (action == "1") {
          print(
              "${character.name}์ด(๊ฐ€) ${monster.name}์—๊ฒŒ ${character.attack}์˜ ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.");
        } else if (action == "2") {
          print("${character.name}์ด(๊ฐ€) ๋ฐฉ์–ดํƒœ์„ธ๋ฅผ ์ทจํ•˜์—ฌ 0 ๋งŒํผ ์ฒด๋ ฅ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.");
        } else {
          print("์ž˜๋ชป๋œ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!");
          actionInput = true;
        }
      }
      //while (monster.isNotEmpty) {}
      // ์ „ํˆฌ ์ข…๋ฃŒ ํ™•์ธ
      if (character.hp <= 0) {
        return false;
      } else if (monster.hp <= 0) {
        Monster monsterList = monster;
        // monsterList.removeAt(index);
      }
      // ์ƒํƒœ ์ถœ๋ ฅ
      character.showStatus();
      // return true;
      // ๋ชฌ์Šคํ„ฐ ํ„ด
      print("${monster.name}์˜ ํ„ด");
      print(
          "${monster.name}์ด(๊ฐ€) ${character.name}์—๊ฒŒ ${monster.attack}์˜ ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.");
    }
  }

๐Ÿ’ฌ ์—ฌ๊ธฐ์„œ ์ž…์ถœ๋ ฅ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€๊ณ , ๊ทธ ๊ฐ’์— ๋”ฐ๋ผ์„œ ํ–‰๋™์„ ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

๋‹จ, ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฝ๊ณ , ์ฒด๋ ฅ๊ฐ™์€ ๋Šฅ๋ ฅ์น˜ ๋ณ€ํ™”๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๋ถ€๋ถ„์€ ๋‚จ๊ฒจ๋‘์—ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋กœ๋“œ ๋ถ€๋ถ„์ด ์™„๋ฃŒ๋˜๊ณ  ๋‚˜๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค.

๐Ÿ’ฌ ์ „ํˆฌ ์‹œ ์ฒ˜์น˜ํ•œ ๋ชฌ์Šคํ„ฐ๋Š” ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฌ๋ผ์ง€๋„๋ก ๊ตฌํ˜„ํ•ด์•ผํ•˜๋ฉฐ, ์ด๋ถ€๋ถ„์€ ์•„์ง ๋กœ๋“œ๋ฌธ์ œ๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ํž˜๋“ค์–ด ์ฃผ์„์œผ๋กœ ๋‚จ๊ฒจ๋‘์—ˆ๋‹ค.


import 'dart:math';
.
.
// ๋žœ๋ค์œผ๋กœ ๋ชฌ์Šคํ„ฐ ์ƒ์„ฑ
  Monster getRandomMonster() {
    print("์ƒˆ๋กœ์šด ๋ชฌ์Šคํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค!");
    var random = Random();
//
    int index = random.nextInt(monster.length);
    Monster selecMonster = monster[index];
//
    selecMonster.showStatus();
    return selecMonster;
  }

๐Ÿ’ฌ random ์„ ํ†ตํ•ด ๋žœ๋ค์œผ๋กœ ๋ชฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ด๊ณ , ์ด๊ฑธ index ๋ฅผ ํ†ตํ•ด ์ฒ˜์น˜๋˜๋ฉด ๋‹ค์Œ ๋ชฌ์Šคํ„ฐ๊ฐ€ ๋‚˜์˜ค๋„๋ก ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ์œ„ํ•ด import 'dart:math'; ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅด ์‚ฌ์šฉํ•˜์˜€๋‹ค.


โ— ์˜ค๋ฅ˜

๐Ÿ’ญ ๋ฉ”์ธ์„ ํ…Œ์ŠคํŠธ๋กœ ์ž ๊น ์ž‘์„ฑํ•ด๋’€๋”๋‹ˆ run ์„ ํ–ˆ์„ ๋•Œ ๋ฌดํ•œ๋ฐ˜๋ณต ํ•˜๋Š” ๊ฒƒ ์™ธ์— ์•„์ง ํฐ ์˜ค๋ฅ˜๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค.

ํ•˜์ง€๋งŒ ์ฝ”๋“œ ์ž‘์„ฑ ์™„๋ฃŒ ์ „์ด๊ณ , ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋งŽ์ด ๋˜์–ด์žˆ์ง€ ์•Š๊ณ , ๋น„๋™๊ธฐ๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ฃผ์˜ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.


๐ŸŒผ Git Commit

โœ… ๊ธฐ๋Šฅ ๊ตฌํ˜„
โœ”๏ธ ์ž…์ถœ๋ ฅ ๊ธฐ๋Šฅ
โœ”๏ธ ๋ฐฐํ‹€ ๋กœ์ง ๊ตฌํ˜„
โœ”๏ธ ๋žœ๋ค ๋ชฌ์Šคํ„ฐ ์Šคํฐ ๊ตฌํ˜„ ์™„๋ฃŒ
โœ”๏ธ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๊ธฐ๋Šฅ


๐ŸŒฑ ์˜ค๋Š˜์€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์œ„์ฃผ๋กœ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค.
ํฌ๊ฒŒ ์ž…์ถœ๋ ฅ ๊ธฐ๋Šฅ๊ณผ ๋ฐฐํ‹€ ๋กœ์ง ๊ตฌํ˜„, ๋žœ๋ค ๋ชฌ์Šคํ„ฐ ์Šคํฐ ๊ตฌํ˜„์™„๋ฃŒ, ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๊ธฐ๋Šฅ ์ง„ํ–‰์ค‘์ด๋‹ค.

๋””ํ…Œ์ผํ•˜๊ฒŒ ์ˆ˜์ •ํ•œ๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•œ ๊ฒƒ๋“ค์€ ์„ธ์„ธํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์—†์–ด ํฐ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ •๋ฆฌํ•˜์—ฌ ์ปค๋ฐ‹ํ•˜์˜€๋‹ค.

์–ด์ œ ํ•™์Šตํ•œ ๊ฒƒ, ๊ทธ๋ฆฌ๊ณ  ๋Œ€์ถฉ ๊ตฌ์ƒํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์˜ค๋Š˜์€ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์—ฌ์„œ ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์™ธ์—๋Š” ํฌ๊ฒŒ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์€ ์—†์—ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋กœ๋“œ๋„ ํ•˜๊ธด ํ–ˆ๋Š”๋ฐ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘์–ด๋„ฃ๊ณ  ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„์„œ ๋‹ค์‹œ ๋ชฌ์Šคํ„ฐ์— ๋„ฃ๊ธฐ๊นŒ์ง€๊ฐ€ ์ข€ ๊ฑธ๋ฆด ๋ฟ์ด๋‹ค. ํ…Œ์ŠคํŠธ ์ „์ด๊ธด ํ•˜์ง€๋งŒ ์ด ๋ชฌ์Šคํ„ฐ์— ๋„ฃ๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ๋˜๋‚˜ ์‹ถ์–ด์„œ ์š”๋ถ€๋ถ„์ด ๋ฌธ์ œ๋‹ค.


๐Ÿš€ ๋‚ด์ผ์€ ์šฐ์„  ํ•„์ˆ˜ ๊ธฐ๋Šฅ ์™„๋ฃŒ๋ฅผ ๋ชฉํ‘œ๋กœ ์ž‘์—…ํ•ด์•ผ๊ฒ ๋‹ค.
๋™์ผํ•˜๊ฒŒ ๊ธˆ์š”์ผ ์˜ค์ „์—๋Š” ๋„์ „ ๊ธฐ๋Šฅ์„ ์กฐ๊ธˆ ์ถ”๊ฐ€ํ•ด๋ณธ๋‹ค๋˜๊ฐ€... ์•„๋‹ˆ๋ฉด ํ•„์ˆ˜ ๊ธฐ๋Šฅ์ด ๋๋‚˜๋ฉด ๋„์ „๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•ด๋ณผ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.

๊ทผ๋ฐ ์™œ ๋ถ„๋Ÿ‰์ด ํ•œ์ฐธ ๋‚จ์€๊ฑฐ ๊ฐ™์€์ง€ ์ง„ํ–‰๋„๋ฅผ ๊ฐ€๋Š ์„ ๋ชปํ•˜๊ฒ ๋‹ค.
ํ•œ ์ž‘์—…์ด ๋นจ๋ฆฌ ๋๋‚ ์ˆ˜๋„ ์žˆ๊ณ  ๋Šฆ๊ฒŒ ๋๋‚ ์ˆ˜๋„ ์žˆ์–ด์„œ ์ด๊ฒŒ ์‹œ๊ฐ„ ๋ถ„๋ฐฐ๊ฐ€ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค.

profile
๐Ÿ’ป [25.05.26~] Flutter ๊ณต๋ถ€์ค‘โณ

0๊ฐœ์˜ ๋Œ“๊ธ€