#2941

zzwwoonn·2022년 5월 2일
0

Algorithm

목록 보기
9/71

2시간 삽질 후에 결국 구글링했다
정답 코드는 단 5줄
맥북에 대고 샷건을 안치고 참았다는게 대견하다
진짜 현타가 너무 말도 안된다
나 진짜 왜 이렇게 멍청할까

풀이 1

코드

inputStr = input()
# ljes=njak

domainList = [ "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="]

cnt = 0
i = 0

# for i in range(0, len(inputStr)):
while(1):
    print("i = ", i)
    if inputStr[i] == "c":
        # 시작이 c 이면
        # if i != len(inputStr):
            # 제일 마지막 문자가 아닐 때
        i += 1
        if inputStr[i] == "=":
            cnt += 1
            print("c=", cnt)
            
            # i += 1
        elif inputStr[i] == "-":
            cnt += 1
            print("c-")
            
            # i += 1
        else:
            cnt += 1
            print("아무것도 아님")
            
    elif inputStr[i] == "d":
        # if i != len(inputStr):
            # 제일 마지막 문자가 아닐 때
        i += 1
        if inputStr[i] == "z":
            i += 1
            if inputStr[i] == "=":
                cnt += 1
                print("dz=", cnt)
                
            # i += 1
        elif inputStr[i] == "-":
            cnt += 1
            print("d-", cnt)
            # i += 1
        else:
            cnt += 1
            print("아무것도 아님" , cnt)

    elif inputStr[i] == "s":
        # if i != len(inputStr):
            # 제일 마지막 문자가 아닐 때
        i += 1
        if inputStr[i] == "=":
            cnt += 1
            print("s=", cnt)
        else:
            cnt += 1
            print("아무것도 아님" , cnt)
    elif inputStr[i] == "z":
        # if i != len(inputStr):
            # 제일 마지막 문자가 아닐 때
        i += 1
        if inputStr[i] == "=":
            cnt += 1
            print("z=", cnt)
        else:
            cnt += 1
            print("아무것도 아님" , cnt)   
    elif inputStr[i] == "l":
        # if i != len(inputStr):
            # 제일 마지막 문자가 아닐 때
        print("i = ", i)
        i += 1
        print("i = ", i)
        if inputStr[i] == "j":
            cnt += 1
            print("lj", cnt)
        else:
            cnt += 1
            print("아무것도 아님" , cnt) 
    elif inputStr[i] == "n":
        # if i != len(inputStr):
            # 제일 마지막 문자가 아닐 때
        i += 1
        if inputStr[i] == "j":
            cnt += 1
            print("nj", cnt)
        else:
            cnt += 1
            print("아무것도 아님" , cnt) 
    else:
        # i = i + 2
        cnt += 1
        print("아무것도 아님" , cnt) 

한계

너무 당연하지만 for 문을 돌아가는 인자 i를 for 문 안에서 컨트롤 할 수 없다. 그래서 전역 변수로 하나 잡아두고 문자열을 처음부터 순회해봤지만, index를 초과해서 읽어버리는 경우 등의 예외가 너무 다양하고 많다. 다 잡을 수 있을거라고 생각했지만 도저히 이건 아닐거라고 판단.

domainList = [ "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="]
line 3에.. 여기 보세요.. 이걸 쓸 수 있다는 생각을 왜 도대체 왜 못했을까

풀이 2

코드

inputStr = input()
# ljes=njak

cnt = 0

# text = "ababHello Worldabca" 
# print("text = ", text)
# text = text.strip("a""b""c")
# print("text = ", text)

while(1):
    if "c=" in inputStr:
        findIndex = inputStr.find("c=")
        print("before : ", inputStr)
        inputStr = inputStr[:findIndex]+"a"+inputStr[findIndex+2:]
        inputStr = inputStr.strip("c=")
        print("after : ", inputStr)
        cnt += 1

    elif "c-" in inputStr:
        findIndex = inputStr.find("c-")
        print(inputStr)
        inputStr = inputStr[:findIndex]+"a"+inputStr[findIndex+2:]
        inputStr = inputStr.strip("c-")
        print(inputStr)
        cnt += 1

    elif "dz=" in inputStr:
        # print("ㅇㅇ")
        # findIndex = inputStr.find("dz=")
        # print("findIndex ", findIndex)
        print("befor : ", inputStr)

        # inputStr1 = inputStr[:findIndex]
        # inputStr2 = inputStr[findIndex+3:]

        # print("inputStr1 : ", inputStr1)
        # print("inputStr2 : ", inputStr2)

        # inputStr = inputStr1+"a"+inputStr2
        inputStr = inputStr.replace("dz=", "a")
        # replace 함수가 한번만 수행하는게 아니고 dz=를 찾아서 전부 다 바꾼다

        # print(inputStr)
        # inputStr = inputStr.strip("dz=")
        print("after : ", inputStr)
        cnt += 1

    elif "d-" in inputStr:
        findIndex = inputStr.find("d-")
        print(inputStr)
        inputStr = inputStr[:findIndex]+"a"+inputStr[findIndex+2:]
        inputStr = inputStr.strip("d-")
        print(inputStr)
        cnt += 1

    elif "lj" in inputStr:
        findIndex = inputStr.find("lj")
        print(inputStr)
        inputStr = inputStr[:findIndex]+"a"+inputStr[findIndex+2:]
        inputStr = inputStr.strip("lj")
        print(inputStr)
        cnt += 1

    elif "nj" in inputStr:
        findIndex = inputStr.find("nj")
        print(inputStr)
        inputStr = inputStr[:findIndex]+"a"+inputStr[findIndex+2:]
        inputStr = inputStr.strip("nj")
        print(inputStr)
        cnt += 1

    elif "s=" in inputStr:
        findIndex = inputStr.find("s=")
        print(inputStr)
        inputStr = inputStr[:findIndex]+"a"+inputStr[findIndex+2:]
        inputStr = inputStr.strip("s=")
        print(inputStr)
        cnt += 1

    elif "z=" in inputStr:
        print("z= 가 없다고? 여기 안들어와?")
        findIndex = inputStr.find("z=")
        print("before : ", inputStr)
        # inputStr = inputStr[:findIndex]+"a"+inputStr[findIndex+2:]
        inputStr = inputStr.replace("z=","a")
        print("after : ",inputStr)
        cnt += 1

    else:
        print(cnt)
        print(inputStr)
        inputStr = inputStr.replace("a","")
        print(inputStr)
        cnt += len(inputStr)
        print(cnt)
        break
    
