๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Coding Test

[์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ] : ๋ฌธ์ž์—ด ๋’ค์ง‘๊ธฐ

by ๊ถŒ์Šพํ–„ 2023. 10. 22.

 

๋ฌธ์ œ

๋ฌธ์ž์—ด ๋’ค์ง‘๊ธฐ

 

๋ฌธ์ œ ์ ‘๊ทผ

 

1. ๋ฐฐ์—ด์„ ๋’ค์ง‘์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ reverse๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ๋ฌธ์ž์—ด์„ ๋’ค์ง‘์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ๋”ฐ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์—†์—ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด for๋ฌธ์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์— ๊ฐ๊ฐ์˜ ์š”์†Œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ด๋ณด์•˜๋Š”๋ฐ, ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค.

๊ทธ๋Ÿผ ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•  ๋ฌธ์ž์—ด์— +=์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด์„œ ๋ˆ„์ ์‹œ์ผœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜?? ์‹ถ์—ˆ๋‹ค.

 

์ œ์ถœ ์ฝ”๋“œ

function solution(my_string) {
    var answer = '';
    for (i = my_string.length - 1; i >= 0; i--) {
        answer += my_string[i];
    }
    return answer;
}

for ๋ฌธ์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์ด๋‹ค.

 

๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ์ฝ”๋“œ

๋ถ„๋ช… ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ž์—ด์„ ๋’ค์ง‘์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค ํ•˜๊ณ , ์—ฌ๋Ÿฌ ํฌ์ŠคํŒ…๋“ค์„ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.

function reverseString(str) {
    // 1. split() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ
    var splitString = str.split(""); // var splitString = "hello".split("");
    // ["h", "e", "l", "l", "o"]
 
    // 2. reverse() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ ๋ฐฐ์—ด์˜ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘๊ธฐ
    var reverseArray = splitString.reverse(); // var reverseArray = ["h", "e", "l", "l", "o"].reverse();
    // ["o", "l", "l", "e", "h"]
 
    // 3. join() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๊ฒฐํ•ฉํ•˜๊ธฐ
    var joinArray = reverseArray.join(""); // var joinArray = ["o", "l", "l", "e", "h"].join("");
    // "olleh"
    
    // 4. ๋ฐ˜์ „๋œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ
    return joinArray; // "olleh"
}
 
reverseString("hello");

1. split ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋‚˜ํƒ€๋‚ด๊ณ ,

2. reverse๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด๋กœ ๋‚˜ํƒ€๋‚ธ ๋ฌธ์ž์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ๋’ค์ง‘์–ด ์ฃผ์—ˆ๋‹ค.

3. join ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋’ค์ง‘์€ ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ๋ฌธ์ž์—ด๋กœ ๊ฒฐํ•ฉ์‹œ์ผœ ์ฃผ์—ˆ๋‹ค.

join์€ ๋”ฐ๋กœ ์‚ฌ์šฉํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ฒ˜์Œ์ด๋ผ ์‚ฌ์šฉ๋ฒ•๊ณผ ์šด์šฉ๋ฒ•์€ mdn๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ–ˆ๋‹ค.

 

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•

function reverseString(str) {
  if (str === "") // This is the terminal case that will end the recursion
    return "";
  
  else
    return reverseString(str.substring(1)) + str.charAt(0);
/* 
์žฌ๊ท€ ๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„
You need to remember that you won’t have just one call, you’ll have several nested calls

Each call: str === "?"        	                  reverseString(str.subst(1))     + str.charAt(0)
1st call – reverseString("Hello")   will return   reverseString("ello")           + "h"
2nd call – reverseString("ello")    will return   reverseString("llo")            + "e"
3rd call – reverseString("llo")     will return   reverseString("lo")             + "l"
4th call – reverseString("lo")      will return   reverseString("o")              + "l"
5th call – reverseString("o")       will return   reverseString("")               + "o"

์žฌ๊ท€ ๋ฉ”์„œ๋“œ์˜ ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„
The method hits the if condition and the most highly nested call returns immediately

5th call will return reverseString("") + "o" = "o"
4th call will return reverseString("o") + "l" = "o" + "l"
3rd call will return reverseString("lo") + "l" = "o" + "l" + "l"
2nd call will return reverserString("llo") + "e" = "o" + "l" + "l" + "e"
1st call will return reverserString("ello") + "h" = "o" + "l" + "l" + "e" + "h" 
*/
}
reverseString("hello");

์žฌ๊ท€๋ฅผ ํ†ตํ•œ ๋ฌธ์ž์—ด์„ ๋’ค์ง‘๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์œ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ์ธ substring๊ณผ charAt์— ๋Œ€ํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•ด๋ณด์•˜๋‹ค.

substring์€ ์ธ์ž๊ฐ’์œผ๋กœ ์‹œ์ž‘ํ•  index์˜ ์ˆซ์ž์™€ ๊ทธ ์ดํ›„๋กœ ์„ ํƒ์˜ต์…˜์ธ ๋ฐ˜ํ™˜ํ•  index์˜ ์ˆซ์ž๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

charAt์€ ์ธ์ž๋กœ index๋ฅผ ๋ฐ›์œผ๋ฉฐ ํ•ด๋‹น index์˜ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

 

#ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค #์ฝ”๋”ฉํ…Œ์ŠคํŠธ #๋ฌธ์ž์—ด_๋’ค์ง‘๊ธฐ