펩시마이쪙
2018-02-28 20:45:59 작성 2018-02-28 20:46:17 수정됨
12
5392

java 에서 문자열 뒤집기 쉽다고 생각했는데....


문자열 뒤집기가 면접 문제라길래 이까짓께??? 생각하며 풀어본 얘기를 친구에게 해주니


친구 : "charAt() 썻지??"

나 : "ㅇㅇ"

친구 : "응 광탈 ㅋㅋㅋ"

나 : "왜???"

친구 : "원래 면접에서 API 쓰면 광탈임 ArrayList도 못쓰게 하는데 ㅋ"

나 : "??????"


저거 사실인가요??? 그래서 charAt사용 안하고(API안쓰고) 뒤집어 보려고 여러가지 시도를 해보고 있는데


도데체 charAt을 사용하고 어떻게 뒤집는 건지 감도 안잡힙니다 ㄷㄷㄷㄷ

 

0
  • 댓글 12

  • zepinos
    21k
    2018-02-28 20:55:51

    회사마다 다르겠죠. 개발자들도 다 생각이 다른데요.


    저의 경우 친구와 같은 생각을 비치면 오히려 탈락 쪽으로 이력서를 슬며시 밉니다. 문제해결능력을 중시하지 알고리즘에 해박한걸 원하진 않거든요.


    제가 생각하는 정답은 오히려 StringBuiler  등을 이용하는 방법입니다. 예전에 비슷한 내용의 글이 올라왔는데 Scala 등을 쓰면 더 간단히 처리가 가능하겠죠.


  • 아마데우스
    2k
    2018-02-28 20:57:34

    system.arraycopy로 하시질 .. ㅋㅋ

  • 펩시마이쪙
    2018-02-28 21:01:26

    우오우오와앙 ㅋㅋㅋㅋ

  • 앙앙이
    4k
    2018-02-28 22:16:06

     api 를 전혀 사용 안할 수 있나요.


    charAt 제한을 듣고 보니 stack 같은 자료 구조를 알고 활용하냐? 라는 관점에서 문제를 낸것이 아닐까 조심스럽게 추정해 봅니다.


    "조엘 온 소프트웨어" 책 p 219 "4. 프로그래밍 문제" 에서 1번 원래 저장위치에서 문자열 역순으로 변환하기가 생각나서 댓글 달아 봅니다.

  • aeba
    2018-02-28 22:37:10

    charAt도 못쓰는걸 자바라고 부를 수 있는지조차 잘 모르겠네요...

  • byeworld
    3k
    2018-02-28 22:43:50

    합격의 반전을 기원합니다. ^^;

  • yamanin
    2k
    2018-03-01 02:03:36

    문제의 요지를 모르겠다.

    차라리 몇가지 방법으로 할수 있냐를 묻는 것도 나쁘지 않은거 같은데.

    어떤 메쏘드는 써도 되고 어떤 메쏘드는 쓰면 안되고, 답정너 같잖아요.

  • yeori
    4k
    2018-03-01 04:22:48


    String reverse( String src) {
        char[] ch = src.toCharArray();
        for( int i=0 ; i < ch.length/2 ; i++ ) {
            char tmp = ch[ i];
            ch[i] = ch [ch.length-1-i];
            ch [ch.length-1-i] = tmp;
        }
        return new String(ch);
    }

    String은 값을 바꿀 수 없으니 배열을 복사해와서 뒤집은 다음에 새로운 문자열을 반환하는 수밖에 없겠네요.

  • mirheeoj
    14k
    2018-03-01 06:52:27

    면접시 제약조건이 있으면 미리 밝혀야죠. 가만히 있다가 API 썼다고 광탈? 


  • jjmean2
    288
    2018-03-01 08:30:34

    charAt을 못 쓰게 하면 애초에 문제를 String이 아니라 char[]로주어야 하는 거 아닌가요? 클래스라는 게 내부 구조를 드러내지 않고 메소드라는 API를 통해 사용하라는 자료형인데 저런 기본적인 메소드도 못 쓰게 하면 그 자료형을 쓰는 의미가 없지 싶은데요.. 

  • dog foot
    2018-03-03 10:52:02

    전혀요. 그리고 API를 안 쓰는 걸 알고리즘에 집중한다고 부르는 것도 좀 아니죠.

    상황에 따라 다른데,  좀더 어려운 알고리즘 (e.g. maximum subarray)을 물었을 경우, 어떤 API를 써도 될 뿐만 아니라 이름이 생각 안 나면 (예컨대 hash table의 이름이 std::unordered_map 인 게 생각 안 나면) MyHashTable 이라고 해놓고 써도 됩니다.

    문자열 뒤집기는 trivial한 알고리즘이라서 좀 애매하죠. 현업에서는 std::reverse를 쓰면 됩니다. 그런데 인터뷰에서 그 알고리즘을 굳이 물어보는 이유는 두 가지겠죠. 첫째, 간단한 알고리즘조차 잘 구현 못하는 지원자가 있어와서 걸러내고 싶어서. 둘째, 이 지원자가 자기가 자신있다고 말한 언어에 어울리는 해결 방식으로 이 간단한 문제를 해결하는지 보고 싶어서.

    그래서 이런 경우엔 일반적으로 의도를 물어봐야 합니다. 저라면, C++에 O(n)에 inplace로 뒤집어주는 API가 STL에 있는데 이거를 쓰면 되나, 아니면 직접 구현하기를 요구하는 거냐?

    후자라면, 당연히 뒤집어주는 API는 쓰면 안 되죠. 그러나 charAt() 같은 API는 전혀 관계가 없습니다. 테스트를 하는 핵심 부분만 API를 쓰지 않고 구현을 하면 되요. 다만 입력이 array로 주어졌는데 그걸 String으로 만든 다음 charAt을 쓴다면 감점입니다. in-place로 뒤집는 게 가능한데, String으로 만들면 extra O(n) space를 쓰게 되니까요.


  • dog foot
    2018-03-03 10:59:15

    그리고 미국 업계 기준, 그러니까 한국에 특수한 얘기가 아니라 일반적인 소프트웨어 업계 기준으로 API의 이름을 모르는 것도 거의 괜찮습니다. 알고리즘과 데이터 스트럭쳐에 능하게 되는 건 어렵지만, API를 배우는 건 쉬워요. 예컨대 저는 C 오래 했지만 아직도 string tokenizer API 이름을 구글 찾아봅니다.

    단지 이런 흔하게 사용될 것 같은 자료구조와 연산이 있는데, 어지간하면 이런 API가 있을 것 같고, 이 언어라면 이런 식으로 API 설계가 되어 있을 것 같은데 이름은 모르겠다, 구글 찾아보면 금방 해결할 수 있다, 이렇게 얘기하면 됩니다. C++의 경우, backward, forward iterator를 받아서 element를 서로 in-place로 바꿔주는 generic algorithm이 있을 거 같고, 이게 string도 될 거 같은데 요새 회사에서 자바만 시켜서 API 이름은 기억이 안 난다, 이러면 됩니다.





  • 로그인을 하시면 댓글을 등록할 수 있습니다.