-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
2주차 모범 답안 #9
Comments
#아래 주석부는 애초에 틀린 부분이라 생략합니다.
#입력
n = int(input(""))
directions = list(map(int, input("").split()))
#각 이동 방향의 좌표 이동량을 리스트로 미리 저장해둡니다.
mov = [(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1),(-1,0),(-1,1)]
new = True #새로운 방이 생길 수 있다는 플래그입니다. 새로운 좌표로 이동할 때에 True로 올라갑니다.
now = (0, 0) #현재 좌표를 (0, 0)으로 초기화합니다.
bef = (3, 3) #이전 좌표를 저장하기 위한 변수를 초기화 하는데, 날린 주석부에서만 쓰는 변수라 없어도 됩니다.
visited = {now:[-1]}
'''
위 visited는 방문한 좌표를 진입한 방향과 함께 저장하는 좌표 기록입니다.
만약 (0, 0)좌표로부터 (1, 1)좌표로 1방향으로 도달했다면 visited에 {(1, 1) : [1]}이 저장되는 방식입니다.
다만 시작하는 좌표는 진입각이 없었으니 쓰지 않는 방향인 -1로 저장해 visited를 초기화합니다.
'''
shapes = 0 #생성된 방의 갯수입니다.
additional = False #점이 아닌 곳에서 대각선으로 교차되어 방이 추가로 생성되는지 알려주는 플래그입니다.
for d in directions:
nex = (now[0]+mov[d][0], now[1]+mov[d][1]) #이동 방향대로 다음 좌표를 저장합니다.
if d%2 == 1: #만약 이동 방향이 대각선인 경우,
try:
#이번 이동으로 이전에 그은 대각선과 교차하는 경우
if (d+2)%8 in visited[(now[0]+mov[(d+1)%8][0]) ,(now[1]+mov[(d+1)%8][1]) ]:
additional = True #플래그를 세워줍니다.
except: #이번 이동과 겹치는 대각선이 아예 없다면
additional = False
if nex in visited: #이번 이동으로 도달한 좌표에 왔던 적이 있는 경우,
if d not in visited[nex]: #그리고 그 사이에 한 번이라도 새 좌표에 들른 적이 있는 경우,
shapes += 1 #새로운 방이 만들어졌습니다.
if additional: #또한 대각선이 교차했다면,
shapes += 1 #하나가 더 만들어졌습니다. (2 7 2 5가 기가 막힌 예시입니다.)
additional = False #서있던 플래그를 내려줍니다.
visited[nex].append(d) #처음 도달한 좌표니 좌표 기록에 추가합니다.
visited[now].append((d+4) % 8) #한 쪽 방향만 저장되지 않도록 반대 방향 좌표 기록도 추가합니다.
else: #이번 이동으로 도달한 좌표에 왔던 적이 있고, 그 사이에 새 좌표로 들른 적이 없는 경우,
additional = False #이미 있던 선만 따라간 것이니, 대각선이 교차했대도 새로 생성되는 방은 없습니다.
new = False #새로운 좌표가 아니니 new플래그도 내려줍니다.
else: #처음 와보는 좌표인 경우,
visited[nex] = [d] #좌표 기록에 추가해줍니다.
visited[now].append((d+4) % 8) #반대 방향도 추가합니다.
new = True #새로운 좌표에 도달했으니, 이제 기존 좌표에 도달하면 도형이 이어져 방이 생성됩니다. 플래그를 올립니다.
if additional: #1 6 3처럼 대각선 교차로 방이 생성된 경우,
shapes += 1 #방 갯수를 추가하고,
additional = False #올라간 플래그를 초기화합니다.
bef = now #없어도 됩니다.
now = nex #아까 계산한 다음 좌표로 넘어갑니다.
#끝!
print(shapes) |
# for free
to join this conversation on GitHub.
Already have an account?
# to comment
개요
모범 답안
1. 해밍코드
문제 보기
정답 : 10명
전현준
2. 괄호 회전하기
문제 보기
정답 : 13명
전현준
stack을 이용한 풀이
3. 방돌이
문제 보기
정답 : 5명
심규진
stack을 이용한 풀이
4. 앱등이
문제 보기
정답 : 11명
구희연
two pointer 알고리즘을 이용한 풀이
송용우
슬라이딩 윈도우 알고리즘을 이용한 풀이
5. 방의 개수
문제 보기
정답 : 6명
윤창목
정산
1주차 후반부터 실행 시간을 기록하도록 시스템이 개선되어 2주차부터는 모범 답안 선정시에도 실행 시간을 고려하고 있습니다. 모범 답안은
실행 시간
,최적화 정도
,가독성
등을 종합적으로 검토하여 선정하며,비슷한 경우 모범 답안 선정 횟수가 적은 분을 우선으로 선정합니다.
모범 답안 작성 후 해설 작성시
모범 답안 채택 갯수 시상
에 우대합니다(동점자 발생시). 모범 답안 선정되신 분들은 다른 학우분들이 코드를 보고 공부하실 수 있도록 해설 남겨주시면 감사드리겠습니다.코드에 주석으로 달아주신 분들은 해설을 작성해주신것으로 간주하겠습니다. 물론 추가 해설을 작성해주시면 너무 감사드립니다.
해설은 본 이슈에 계속 달아주세요!
모범 답안 및 해설에 대한 질문이 있으신 분들도 여기에 같이 남겨주시면 좋을 것 같습니다. 슬랙 #dcomding 채널을 이용해주셔도 좋습니다.
The text was updated successfully, but these errors were encountered: