[Java] java RacingCar 미션(1)

전효준·2025년 1월 9일

자바 실습편

목록 보기
1/1
post-thumbnail

미션 설명

  • 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
  • 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
  • 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
  • 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
  • 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4 이상일 경우 전진하고, 3 이하의 값이면 멈춘다.
  • 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).
pobi,crong,honux
시도할 회수는 몇회인가요?
5

실행 결과
pobi : -
crong : -
honux : -  (이후 중략)

pobi, honux가 최종 우승했습니다.

...

Java 처음하는 내가 할 수 있을까??

python으로 하면 흉내라도 낼 수 있을것 같다.
GPT안쓰고 하는게 최초의 목표였으나, 바로 포기.
Java에서 input문을 어떻게 쓰는지도 모르는 나는 첫 줄 부터 GPT를 켤 수 밖에 없었다...⭐

Java에서는 변수명을 런타임 중에 동적으로 생성할 수 없습니다.

알아보니 java.util.Scanner라는 클래스를 사용해야 했다.

import java.util.Scanner;

Scanner sc = new Scanner(System.in); // Scanner 객체 생성
String car1 = sc.next(); // 입력받은 문자열을 str에 저장

System.in은 입력한 값을 Byte 단위로 읽어주는 자바의 표준 입력 스트림이라고 한다. (당연히 처음 알았다)

Scanner의 메서드는 다음과 같다
  • next() :
    • String타입 반환
    • 공백문자(space)를 만나면 종료
  • nextLinde() :
    • String타입 반환, Enter를 만나면 종료
    • 개행문자(Enter)를 만나면 종료
    • next()와 달리 띄워쓰기를 할 수 있음

이쯤에서 자바 포기 선언! (작전 변경)

자바로는 못한다. 해도 이건 내가 하는게 아니다.
그래도 나는 파이썬 심화반 강사이자 자격증반 담당이지 않는가!

해서 Pthhon으로 똑같이 구현하고 JAVA로는 GPT를 시켜서 비교해보기로 했다.

새롭게 알게 된 사실 : 튜플 패킹, 튜플 언패킹

튜플 언패킹 : 하나 이상의 값을 튜플로 묶는 행위. 튜플 생성이라고도 한다.
튜플 언패킹 : 튜플에 묶여 있는 값들을 풀어내는 행위.

물론 튜플 언패킹을 진행할 때는 튜플에 저장된 값의 수와 이를 저장하는 변수의 수일치해야 한다.

nums = (1,2,3,4,5)
n1,n2, *others = nums # 둘 이상의 값을 리스트로 묶을 때 *를 사용한다.
n1
1
n2
2
others # 이렇듯 튜플이 아닌 리스트로 묶인다는 사실을 기억하자.
[3,4,5]

문제의 구문

carData = [[car, 0] for car in carList]
winners = [car for car, score in carData if score == max(car[1] for car in carData)]
print(f'\n{" ".join(winners)}가 최종 우승했습니다!')

for car, score in carData는 carData의 각 원소를 자동으로 분해하여 첫 번째 요소를 car, 두 번째 요소를 score에 할당한다!

튜플 언패킹 없이 명시적으로 작성하면 다음과 같다. 나는 이 방식이 아직 더 맞는것 같다.

winners = []
max_score = max(car[1] for car in carData)
for item in carData:
    if item[1] == max_score:
        winners.append(item[0])

이렇게 해서 Python으로 작성을 마쳤다!

import random as r

carList = input("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)  ").split(',') #pobi,crong,honux
carCount = len(carList)
carData = [[car, 0] for car in carList]

roundCount = int(input("시도할 회수는 몇회인가요?:  "))

def printResult():
    for car, progress in carData:
        print(f'{car} : {"-"*progress}')

#시뮬레이션 실행
print("\n실행 결과")
for i in range(roundCount):
    for car in carData:
        if r.randrange(10) >= 4:
            car[1] += 1
        
    printResult()
    print()
    
    
# winners = [car for car, score in carData if score == max(car[1] for car in carData)] #튜플 언패킹 적용
winners = []
max_score = max(car[1] for car in carData)
for item in carData:
    if item[1] == max_score:
        winners.append(item[0])

print(f'\n{" ".join(winners)}가 최종 우승했습니다!')

이제 JAVA로 바꾸는 일만 남았다.
그건 다음시간에...

profile
아자아자 화이팅.

0개의 댓글