jkjan   4년 전

게시판에 있는 반례란 반례는 다 넣어봤는데 다 통과하고요..

방식은..

N을 입력받습니다..

그리고 그 고장난 버튼들을 문자열로 저장하구요..

N에서 p(0, 1, 2, 3...) 만큼 차를 벌리면서..

  1. 만약 차가 N과 100의 차보다 크면

그 차를 출력하고 끝냅니다.. (해당 수에서 +나 -버튼으로 해결 가능)

2. 그게 아니라면

그 수를 문자열로 바꾼 뒤 거기서 고장난 버튼이 있는지를 찾습니다 

이걸 값 나올 때까지 반복합니다. (숫자 버튼으로 절대 못 간다면 위의 1번 조건에서 걸립니다 - 결국 +, -버튼으로만 가고 끝나지 무한 루프에 걸리는 경우 존재x)

그 후 수 문자열의 길이(버튼 수)와 p (그 수로 이동한 뒤의 + -버튼 개수)을 더한 값을 출력합니다


예를 들어 

5477

3

5 6 8 의 경우에


5 6 8의 입력을 "568"로 받아들인 후

5477은 100이 아니니까

"5477"로 바꿔주고

p 를 0으로 설정해주고 나서 (원래 1이었는데 5 / 2 / 4 6 같은 케이스 때문에 0으로 바꿈)

"5477"안에 '5'가 있는지, '6'이 있는지, '8'이 있는지 for로 검사해서

뭐가 나오기만 하면 바로 1을 리턴

p를 증가시키고

이를 "5476", "5478"에서/ "5475", "5479"에서 0이 리턴될 때까지 반복

이후 0이 리턴된 문자열의 길이와 p를 합친 것을 출력하는 겁니다. (이동 가능한 채널 버튼 수와 거기서부터 목표 채널까지의 차)

수가 0 밑으로 내려가는 경우엔 '0'이 되게 고정합니다.

예외로 99이나 98에다가 모든 버튼이 고장난 경우엔

차가 p+1보다 같거나 작으므로 (p의 초기값이 0이므로 케이스의 개수가 p+1부터 시작)

+, -로 이동할 수 있는 것으로 간주,

p+1을 출력하고 끝냅니다.

이게 로직이 틀린 건지 뭔지 모르겠네요.

일단 가지 수가

  1. 숫자버튼으로 절대 못 가는 케이스
  2. 100으로 가는 케이스
  3. 가려는 채널에 버튼 망가진 게 없는 케이스 (M이 0인 경우 포함)
  4. 숫자 누르고 +, -버튼 누르는 거보다 그냥 +, -버튼 몇 번 누르는 게 나은 케이스

정도가 되는데

혹시 제가 생각하지 못한 예나 게시판에서도 커버 못한 반례가 있거나

로직에 이상이 있는지 한 번만 봐주시길 바랍니다.

감사합니다.

harinboy   4년 전

162

9

0 1 3 4 5 6 7 8 9

정답: 62

오답: 63

경우는 맞게 나누신것 같은데, 버튼 누르는 횟수를 최소화하는데서 조금 방심하신 것 같습니다.

jkjan   4년 전

감사합니다 맞았습니다

댓글을 작성하려면 로그인해야 합니다.