[백준] 1701 - Cubeditor (G2)

2022. 1. 31. 14:43·알고리즘 (PS)/BOJ
반응형

https://www.acmicpc.net/problem/1701

 

1701번: Cubeditor

Cubelover는 프로그래밍 언어 Whitespace의 코딩을 도와주는 언어인 Cubelang을 만들었다. Cubelang을 이용해 코딩을 하다보니, 점점 이 언어에 맞는 새로운 에디터가 필요하게 되었다. 오랜 시간 고생한

www.acmicpc.net

같은 부분 문자열이 2개 이상 나타나는 가장 긴 부분 문자열의 길이를 찾는 문제이다.

나는 골드 3의 티어로 난이도를 낮게 매겼다.

 

나는 신촌 연합 알고리즘 캠프에서 배운 라빈 카프 알고리즘에 이분탐색을 더하여 풀었다.

이분탐색을 사용한 이유는 다음과 같다.

 

부분문자열의 길이가 n일 때 문제 조건을 만족한다면

이 해당 부분문자열의 부분문자열도 문제의 조건을 만족하므로

길이가 n 미만인 모든 부분문자열의 길이에 대해 조건을 만족한다.

 

거꾸로 부분문자열이 길이가 n일 때 문제 조건을 만족하지 않는다면,

이 길이가 n인 부분문자열에 어떤 문자를 첨가하든 문제 조건을 만족시킬 수 없으므로

길이가 n 이상인 모든 부분문자열에 대해 조건을 만족시킬 수 없다.

따라서 이분탐색으로 문제를 풀 수 있다.

 

하지만 이분탐색을 쓰지 않더라도 문제는 풀 수 있다.

문자열의 길이가 너무 짧기 때문이다.

 

이분탐색을 사용한 경우 164ms, 그냥 순회하면서 찾은 경우 2920ms

시간 차이는 좀 많이 나긴 한다.

 

이분탐색을 할 때, 조건을 만족하는지 확인하는 것은 라빈카프 알고리즘에 해시맵을 이용했다.

 

def isPossible(length):
    global s
    x = 1
    MOD = 2**64
    v = 0
    d = dict()

    # 초기값
    for i in range(length-1, -1, -1):
        v += (x*(ord(s[i]) - ord('a') + 1))
        v %= MOD

        if i > 0:
            x *= 27
            x %= MOD

    d[v] = 0

    for i in range(len(s) - length):
        firstCharValue = x * (ord(s[i]) - ord('a') + 1)
        firstCharValue %= MOD

        v -= firstCharValue
        v *= 27
        v += (ord(s[i+length]) - ord('a') + 1)
        v %= MOD

        try:
            t = d[v]
            return True
        except:
            d[v] = 0

    return False


s = input()
l, r = 1, len(s)
while l < r:
    mid = (l + r) // 2

    if not isPossible(mid):
        r = mid
    else:
        l = mid + 1

if len(s) == 1:
    print(0)
else:
    print(r - 1)
반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 (PS) > BOJ' 카테고리의 다른 글

[백준] 9527 - 1의 개수 세기(Counting ones) (G2)  (0) 2022.02.13
[백준] 17143 - 낚시왕 (G2)  (0) 2022.02.11
[백준] 23059- 리그 오브 레게노 (G2)  (0) 2022.01.07
[백준] 15683 - 감시 (G5)  (0) 2022.01.05
[백준] 1038 - 감소하는 수(G5) : DP, BFS 풀이  (0) 2022.01.03
'알고리즘 (PS)/BOJ' 카테고리의 다른 글
  • [백준] 9527 - 1의 개수 세기(Counting ones) (G2)
  • [백준] 17143 - 낚시왕 (G2)
  • [백준] 23059- 리그 오브 레게노 (G2)
  • [백준] 15683 - 감시 (G5)
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
  • 에버듀
    Blog. 에버듀
    에버듀
  • 전체
    오늘
    어제
    • 분류 전체보기 (615)
      • 개인 프로젝트 (43)
        • 토이 프로젝트 (3)
        • [2020] 카카오톡 봇 (9)
        • [2021] 코드악보 공유APP (22)
        • [2022] 유튜브 뮤직 클론코딩 (9)
        • [2025] 한글 SQL 데이터베이스 (0)
      • 팀 프로젝트 (22)
        • [2020] 인공지능 숫자야구 (4)
        • [2022] OSAM 온라인 해커톤 (10)
        • [2024] GDSC 프로젝트 트랙 (6)
        • [2025] 큰소리 웹 페이지 (2)
      • CS (335)
        • 자료구조 (19)
        • 어셈블리 (41)
        • 멀티미디어응용수학 (7)
        • 컴퓨터 구조 (29)
        • 알고리즘 분석 (4)
        • 컴퓨터 네트워크 (38)
        • 프로그래밍언어론 (15)
        • HCI 윈도우즈프로그래밍 (26)
        • 기초데이터베이스 (29)
        • 운영체제 (23)
        • 오토마타 (24)
        • 문제해결기법 (11)
        • 블록체인 (22)
        • 소프트웨어공학 (21)
        • 기계학습심화 (12)
        • 컴퓨터그래픽스와 메타버스 (8)
        • 분산시스템특론 (6)
      • 자기계발 (45)
        • 생각 정리 (23)
        • 대외활동 (11)
        • 동아리 (7)
        • 자격증 (3)
        • 머니 스터디 (1)
      • 알고리즘 (PS) (107)
        • BOJ (101)
        • Programmers (5)
        • 알고리즘 이모저모 (1)
      • WEB(BE) (8)
        • express.js (1)
        • Spring & Spring Boot (7)
      • WEB(FE) (2)
        • html, css, js (1)
        • React.js (1)
      • Tool & Language (6)
        • Edit Plus (1)
        • Git (1)
        • Python3 (2)
        • Java (2)
      • Infra (12)
        • AWS (1)
        • Oracle Cloud (8)
        • Firebase (2)
        • Network (1)
      • Android (18)
        • Java (6)
        • Flutter (12)
      • Window (2)
        • Visual Studio 없이 WPF (1)
        • MFC (1)
      • 독서 (14)
        • Inside Javascript (7)
        • Database Internals (6)
        • 한 글 후기 (1)
  • 링크

    • github
    • website
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에버듀
[백준] 1701 - Cubeditor (G2)
상단으로

티스토리툴바