코딩테스트/Programmers

[Programmers] 입문) 문자열 밀기 (IndexOf)

HONGGG 2023. 7. 19. 04:20

문자열 밀기

문제 설명

문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • 0 < A의 길이 = B의 길이 < 100
  • A, B는 알파벳 소문자로 이루어져 있습니다.

 

입출력 예

A B result
"hello"  "ohell"  1
"apple" "elppa" -1
"atat" "tata" 1
"abc" "abc" 0

 
입출력 예 설명

입출력 예 #1 

"hello"를 오른쪽으로 한 칸 밀면 "ohell"가 됩니다.

입출력 예 #2

"apple"은 몇 번을 밀어도 "elppa"가 될 수 없습니다.

입출력 예 #3

"atat"는 오른쪽으로 한 칸, 세 칸을 밀면 "tata"가 되므로 최소 횟수인 1을 반환합니다.

입출력 예 #4

"abc"는 밀지 않아도 "abc"이므로 0을 반환합니다.

 

※ 공지 - 2023년 4월 24일 테스트케이스가 추가되었습니다. 기존에 제출한 코드가 통과하지 못할 수도 있습니다.


이번 문제는 처음 해결방안을 생각하였을때 너무 복잡하게 생각하여 정답이 나오지 않을 것 같았다.

그래서 질문하기를 확인하여 아주 기가막힌 방법이라고 생각이 드는 코드를 발견했다.

 

using System;

public class Solution {
    public int solution(string A, string B) {
        if (A.Length != B.Length) return -1;
        B += B;
        return B.IndexOf(A);
    }
}

 

이 코드는 찾아야하는 문자열을 이어붙여 IndexOf로 목표 문자열과 동일한 시작점을 찾는 것이다.

의문점은 IndexOf로 문자열을 찾지 못하면 자동으로 -1을 반환하는 경우이다.

 

이에 "낙방여우"님이 대답해주셨다.

원래 Integer의 한계가 대충 21억인데 그 값을 넘어가는 숫자는 음수로 반환되네요. 21억 다음부터 대충 42억까지의 숫자는 음수라는 거죠. 그렇게 범위가 계속되다가 진짜 한계인 18446744073709551615가 -1이 되고 이 숫자 다음에는 에러가 납니다.