[Python] 코딩 도장 - Printing OXs

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: Printing OXs] - Lv.1

앞의 문제들 중 비슷한 알고리즘이 있던 것 같지만, 같은 건 없다고 생각해서 올립니다.

문제를 푸는데 많은 approach가 있을 듯 싶습니다.

이 문제의 핵심은 비트 연산을 얼마나 잘 이해하고 있냐이기 때문에 비트 연산으로 풀어주세요.

input은 int n을 입력 받아 첫번째 row는 (n-1)의 O와 X, 두번째 row는 (n-2)의 O와 XX,

세번째 row는 (n-3)의 0와 XXX… n번째 row는 n의 X을 출력하시오.

입력 예시: 6

출력 예시:

OOOOOX

OOOOXX

OOOXXX

OOXXXX

OXXXXX

XXXXXX

출처: https://codingdojang.com/scode/492?answer_mode=hide


[풀이]

n = int(input("정수를 입력하세요."))

for i in range(n):
    print("O" * (n-i-1) + "X" * (i+1))
정수를 입력하세요.6
OOOOOX
OOOOXX
OOOXXX
OOXXXX
OXXXXX
XXXXXX

비트로는 못 풀겠어서 문자열의 곱으로 우선 풀어두었다.

코드 자체는 간단하게 구했다.


[추천 풀이]

n = int(input())
tmp = 2**n-1
for i in range(n):
    print(bin(tmp<<(i+1))) # <- 이해를 위해 추가
    print(bin(tmp<<(i+1))[-n:].replace('1','O').replace('0','X'))
6
0b1111110
OOOOOX
0b11111100
OOOOXX
0b111111000
OOOXXX
0b1111110000
OOXXXX
0b11111100000
OXXXXX
0b111111000000
XXXXXX

보니까 다른 사람들도 비트로 푼 사람이 거의 없다..

위 풀이는 작성자분이 남겨주신 비트를 이용한 풀이다.

결과를 보면서 편하게 이해하려고 과정 코드를 추가해두었다.

시프트 연산까지는 비슷하게 생각했었는데 슬라이싱을 뒤에서부터 할 생각을 못한게 아쉽다.

Leave a comment