Skip to content

ChoiGiSung/CodeSquad

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

79 Commits
 
 
 
 

Repository files navigation

CodeSquad

문제풀이

1. step-1

문제해설

일단 step-1이라는 클래스를 생성해서 문제를 전담한다.
main에서 input 함수를 호출하면 input 함수에서는 사용자의 입력값을 받아서
calc함수를 호출한다. calc 함수는 사용자의 입력값중 R,L을 판단하여 알맞은 함수를 호출한다

Left함수는 사용자가 L을 입력할때 나오는 함수이다.
L을 입력받았을때 글자는 왼쪽으로 이동해야하므로 인덱스의 관점으로 보면
빼기가 되는 형태이다. 그래서 (이동할 수 * -1) 을 해서 각 인덱스가 이동할
인덱스를 채워서 배열로 돌려주는 함수 FillIndex를 호출한다.

FillIndex함수는 각 글자가 이동할 인덱스를 배열에 저장하는데
여기서 -했을떄 0보다 작을 경우를 캐치 해야한다.
-가 됬을때의 인덱스는 없으므로 0이상의 값으로 만들어 주는데 while문으로
계속해서 문자열의 길이만큼 더해줘서 0 이상으로 만든다.
0이상이되면 그 인덱스배열 안에 들어올 수 있으므로 저장한다
다 인덱스 배열에 저장이 끝나면 인덱스 배열을 넘겨준다.

Right 배열도 Left배열과 동작 방법이 동일하지만 -가 아니라
오른쪽으로 이동하므로 +이다. 근데 +1을 곱하면 동일 값이므로 그냥 넘겨준다.
FillIndex함수에서 인덱스를 +했을때 문자열보다 길어지면 index값에 넣을 수 없으므로
길이로 나누고 나머지값을 인덱스 값으로 한다

출력함수 printStr은 문자가 잘려서 담긴 char배열과 각 문자가 이동할 인덱스가 담긴
배열으 매개변수로 받아서 스트링 빌더를 통해 문자를 생성한다.

input함수

main문에서 호출하는 함수로서 사용자가 입력하는 값을 받고
calc함수로 전해준다

calc함수

input함수에서 실행되는 함수로서 사용자가 입력한 R,L에 따라서
어느 함수를 실행할지 결정한다.

Left함수

L이나 l을 입력했을때 오는 곳으로
Left는 왼쪽으로 값을 옮기는 거다 그래서 인덱스 상으로 봤을때는
현재 인덱스에서 이동할 값을 빼줘야 한다. 그렇기에 appendData에 -1을 곱해줬다.
FillIndex함수를 통해 값을 보낸다. 그리고 밑에서 출력한다

Right함수

R이나 r을 입력했을떄 오는 곳으로 right는 오른쪽으로 옮기는 거다. 그래서 인덱스 상으로 보면 현재 인덱스에서 값을 더하는 것이므로 +1을 곱해야한다 .
밑은 left와 동일

FillIndex함수

Left함수와 Right함수 두개다 호출하는 함수로 매개변수로 받는 것은 얼만큼 이동할건지
의 int를 받고 새로운 int배열을 받는다.
함수의 내용은 매개변수로 받은 index함수에 인덱스가 이동할 곳을 정해서 저장하는 역할을 한다.
사용자가 3 l 을 입력했다면 -3을 받아서 0인덱스는 -3을 더한다.
0인덱스는 -3위치로 이동해야한다. 근데 인덱스가 마이너스가 될 수는 없으므로 입력받은 문자열
의 길이만큼 더해준다 0보다 커질때까지. 그럼 그곳이 0인덱스가 -3했을때 이동해야는 위치다
R을 입력했을때나 L일때 -값을 입력했을때는 우측으로 이동하는데 문자열보다
길어질 경우를 생각해야한다 .그래서 문자열 길이만큼 나눠준 나머지가 인덱스가 이동해야할 위치이다. 그렇게 다 인덱스가 이동해야할 위치를 저장항 index배열을 return한다.

printStr함수

문자를 출력하는 함수로 문자열을 문자로 잘라서 해당 문자가
이동할 index를 담은 index배열을 이용해서 result배열에
위치에 이동시킨다. 그후에 result배열을 스트링빌더로 글자를 만든다.

2. step-2

문제해설

Step_2클래스로 빼서 main문에서는 startGame함수만 호출하면 된다.
Step_2클래스에는 cube와 while문에 사용할 flag를 전역변수로 뺐다.
startGame함수에서는 전역변수의 사용을 최소화 하기위해서 rocalArr로 cube의 값을 복사한다.
startGame에서 처음 만나는 함수는 print함수이다 값을 한번 출력해 주는 역할을 한다.
startGame에서 다음으로 만나는 while문은 flag의 상태에 따라 무한으로 돈다. 여기서
사용자에게 입력값을 받는데 U'R'등 작은따옴표가 있는 문자는 문자열로 자를때 한꺼번에 인식
하지 못하므로 전부 다른 알파벳으로 바꿔줘서 계산하기 쉽게 만든다.
쉽게 만든 문자열을 문자 배열로 바꾸고 commandSwitch함수에 파라미터로 넣어서 함수를 실행한다.
commandSwitch함수는 로컬큐브의 값고 문자배열을 받아서 하나하나 for문을 돌면서
값에 알맞는 함수를 실행한다. U,R,L.. 등등의 함수는 배열의 인덱스를 조정해서
큐브의 이동을 표현했다. 전부 전역변수를 사용하지 않기위해 매개변수로 배열값을
받아서 사용하고 return값으로 다시 배열을 준다. 그 return값을 print함수에서 사용한다.
print 함수에서 R'U'등을 r,u로 바꾼거 처럼 다시 원상복귀 시켜준 뒤 값을 출력한다.
commandSwitch함수에서 큐브 이동 함수 이외의 값을 입력하면 함수를 종료시킨다.

