[BOJ-S2] 15787: 기차가 어둠을 헤치고 은하수를

아이엠강욱·2023년 5월 20일
0

코딩테스트

목록 보기
12/23

해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://www.acmicpc.net/problem/15787


이 문제에서 핵심은 문제를 잘 이해하고 3번명령과 4번명령 로직을 잘 구현하는 것이라고 생각한다.
크게 어렵지 않았던 문제였던 것 같다.

아쉬웠던 점

  • 3번명령과 4번명령은 문자열/배열의 원소들을 전체적으로 한칸씩 땡기고 미는 작업이다. 나는 이 부분을 임시변수를 2개나 사용해서 swap하는 방식으로 구현을 했는데 생각해보면 굳이 이렇게 할 필요가 없다.
  • 예를 들어 [1, 2, 3, 4, 5]를 한칸씩 밀어서 [0, 1, 2, 3, 4]로 만들려고 하면 뒤에서부터 작업하면 된다. 나는 앞에서밖에 생각을 못해서 1->2로 해버리면 2->3할때 이전 값을 기억을 못하니까 임시 변수를 사용한건데 생각해보면 4->5로 밀고 3->4로 해서 밀고 이렇게 하면 굳이 이전값을 기억하지 않아도 되었다.
  • 마지막으로 문제에서 기차가 지나갈 때 기록들을 비교하는 부분이 있는데 그부분도 너무 비효율적으로 코드를 작성한 것 같아서 아쉬웠다.

bad code & good code

bad code

"""
백준 15787 (S2): 기차가 어둠을 헤치고 은하수를
https://www.acmicpc.net/problem/15787
"""

n, m = map(int, input().split())  # n: 기차 수, m: 명령 수
trains = [[0] * 20 for _ in range(n)]  # 각 기차마다 20개 좌석 할당

for i in range(m):
  command = list(map(int, input().split()))  # 명령 입력받음

  if command[0] == 1:  # 1번 명령
    trainNumber = command[1] - 1  # 기차 번호
    seatNumber = command[2] - 1  # 좌석 번호

    if trains[trainNumber][seatNumber] == 0:  # 좌석이 비어있으면 입석 처리
      trains[trainNumber][seatNumber] = 1
  elif command[0] == 2:  # 2번 명령
    trainNumber = command[1] - 1  # 기차 번호
    seatNumber = command[2] - 1  # 좌석 번호

    if trains[trainNumber][seatNumber] == 1:  # 좌석에 타있으면 하차 처리
      trains[trainNumber][seatNumber] = 0
  elif command[0] == 3:  # 3번 명령
    trainNumber = command[1] - 1
    selectedTrain = trains[trainNumber]
    temp = selectedTrain[0]
    _temp = -1
    for i in range(1, len(selectedTrain)):
      _temp = selectedTrain[i]  # 현재값 미리저장
      selectedTrain[i] = temp  # 이전 값 가져옴
      temp = _temp

    selectedTrain[0] = 0  # 맨 앞자리는 공석처리
    trains[trainNumber] = selectedTrain
  elif command[0] == 4:  # 4번 명령
    trainNumber = command[1] - 1
    selectedTrain = trains[trainNumber]
    temp = selectedTrain[len(selectedTrain) - 1]
    _temp = -1
    for i in range(len(selectedTrain)-2, -1, -1):
      _temp = selectedTrain[i]
      selectedTrain[i] = temp
      temp = _temp

    selectedTrain[len(selectedTrain)-1] = 0   # 맨 뒷자리 공석처리
    trains[trainNumber] = selectedTrain


records = []
count = 0

for train in trains:
  checkResult = False
  if len(records) != 0:
    for record in records:
      if train == record:
        checkResult = True
        break

    if checkResult == False:
      count += 1
  else:
    count += 1
    
  records.append(train)


print(count)

good code

n, m = map(int, input().split())  # n: 기차 수, m: 명령 수
trains = [[0] * 20 for _ in range(n)]  # 각 기차마다 20개 좌석 할당

for i in range(m):
  command = list(map(int, input().split()))  # 명령 입력받음

  if command[0] == 1:  # 1번 명령
    trains[command[1]-1][command[2]-1] = 1   # 굳이 좌석이 비어있는지 확인할 필요 없음
  elif command[0] == 2:  # 2번 명령
    trains[command[1]-1][command[2]-1] = 0  # 마찬가지로 좌석이 비어있지 않은지 확인할 필요 없음
  elif command[0] == 3:  # 3번 명령
    """
    여기가 제일 어이가 없었음..
    나는 임시값을 2개나 받았는데 생각해보니 거꾸로 하면 전혀 추가값이 필요없다는걸...
    왜 이걸 생각하지 못했을까
    """
    for j in range(19, 0, -1):
      trains[command[1]-1][j] = trains[command[1]-1][j-1]
    trains[command[1]-1][0] = 0
  elif command[0] == 4:  # 4번 명령
    for j in range(19):
      trains[command[1]-1][j] = trains[command[1]-1][j+1]
    trains[command[1]-1][19] = 0


records = []
count = 0

for i in range(n):
  if trains[i] not in records:
    records.append(trains[i])
    count += 1


print(count)
profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글