print(cnt)

한계

  1. inputStr = inputStr[:findIndex]+"a"+inputStr[findIndex+2:]
  2. inputStr = inputStr.strip("s=")
  3. inputStr = inputStr.replace("z=","a")

1 => find 함수로 해당 문자열의 위치를 찾아서 그 위치 이전과 이후를 붙여서 새로운 문자열을 만들어 주는 방법, 이 때 남아있는게 없어지면서 다른 조건의 문자열에 해당되버리는 경우가 있다. => "ddz=z=" 의 경우

  1. "ddz=z=" (dz= -> "")
  2. "dz="("dz=" -> "")
  3. ""

그래서 중간에 그냥 붙이지 말고 "a"를 추가해주고 제일 마지막에(더 이상 해당 조건에 있는 문자열이 포함되어있지 않을 때, 해당 조건의 문자열은 모두 "a"로 바꼈을 때) 만들어진 문자열에서 a를 빼주면 된다.

하지만

strip 메서드 => 인자를 하나의 독립적인 개체로 보기 때문에
예를 들어 123를 인자로 주는 경우 1,2,3 따로 따로 인자로 봐서 321 을 입력하였을때도 동일한 결과과 나온다.

위의 "ddz=z="의 경우 "dz="를 a로 치환하여 바꾸는 거까지 좋았다. 그럼 "daz="가 되는데 여기서 strip("dz=")를 해주니 a 만 남아버린다....

풀이 3

코드

inputStr = input()
cnt = 0

while(1):
    if "c=" in inputStr:
        inputStr = inputStr.replace("c=", "@")
        cnt += 1

    elif "c-" in inputStr:
        inputStr = inputStr.replace("c-", "@")
        cnt += 1

    elif "dz=" in inputStr:
        inputStr = inputStr.replace("dz=", "@")
        cnt += 1

    elif "d-" in inputStr:
        inputStr = inputStr.replace("d-", "@")
        cnt += 1

    elif "lj" in inputStr:
        inputStr = inputStr.replace("lj", "@")
        cnt += 1

    elif "nj" in inputStr:
        inputStr = inputStr.replace("nj", "@")
        cnt += 1

    elif "s=" in inputStr:
        inputStr = inputStr.replace("s=", "@")
        cnt += 1

    elif "z=" in inputStr:
        inputStr = inputStr.replace("z=", "@")
        cnt += 1

    else:
        inputStr = inputStr.replace("@","")
        # print(inputStr)
        cnt += len(inputStr)
        # print(cnt)
        break
    
print(cnt)

한계

replace : 같은 문자열을 싹 다 찾아서 바꿔 버리니까
예외 => "c=c=" 이게 1이 나옴 (2가 나와야 하는데)

주의할 점 : inputStr.replace("123", "") 이렇게 했으면 이걸 다시 inputStr 에다가 할당해줘야 함!!!!

inputStr = inputStr.replace("123", "")

replace 메서드는 새로운 문자열을 만드는 함수이기 때문 (이거 때메 print 졸라 찍으면서 도대체 왜 안되냐고 화냄.. 쪽팔려 죽음)

정답 코드

answerList = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z='] 

inputStr = input() 

for t in answerList: 
    inputStr = inputStr.replace(t, '*') 
    
print(len(inputStr))

취준, 개발자, 코딩, 알고리즘 개나발 불지 말고 차라리 죽는게 빠를지도 모르겠다.

참고한 블로그

그냥 파이썬 문법 정리해놓은 블로그들이다. 내가 알고 있는 파이썬 문법들을 의심할 정도였으니 진짜 상태가 심각했다.

1
2
3

1개의 댓글

comment-user-thumbnail
2022년 5월 2일

딕셔너리로도 편하게 구현할 수있을것 같네요

답글 달기