본문 바로가기
IT/CodingTest

[programmers] '가위 바위 보' 문제를 푸는 여러 가지 방법

by Echinacea 2025. 2. 25.
반응형

📝 문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/120839

 

📝 문제 설명

가위(2), 바위(0), 보(5)를 각각 이길 수 있는 손으로 변환하는 문제입니다.

 

 

🔹 변환 규칙

  • 2(가위) → 0(바위)
  • 0(바위) → 5(보)
  • 5(보) → 2(가위)

주어진 문자열을 위의 변환 규칙에 따라 변환해야 합니다.


 

 

✅ 해결 방법

 

1️⃣ 리스트 컴프리헨션 + join() 사용 (추천)

def solution(rsp):
    win_map = {'2': '0', '0': '5', '5': '2'}
    return "".join(win_map[ch] for ch in rsp)

 

가장 간결하고 빠른 방법 🚀

  • win_map[ch]을 리스트로 변환 후 join()을 사용하여 문자열로 결합
  • 코드가 직관적이며 가독성이 뛰어남

 

 

2️⃣ for 루프 + 문자열 추가 (+= 연산)

def solution(rsp):
    win_map = {'2': '0', '0': '5', '5': '2'}
    result = ""
    for ch in rsp:
        result += win_map[ch]
    return result

 

직관적인 방법이지만 비효율적

  • += 연산을 사용하여 문자열을 반복적으로 추가하면 성능이 저하될 수 있음

 

 

3️⃣ map() 함수 사용

def solution(rsp):
    win_map = {'2': '0', '0': '5', '5': '2'}
    return "".join(map(lambda ch: win_map[ch], rsp))

 

map()을 활용한 방법

  • lambda를 활용하여 변환을 수행
  • 리스트 컴프리헨션과 유사한 성능이지만, 가독성이 다소 떨어질 수 있음

 

 

4️⃣ translate() 함수 사용 (가장 효율적)

def solution(rsp):
    trans = str.maketrans("205", "052")
    return rsp.translate(trans)

 

가장 빠른 방식 중 하나 🚀

  • str.maketrans()를 이용하여 변환 규칙을 설정한 후, translate() 함수로 변환
  • 메모리 사용량이 적고 가장 효율적인 방식

 

 

5️⃣ replace() 연속 호출 (비추천)

def solution(rsp):
    return rsp.replace("2", "x").replace("0", "y").replace("5", "z").replace("x", "0").replace("y", "5").replace("z", "2")

 

여러 번 replace() 호출로 인해 성능 저하

  • 각 문자를 중간 단계(x, y, z)로 변경 후 최종 변환
  • 가독성이 낮고 비효율적이므로 추천하지 않음

 

 

🚀 결론: 가장 좋은 방법은?

방법 가독성 성능 추천 여부

리스트 컴프리헨션 (join()) ✅ 매우 좋음 ✅ 빠름 ⭐⭐⭐⭐
for 루프 (+=) ✅ 직관적 ❌ 느림 ⭐⭐
map() 함수 사용 ❌ 다소 복잡 ✅ 빠름 ⭐⭐⭐
translate() 활용 ✅ 간결 ✅ 매우 빠름 ⭐⭐⭐⭐
replace() 연속 호출 ❌ 길고 복잡 ❌ 비효율적

📌 가장 추천하는 방법:
1️⃣ translate() 활용 (rsp.translate(trans))

2️⃣ 리스트 컴프리헨션 ("".join(win_map[ch] for ch in rsp))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글