๐Ÿ’ก Algorithm

[์žฌ๊ท€] ์žฌ๊ท€ ํ•จ์ˆ˜์™€ stringify ๊ตฌํ˜„

ji_wonna 2022. 9. 21. 18:06

์žฌ๊ท€ ํ•จ์ˆ˜

์žฌ๊ท€ ํ•จ์ˆ˜๋ž€ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์žฌ๊ท€๋ž€ ๋™์ผํ•œ ๊ตฌ์กฐ์˜ ๋” ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์ „์ฒด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋ณดํ†ต ์ค‘์ฒฉ๋œ ๋ฐ˜๋ณต๋ฌธ์ด ๋งŽ์•„ ์ค‘์ฒฉ ํšŸ์ˆ˜๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜, ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ์ƒํ™ฉ์—์„œ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

์žฌ๊ท€ ํ•จ์ˆ˜ ์žฅ์ 

  • ๋ฐ˜๋ณต๋ฌธ์˜ ์‚ฌ์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์„œ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

์žฌ๊ท€ ํ•จ์ˆ˜ ๋‹จ์ 

  • ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ชจ๋‘ stack์— ์ €์žฅํ•˜์—ฌ ๋ฐ˜๋ณต๋ฌธ์— ๋น„ํ•ด ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ ์ดํ›„ ๋ณต๊ท€๋ฅผ ์œ„ํ•œ context switching ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

์žฌ๊ท€ ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด?

  • ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐค ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์žฌ๊ท€ ํ•จ์ˆ˜ ํƒˆ์ถœ ์กฐ๊ฑด์ด ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

 

์žฌ๊ท€์  ์‚ฌ๊ณ 

  1. ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ ๊ฐ’ ์ •์˜ํ•˜๊ธฐ
  2. ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ฌธ์ œ๋ฅผ ์ชผ๊ฐœ๊ธฐ
  3. ๊ฐ€์žฅ ์ž‘์€ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜์—ฌ ํƒˆ์ถœ ์กฐ๊ฑด ๊ตฌ์„ฑํ•˜๊ธฐ (Base Case)
  4. ๋‚จ์•„์žˆ๋Š” ๋ณต์žกํ•œ ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ (Recursive Case)

 


 

 

JSON

JSON์€ JavaScript Object Notation์˜ ์ค„์ž„๋ง๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ์˜ ๊ตํ™˜์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด ํ˜•ํƒœ์˜ ํฌ๋งท์ด๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ JSON ํฌ๋งท์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ์ง๋ ฌํ™”(serialize), ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ JSON์˜ ๊ฐ์ฒด๋กœ ์ฝ์–ด์˜ค๋Š” ๊ณผ์ •์„ ์—ญ์ง๋ ฌํ™”(deserialize)๋ผ๊ณ  ํ•œ๋‹ค.

 

๋‹ค์Œ์€ jackson์—์„œ ์ œ๊ณตํ•˜๋Š” ObjectMapper ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ธ ์ฝ”๋“œ์ด๋‹ค.

// writeValueAsString์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ณผ์ •
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(message);

System.out.println(json);

/* Output
{"createdAt":"2022-09-21,10:10:10","receiver":"๋ฐ›๋Š”์ด","sender":"๋ณด๋‚ธ์ด","message":"๋ญํ•ด?"}
*/
// readValue๋กœ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๊ณผ์ •
ObjectMapper mapper = new ObjectMapper();
String json = "{\\"createdAt\\":\\"2022-09-21,10:10:10\\",\\"receiver\\":\\"๋ฐ›๋Š”์ด\\",\\"sender\\":\\"๋ณด๋‚ธ์ด\\",\\"message\\":\\"๋ญํ•ด?\\"}";

Map<String, String> deserializedData = mapper.readValue(json, Map.class);
System.out.println(deserializedData);

/* Output
{createdAt=2022-09-21,10:10:10, receiver=๋ฐ›๋Š”์ด, sender=๋ณด๋‚ธ์ด, message=๋ญํ•ด?}
*/

 

stringify() ๊ตฌํ˜„

JSON์€ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์žฌ๊ท€๋ฅผ ์ด์šฉํ•˜์—ฌ JSON ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” stringify ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ดค๋‹ค. (์œ„์˜ ์˜ˆ์‹œ์—์„œ writeValueAsString())

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.*;

public class stringifyJSON {
  public String ObjectMapper(Object data) throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(data);
  }

  public String stringify(Object data) {
    if (data instanceof String) {
      return String.format("\"%s\"", data);
    }
    else if (data instanceof Integer){
      return data.toString();
    }
    else if (data instanceof Boolean){
      return data.toString();
    }
    else if (data instanceof Object[]){
      Object[] arr = (Object[]) data;//๋‹ค์šด ์บ์ŠคํŒ…

      if (arr.length==0) return "[]";

      String stringifyData = "";//๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ json ๋ฐ์ดํ„ฐ

      for (int i=0;i<arr.length;i++) {
        stringifyData += stringify(arr[i]) + ",";
      }
      return String.format("[%s]",stringifyData.substring(0, stringifyData.length()-1));
    }
    else if (data instanceof HashMap<?,?>){
      HashMap<String, Object> map = (HashMap<String, Object>) data;
      String stringifyData = "";//"string"
      if (map.isEmpty()) return "{}";
      for (Map.Entry<String, Object> entry : map.entrySet()) {
        stringifyData+=stringify(entry.getKey())+":"+stringify(entry.getValue())+",";
      }
      return String.format("{%s}", stringifyData.substring(0, stringifyData.length()-1));
    }
    return "null";
  }
}