코딩테스트[파이썬]/이것이 코딩테스트다(이코테) 39

[구현] - 게임 개발

게임 개발 육지(0)와 바다(1)로 구성된 N x M 크기의 직사각형 공간이 있다. 캐릭터는 동서남북으로 이동이 가능하며 바다로는 이동이 불가능하다. 맵의 각 칸은 (A,B)로 나타낼 수 있고 A는 북쪽으로 떨어진 칸의 개수, B는 서쪽으로 떨어진 칸의 개수이다. 아래는 캐릭터의 움직임을 설정하기 위한 메뉴얼이다. 1. 현재 위치에서 현재방향을 기준으로 왼쪾방향(반시계방향 90도로 회전한 방향)부터 차례대로 이동 2.왼쪽 방향에 안가본 곳이 있다면 왼쪽으로 회전후 한칸 전진, 왼쪾 방향에 가보지 않은 칸이 없다면 왼쪽 방향으로 회전만하고 1단계로 돌아간다. 3.만약 네방향 모두 이미 가본칸이거나 바다로 되어있으면 바라본느 방향을 유지한채 한칸 뒤로 가고 1단계로 돌아간다. 단, 이떄 뒤쪽 방향이 바다인칸..

[구현] - 왕실의 나이트

나이트는 8 X 8 공간 밖으로는 나가지 못하며 L 자 형태로만 이동할 수 있다. 1. 수평으로 두칸 이동한 뒤 수직으로 한칸 이동하기 2. 수직으로 두칸 이동한 뒤 수평으로 한칸이동하기 행은 1~8로 표현되며 열은 a~h로 표현이 된다. 이때 행과열에 대한 정보가 주어졌을 때 나이트가 이동가능한 경우의 수를 출력하라. 입력 예시) a1 출력 예시) 2 나의 코드 col,row=(map(str,input())) col=ord(col) col=col-96 row=int(row) arr=[[0]*9 for _ in range(9)] cnt=0 dx=[-2,-2,-1,1,2,2,1,-1] dy=[-1,1,2,2,1,-1,-2,-2] for k in range(8): nx=row +dx[k] ny=col+dy[..

[구현] 시각

정수 N이 입력되면 00시 00분 00초 부터 N시 59분 59초 까지의 모든 시각중 3이 하나라도 포함 되는 경우의 수를 출력. 나의코드 N=int(input()) cnt=0 for k in range(N+1): if k==3 or k==13 or k==23: cnt+=3600 continue for i in range(60): if i %10==3 or i//10==3: cnt+=60 continue for j in range(60): if j%10==3 or j//10==3: cnt+=1 print(cnt) 우선 시간, 분, 초단위로 나누어 생각을 해 보았다. 시간 단에서 3이 포함되면 분과 초는 어떤 값이 오더라도 카운팅이 된다. 즉 60*60이 바로 카운팅이 된다. 그리고 contine를 하여 ..

[구현] 상하 좌우

N x N 크기의 정사각형 공간이 있고 가장 왼쪽 좌표는 (1,1) 가장 오른쪽 아래 좌표는 (N,N)이다. 상,하,좌,우로 이동할 수 있으며, 시작 좌표는 항상 (1,1)dlek. 이동할 계획서에는 L,R,U,D 중 하나의 문자가 반복적으로 적혀 있다. L : 왼쪽으로 한칸 이동 R : 오른쪽으로 한칸이동 U : 위로 한칸 이동 D : 아래로 한칸 이동 단, 이동 명령이 공간을 벗어나는 명령이 오면 무시한다. ex) (1,1)에 있다가 L 혹은 U를 명령하는 경우 명령어를 모두 수행한 후 현재 좌표를 출력 하시오. 입력 조건 ) 첫째 줄에 공간의 크기를 나타내는 N이 주어진다 둘쨰 줄에 계획서의 명령이 주어진다. 입력 예시) 5 R R R U D D 출력 예시) 3 4 나의 코드 N=int(input(..

[구현] 아이디어를 코드로 바꾸는 구현

피지컬로 승부하기 - 구현이란 '머리속에 있는 알고리즘을 소스코르도 바꾸는 과정'이다 - 구현 유형의 문제는 ' 풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제' 이다 - 구현하기 어려운 문제란 ? 1. 알고리즘은 간단하지만 코드가 지나치게 길어지는 문제 2. 특정 소수점 자리 까지 출력하는 문제 3.문자열이 이볅으로 주어졌을 때 한문자 단위로 끊어서(파싱하여) 리스트에 넣어야 하는 문제 - 사용 언어의 문법을 잘 이해하고 라이브러리 사용 경험이 많아야 한다. ex) N개의 원소중 R 개를 골라 리스트에 저장 하는 경우 - 반복목으로 기능을 전부 작성할 수 있지만 itertools같은 표준 라이브러리로 쉽게 짤수 있다 - 현 교재에서는 '완전 탐색', '시물레이션' 유형을 '구현' 유형으로 묶..

[그리디] - 1이 될 때까지

1이 될 때 까지 어떠한 수 N,K가 입력이 들어오면 두가지의 연산을 통해 N의 값을 1로 만드는 과정 중 연산의 최소 횟수를 구하는 문제. 단, 두번째 연산은 N이 K로 나누어 떨어 질때만 선택할 수 있다. 1. N에서 1을 뺀다. 2. N을 K 로 나눈다. 나의 코드 n,k=map(int,input().split()) cnt =0 while n!=1: if n%k==0: n=n//k cnt+=1 else: n=n-1 cnt+=1 print(cnt) '최소 회수' 라는 단어에서 그리디 알고리즘을 떠올렸다. 또한 두가지 연상 종류 중 뺴기 보단 나누기가 횟수를 줄이는데 효과가 좋다. 우선 2번 연산이 가능한지(n이k로 나누어 지는지) 확인 후 가능하면 2번을 하고 2번 연산이 안되면 1번 연산을 한다. ..

[그리디] 숫자 카드 게임

숫자 카드 게임 가장 높은 숫자를 뽑는 게임. - NxM형태로 놓여있으며 N은 행 M 은 열을 뜻한다. - 먼저 행을 선택한다 - 그 다음 행에 포함된 카드들 중 가장 숫자가 낮은 카드를 뽑는다. 입력 예시) 3 3 3 1 2 4 1 4 2 2 2 출력 예시) 2 입력 예시) 2 4 7 3 1 8 3 3 3 4 출력 예시) 3 나의 코드 n,m=map(int, input().split()) arr=[list(map(int,input().split())) for _ in range(n)] res=[0]*n for i in range(n): res[i]=min(arr[i]) print(max(res)) 가장 높은 숫자와 가장 낮은 숫자 라는 단어가 보여 바로 그리디임을 직감했다. 또한 결국 출력 값은 '모든..

