728x90
반응형

Python 문제풀이

#요세푸스 문제
a,b = map(int, input().split()) # a는 인원수, b는 삭제되는 자리 위치

x = []
result =[]
# 편하게 리스트에 사람들을 세움
for i in range(a):
    x.append(i)

#count는 삭제되는 자리위치를 셀 변수, current는 현재 위치
count=1
current=-1 #시작마다 current를 1씩 증가시켜 주기 위해 완전 초기 시작은 -1

while 1:
    #만약 1명밖에 남지 않았다면 그사람 출력하고 종료
    if len(x)==1:
        result.append(x[0]+1)
        break
    #만약 현재 위치가 리스트 맨 끝 자리라면 초기로 돌아가도록 한다
    if current == len(x)-1:
        current = 0
    else: #아니라면 그냥 1 증가
        current +=1

    #만약 count가 삭제될 순번이 되었다면 삭제
    if count ==b:
        count =1
        result.append(x[current]+1)
        del x[current]
        current -=1 #삭제후 리스트 길이가 줄면서 범위를 넘게되는걸 방지하기 위해 -1
        continue
    count +=1

#도대체 왜 이렇게 출력하라고 했을까?
print('<', end='')
for i in range(len(result)-1):
    print(result[i], end='')
    print(', ',end='')
print(result[-1],end='')
print('>')

코딩이 조금 복잡해져서 주석으로 약간의 설명을 적었습니다.

 

사람이 삭제되어야 할 순간에는 결과값을 출력할 result리스트에 추가하였습니다.

 

코드의 주요 부분을 설명드리겠습니다. count는 삭제되는 번째의 수의 카운트입니다. 3번째 사람을 삭제시킨다고 하면 일단 3번째인 것을 알기위해 1부터 3까지 숫자를 세야할겁니다. 그 카운트입니다.

 

current는 현재 위치입니다. 7명의 사람이 있다고 치면, count와 함께 하나씩 증가하며 count가 삭제 위치에 도달했을때 현재 위치의 사람을 없애기 위해 존재하는 변수입니다.

다만 유의할 점이 있습니다. 현재위치가 리스트의 마지막일 경우 사람을 한명 삭제하면 리스트의 길이가 1 줄어듭니다. 사람을 삭제했을때 current 변수 값을 하나 줄이지 않으면 다음 계산때 리스트 밖을 벗어나게 되기 때문에 -1을 해줍니다.

current를 -1했을때 현재위치가 차이나는것은 while문을 시작하자마자 증가시켜주기 때문에 걱정하지 않으셔도 됩니다. 그리고 현재 위치가 리스트의 마지막 부분이라면 1을 증가시켜야 할 부분에서 리스트의 0번째 위치로 이동하도록 변경합니다. 원형리스트를 만들었다고 생각하면 됩니다.

 

while문을 통해 사람을 없애다가 사람이 한명밖에 안남았다면 그냥 그 사람을 결과 리스트인 result에 추가하고 반복문을 탈출합니다.

 

마지막으로 결과리스트를 출력할때 <3,1,4,....>의 모양을 갖추기위해 코드를 좀 작성해줍니다.

728x90
반응형
728x90
반응형

이 문제는 백준 10828번 스택 문제의 연장선입니다. 먼저 확인하시는 것을 추천드립니다.

[백준 10828번] 스택 Python 풀이 :: 러아니푸의 공부방 (tistory.com)

 

[백준 10828번] 스택 Python 풀이

Python 문제풀이 import sys n = int(input()) x=[] for i in range(n): # 입력을 input을 쓰지말고 이렇게 활용해야 빠르게 풀 수 있다. order= sys.stdin.readline().rstrip() if order =='pop': if len(x)==0:..

fjdkslvn.tistory.com

 

Python 문제풀이

#큐
import sys

n = int(input())
x=[]
for i in range(n):
    # 입력을 input을 쓰지말고 이렇게 활용해야 빠르게 풀 수 있다.
    order= sys.stdin.readline().rstrip()

    if order =='pop':
        if len(x)==0:
            print(-1)
        else:
            print(x.pop())
    elif order =='size':
        print(len(x))
    elif order =='empty':
        if len(x)==0:
            print(1)
        else:
            print(0)
    elif order =='top':
        if len(x)==0:
            print(-1)
        else:
            print(x[-1])
    elif order =='front':
        if len(x)==0:
            print(-1)
        else:
            print(x[-1])
    elif order =='back':
        if len(x)==0:
            print(-1)
        else:
            print(x[0])
    else:
        x.insert(0, order.split()[1])

스택과 다른 점은 push로 입력받을때 0번째 위치로 넣어주고 나머지 작업은 리스트의 맨 마지막에서 이루어진다는 것 입니다. 물론 back을 입력받았을 경우에는 제일 최근 숫자가 들어온 위치인 0번째를 출력해줍니다.

 

이 외에는 스택 문제와 다른점이 없습니다. 시간초과가 나셔서 찾아오셨다면 sys.stdin.readline().rstrip()로 명령을 입력받는 것을 추천드립니다.

728x90
반응형
728x90
반응형

백준 1427번 소트인사이드 문제의 연장선 같습니다. 먼저 소트인사이드를 확인하시는 것도 좋을것같습니다.

[백준 1427번] 소트인사이드 Python 풀이 :: 러아니푸의 공부방 (tistory.com)

 

[백준 1427번] 소트인사이드 Python 풀이

Python 문제풀이 n = input() x = [] result='' for i in range(len(n)): x.append(n[i]) x.sort(reverse=True) for i in range(len(x)): result += x[i] print(result) 입력 받은 문자열을 내림차순하기 위해서..

