CodingTest

[PCCE 모의고사] 10번 문제풀이

흑조롱이 2024. 2. 19. 14:32

https://school.programmers.co.kr/learn/courses/19275/lessons/240615

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

변수 snippet에 쓰여있는 문자열 쌍을 참고하여, 주어지는 문자열 message를 변경하는 코드를 완성해야 하는 문제이다.

 

요구사항

snippet = [["IMO", "In my opinion"]]
message = "IMO, IMO"

 

예를 들어 snippet 과 message 가 위와 같다면, "IMO"는 "In my opinion"으로 치환하여 "IMO, In my opinion"를 결과로 반환해야 한다.

 

치환할 단어는 공백을 기준으로 구분하므로, 위의 message 에서 "IMO,"는 "In my opinion"으로 치환할 수 없다.

 

 

알고리즘

 

1) 치환 대상 정리

dct = dict()  # dictionary

for i in snippet:
    k = i[0]  # key 값
    v = i[1]  # value 값
    dct[k] = v  # 키: 값 쌍으로 dictionary에 저장

 

snippet에 들어있는 각 원소는 [치환_전_단어, 치환_후_단어] 의 구조를 가지고 있다.

 

치환_전_단어를 key, 치환_후_단어 value로 갖는 dictionary를 생성하면 대치되는 단어쌍에 손쉽게 접근할 수 있다.

 

 

2) message 속 단어 구분

msg = message.split()  # list 형식, 공백 기준 구분

 

message 에서 단어들은 공백으로 구분한다.

 

split()을 이용하면 message 속 단어들을 공백 기준으로 구분하여 list에 저장할 수 있다.

 

 

3) 치환

for i in range(len(msg)):
    word = msg[i]  # i번째 단어
    if word in dct.keys():  # i번째 단어가 치환 대상인 경우
        msg[i] = dct[word]  # 해당 단어를 dct[word]로 치환

 

msg에 저장된 단어들 중, 치환 대상인 단어들을 찾아서 바꿔주면 된다.

 

임의의 단어가 치환 대상이라면, 그 단어는 dictionary의 key 값 중 하나이다.

 

 

즉, 지금 보고 있는 단어 msg[i]가 치환 대상이라면, 이 단어는 dct의 key 값 중 하나에 해당된다.

 

반대로 치환 대상이 아니라면, dct의 key 값에 없을 것이다.

 

 

msg 속 임의의 단어가 치환 대상에 해당되는 경우에만 그 단어를 치환하고, 그 외의 경우는 무시한다.

 

 

 

4) 마무리

ans = ' '.join(i for i in msg)
return ans

 

 

단어들을 치환한 상태인 msg의 자료형을 list에서 string으로 변환해야 한다.

 

' '.join을 사용하면 list에 들어있는 단어들을 공백으로 구분하면서 1개의 string으로 합칠 수 있다.

 

이 문제에서는 반환형을 string으로 요구했기에, 자료형을 string으로 변환한 다음 반환해야 한다.

 

 

 

문제 코드

def solution(snippet, message):
    # 1) 치환 대상 정리
    dct = dict()
    for i in snippet:
        k = i[0]
        v = i[1]
        dct[k] = v
        
    # 2)message 속 단어 구분
    msg = message.split()
    
    # 3) 치환
    for i in range(len(msg)):
        word = msg[i]
        if word in dct.keys():
            msg[i] = dct[word]
    
    # 4) 마무리
    ans = ' '.join(i for i in msg)
    return ans

 

 

 

위의 코드들을 다 합치면, 문제를 풀 수 있다.

 

 

시간복잡도

사용한 풀이의 시간복잡도는 O(n) 이다.

 

for문에서 snippet 과 message의 길이에 선형적으로 비례하여, 처리시간이 증가할 수 있다. 

 

하지만 dict.keys()의 시간복잡도는 Python3 기준으로 O(1)이다.

 

O(n * 1) = O(n)

 

이를 기반으로 시간복잡도를 계산하면, O(n)이 그 결과로 나온다.