[그리디] - 큰수의 법칙

큰수의 법칙 - 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰수를 만드는 법칙 - 단, 배열의 특정한 인덱스에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없다. - 단, 서로 다른 인덱스에 해당하는 수가 같은 경우에도 서로 다른것으로 간주 입력 예시) 5 8 3 2 4 5 4 6 출력 예시) 46 나의 코드 n,m,k=map(int,input().split()) arr=list(map(int,input().split())) arr.sort(reverse=True) s=0 cnt=0 while True: for _ in range(k): if cnt==m: print(s) break s+=arr[0] cnt+=1 if cnt==m: print(s) break s+=arr[..

[그리디] 당장 좋은 것만 선택하는 그리디

그리디 알고리즘(Greedy Algorithm) 현재 상황에서 지금 당장 좋은 것만 고른다. 정당성 분석이 중요하다.(단순히 가장 좋아 보이는 것을 반복적으로 선택해도 최적의 해를 구할 수 있는지 검토) 일반적인 상황에서 최적의 해를 보장할 수 없을 때가 많다. 하지만 코딩테스트에서는 탐욕법으로 얻은 해가 최적의 해가 되는 상황에서 , 이론을 추론할 수 있어야 풀리도록 출제가 된다. 정렬과 함꼐 주로 사용이 되며 '가장 큰', '가장 작은' 과 같은 기준을 문제에서 제시해 준다. 예시 문제) 거스름돈 해결 아이디어 : 최적의 해를 빠르게 구하기 위해서는 가장 큰 화폐 단위부터 돈을 거슬러 주면된다. 정당성 분석 가장 큰 화페 단위부터 돈을 거슬러 주는 것이 최적의 해를 보장하는 이유는 무엇일까? => 가..