fjdkslvn.tistory.com

 

Python 문제풀이

n = input()
x = []
sum=0
result=''

#내림차순 정렬
for i in range(len(n)):
    x.append(n[i])
x.sort(reverse=True)

#내림차순 된 리스트를 문자열로 변환, 값 더하기
for i in range(len(x)):
    result += x[i]
    sum += int(x[i])

#모두 더한 값이 3으로 나눠지며 제일 작은 값이 0이라면
if sum%3==0 and result[-1]=='0':
    print(result) #30으로 나누어지는 숫자이니 출력
else:
    print(-1)

 

해당 문제는 입력받은 문자열을 내림차순으로 정렬한 후, 3으로 나눠지는 수.. 즉 각 자리수를 모두 더한 값이 3으로 나눠지는지 확인하고, 이 문제는 30으로 나누어지는 것을 원했으니 제일 작은 수 부분에 0이 있다면 30으로도 충분히 나누어지는 수가 됩니다.

 

상대방에게 이해되도록 설명하는 것이 어렵네요. 역시 개발자들은 코드로 이야기하는게 좋은것 같습니다! ㅎㅎ

728x90
반응형
728x90
반응형

Python 문제풀이

n = input()
x = []
result=''
for i in range(len(n)):
    x.append(n[i])
x.sort(reverse=True)

for i in range(len(x)):
    result += x[i]
print(result)

입력 받은 문자열을 내림차순하기 위해서 리스트에 하나씩 옮겨담습니다.

 

파이썬은 참 다양하고 편리한 함수가 많은것같습니다.

sort를 이용하여 리스트를 정렬하는데 reverse=True 옵션을 넣어 정렬해줍니다.

 

정렬이 끝난 리스트는 문자열로 변환하여 출력합니다.

728x90
반응형
728x90
반응형

Python 문제풀이

import sys

n = int(input())
x=[]
for i in range(n):
    # 입력을 input을 쓰지말고 이렇게 활용해야 빠르게 풀 수 있다.
    order= sys.stdin.readline().rstrip()

    if order =='pop':
        if len(x)==0:
            print(-1)
        else:
            print(x.pop())
    elif order =='size':
        print(len(x))
    elif order =='empty':
        if len(x)==0:
            print(1)
        else:
            print(0)
    elif order =='top':
        if len(x)==0:
            print(-1)
        else:
            print(x[len(x)-1])
    else:
        x.append(order.split()[1])

스택을 구현하는 문제입니다. 

 

pop의 경우에는 기본적으로 존재하는 pop함수를 사용하여 리스트 마지막 요소(최근요소)를 지우고 출력하도록 합니다.

 

top의 경우에는 리스트 마지막 요소를 출력하면 되기 때문에 x[리스트길이 -1]을 출력해줍니다.

 

push의 경우는 'push 365' 등으로 입력받아지기 때문에 띄어쓰기를 기준으로 문자열을 분리해주는 split를 사용하고 뒷부분 문자열인 365가 필요하기 때문에 [1]을 붙여주어 append로 추가해줬습니다.

 

다만 이렇게 구현해도 시간초과로 정답처리를 받을 수 없는 경우가 있습니다.

그 경우에는 sys.stdin.readline().rstrip()를 사용하여 입력을 받게된다면 정말 빠르게 효율이 상승합니다.. 평소에도 이걸로 문자열을 받아야하나 싶었습니다.

728x90
반응형
728x90
반응형

Python 문제풀이

n = int(input())
alpa =[]
result =0
now = ''
state = 0 #상태가 -1이라면 그룹단어가 아니고 0이면 그룹단어이다
for i in range(n):
    text= input()

    now = text[0] #현재 이어지고 있는 문자를 뜻하는 변수에 첫 문자를 넣기
    alpa.append(text[0]) #나왔던 문자를 저장하는 리스트에 첫 문자를 넣기

    for j in range(len(text)):
        if(now != text[j]): # 이어지다가 다른 글자가 나왔다면
            for k in range(len(alpa)): # 이미 나왔던건지 검사하고
                if alpa[k]==text[j]: #이미 나왔던거라면
                    state = -1 #이거는 횟수로 칭할 수 없다
                    break
        else: #이어지는 글자라면 계속가자
            continue

        if state == -1:
            break
        else: #나는 문제없는 새로운 문자다
            now = text[j] #현재 이어지는 문자를 새로운 문자로 변경
            alpa.append(text[j]) #새로운 문자를 리스트에 추가

    alpa = [] #나왔던 문자를 저장하는 리스트 초기화

    if state == 0:
        result +=1
    else:
        state =0


print(result)

저도 문제를 풀면서 헷갈려서 주석을 달면서 풀었습니다. 원래 주석은 달아야하는게 맞습니다만..ㅎ

 

간단하게 설명하면 나왔던 문자는 이어짐이 끊긴 상태에서 또 나오면 안됩니다.

그러니 문자의 이어짐을 확인하고 새로운 문자가 나왔다면 그 문자가 이전에 나왔던 문자인지 확인하면 됩니다.

 

alpa는 나왔던 문자를 저장하는 리스트입니다. 새로운 문자가 나왔다면 alpa 안에 그 문자가 있는지 확인합니다.

정말 새로운 문자라면 현재 이어지는 알파벳을 저장하고있는 now 변수에 해당 알파벳을 넣고 새로운 문자이니 alpa리스트에 이 문자를 추가해줍니다.

728x90
반응형

+ Recent posts