startGame함수

main문에서 호출하는 함수
전역변수에 선언한 큐브를 지역변수로 사용하기 위해서 deepcopy함수를 정의 했다.
큐브를 한번 출력하고 while문은 전역변수로 뺀 flag를 사용하고
사용자가 입력한 값중에 작은따옴표는 소문자로 바꿔서 계산하기 쉽게한다
그 문자로 commandSwitch함수를 돌린다

deepCopy함수

원래는 clone함수를 썼는데 2차원 배열에서는 사용불가라는 글을 보고
함수를 새로 만들어서 cube를 지역변수로 만든다.

print함수

출력하는 함수로 처음 문자를 하나 받아서 위에 출력하고
큐브의 내용을 출력한다. u와 같은 문자는 다시 U'로 바꿔서 출력한다.

commandSwitch함수

사용자가 입력한 값을 하나하나 잘라서 알맞은 함수를 실행한다.
지역변수로 사용하기 위해서 다 return값으로 배열을 받고 있다.
Q나 다른 문자를 입력하면 함수를 종료시킨다.

UB,UComaBComa함수

사용자가 입력한 문자를 하나하나 잘라서 알맞은 함수를 실행할때
사용하는 함수로 움직이는 배열값을 string으로 저장한 후에 return해준다.

3. step-3

문제해설

Step_3 클래스로 빼서 사용할 수 있다. 전역변수로 큐브의 면들을 정의 했고,
큐브가 돌아갈 while문의 flag와 시작시간, 종료시간, 큐브가 몇번 돌았는지를 전역변수로 뺐다
main에서 startGame을 호출하면 게임이 실행되고 커맨드에서 T를 입력하면 random으로 10번 돌린다
2를 입력하면 앞에 있던 문자값을 한번 더 실행 한다.

startGame함수

시작 시간을 체크하고, 처음 큐브 모양을 출력하고,
무한루프로 사용자의 입력을 받는다.사용자의 입력 커맨드를 쉽게 알아 보기 위해
작은 따옴표는 소문자로 바꿔주고 각 문자에 맞는 커맨드를 실행 시킨다.
후에 큐브가 1번이상 돌아갔다면 그 큐브가 다 맞춰졌는지를 확인하고 다 맞춰 졌다면
무한 루프를 빠져나가고 게임을 종료시킨다

commandSwitch함수

사용자가 입력한 문자열을 문자하나하나로 잘라서 각자에 맞는 함수를 실행시킨다
돌아갈때만다 count 를 하나씩 올리고, 큐브의 현재 모양을 출력한다
사용자가 2를 입력했을때는 앞에있던 문자를 한번 더 실행시켜서 2번 실행하게 한다
사용자가 T를 입력햇을떄는 random함수를 실행시켜서 10번 랜덤으로 큐브를 돌린다
나머지 문자를 입력하면 flag를 false만들어 while문을 탈출한다

U~D,U'~D'함수

뭔가 알고림즘이 있을꺼 같은데 모르겠어서 무식한 노가다 방법을 사용했다.
옆면이 시계방향과 반시계방향으로 돌아간다 turnClock함수는 시계방향을
사용자가 입력했을떄 보이는 면이 시계방향으로 움직이고 turnAnticlockwise 함수는
반대로 U'와 같은 반시계를 입력했을때 보이는 면이 반시계로 움직인다.

replaceCommend함수

사용자가 입력한 문자를 U'와 같은 경우는 u로 바꿔서 계산한다
그 역할을 해주는 함수

replaceCommendChar함수

print함수에서 사용하는 함수로서 u와 같은 문자를 다시 U'로 바꿔주는
함수 역할을 한다 큐브 모양을 찍어 줄때 원래의 글자가 필요하기 떄문이다

printsolo함수

큐브에서 U,D큐브면 같은 경우를 보면 한줄에 혼자만 나오기 때문에 찍어준다.

print함수

큐브의 모양을 찍어주는 함수로 처음에 U와 D는 따로 찍어주기 위해 함수로 뺐다.
중간의 4개의 면은 같이 나와야 하고 코드 수를 줄이기 위해 스트링빌더를 사용했다.

turnAnticlockwise함수

반시계로 돌떄 사용하는 함수로 보이는 주변 면뿐만 아니라
보이는 면도 돌아야하기 때문에 안의 인덱스를 반시계로 돌린다

turnClock함수

시계방향으로 돌떄 사용하는 함수로 보인느 주변 면 뿐만 아니라
보이는 면도 돌아야하기 때문에 안의 인덱스를 반시계로 돌린다

endGame함수

게임을 종료하는 함수로 startGame함수에서 while문이 끝나면 호출한다.
내용은 시간을 측정하고 출력하는 문장만 있다.

getStartTime함수

시간을 처음 기록하는 함수 startGame함수에서 사용한다

getEndTime함수

끝나는 시간을 저장하고 계산하는 함수 endGame함수에서 사용한다.

checkCube함수

큐브가 다 맞춰졌는지 확인 하는 함수로 startGame 함수에서 큐브가 돌아간적이
있다면 다 맞춰졌는지 확인 하는 함수이다.

random함수

램덤하게 섞는 함수로 커맨드가 들어가있는 배열에 랜덤한 값을
줘서 값을 꺼내온다. 그 값으로 커맨드를 실행시킨다.

About

문제풀이

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages