본문 바로가기
Coding Test (코딩 테스트)

코딩테스트 4일차(1)(2024.10.21) - 3문제

by BioLearner 2024. 10. 21.
반응형

1. 백준 - 10171 문제 (고양이)

처음 제출한 내용

print("""\    /\""")
print(""" )  ( ')""")
print("""(  /  )""")
print(""" \(__)|""")

 

일단 가장 먼저 오류가 났던 게 '자와 ()자가 ""(큰 다움표)와 겹쳐서 오류가 났다. 그래서

""" """를 사용하여 이를 고치려고 했다. 그 이유는 모든 것을 다 묶을 수 있다고 생각했기 때문이다. 그러나 실제로 그렇지 않았다. 답이 아니였다.

정답:

print("\\    /\\")
print(" )  ( ')")
print("(  /  )")
print(" \\(__)|")

코드에서 문제가 발생하는 이유는 백슬래시(\)가 이스케이프 문자로 사용되기 때문이다. 백슬래시를 출력하려면 두 번 입력해야 한다.  

 

기존에 알았던 내용

print(): 값을 출력하는 함수

 

새롭게 알게 된 내용

print(r" ) ( ')") 여기서 r은 원시 문자열(raw string)을 의미하며, 백슬래시(\)를 문자열로 해석하지 않고 그대로 출력할 수 있게 해준다.

 

궁금한점

이스케이프 문자란?

프로그래밍 언어에서 특정 문자를 특별한 방법으로 처리하기 위해 사용하는 문자. 주로 백슬래시(\)를 앞에 붙여서 해당 문자가 특별한 의미를 가지도록 만든다. 이스케이프 문자는 일반적으로 문자열 안에서 제어 문자를 표현하거나, 특수 문자를 출력하기 위해 사용된다.

 

주요 이스케이프 문자 종류

1. \n : 줄바꿈 (Newline)

  • 줄을 바꾸는 기능을 한다.
  • 예: "Hello\nWorld" → "Hello"와 "World"가 두 줄에 출력된다.

 

2. \t : 탭 (Tab)

  • 탭 간격을 추가한다.
  • 예: "Hello\tWorld" → "Hello"와 "World" 사이에 탭 간격이 추가된다.

 

3. \\ : 백슬래시 출력 (Backslash)

  • 백슬래시 자체를 출력하려면 두 번 써야 한다.
  • 예: "C:\\Users\\Name" → "C:\Users\Name"

 

4. \' : 작은따옴표 출력 (Single quote)

  • 작은따옴표를 문자열 안에서 사용할 수 있게 해준다.
  • 예: 'It\'s a nice day' → It's a nice day

 

5. \" : 큰따옴표 출력 (Double quote)

  • 큰따옴표를 문자열 안에서 사용할 수 있게 해줍니다.
  • 예: "She said, \"Hello!\"" → She said, "Hello!"

 

6. \r : 캐리지 리턴 (Carriage return)

  • 커서를 줄의 처음으로 이동시킨다.
  • 주로 파일 처리에서 사용된다.

 

7. \b : 백스페이스 (Backspace)

  • 한 글자를 지우는 효과가 있다.

이스케이프 문자가 필요한 이유

프로그래밍 언어에서 특정 문자는 문자열 내에서 특별한 의미를 가질 수 있다. 예를 들어, 작은따옴표나 큰따옴표는 문자열을 정의하는데 사용되지만, 문자열 내에서 따옴표 자체를 표현해야 할 때 이스케이프 문자를 사용해야 한다.

 

2. 백준 - 10172 문제 (개)

처음 제출한 내용

print("|\_/|")
print("|q p|   /}")
print('\( 0 )"""\\')
print('|"^"`    |"')
print("||_/=\\__|")

 

처음에는 왜 틀린지 몰랐다. 그 이유는 코드를 저렇게 입력해도 컴파일이 되었기 때문이다.

정답:

print("|\_/|")
print("|q p|   /}")
print('( 0 )"""\\')
print('|"^"`    |')
print("||_/=\\\\__|")

윗 부분의 틀린 내용은 다섯번째 줄이다. 저상태에서 역슬래시 \\는 \를 출력하기 떄문에 \\를 출력하기 위해서는 \\\\를 써야했다.

 

기존에 알았던 내용

위에 서술

 

새롭게 알게 된 내용

없음

 

궁금한점

없음

 

2. 백준 - 5073 문제 (삼각형과 세 변)

처음 제출한 내용

A, B, C = map(int, input().split())

list = [A, B, C]

for i in range(len(list) - 1):  # 인덱스를 사용
    if list[i] > list[i+1]:  # 앞의 값이 더 크면 교체
        list[i], list[i+1] = list[i+1], list[i]  # 값 교환

if list[2] > list[1] + list[0]:
  print("invalid")
elif A == B & A == C & B == C:
  print("Equilateral")
elif A == B | A == C | B == C:
  print("Isosceles")
else:
  print("Scalene")

이것에 대한 방법은 다음의 전략으로 사용하였다.

1. 가장 먼저 Invalid를 찾기 위해 A,B,C를 리스트화하고 정렬하여 조건을 만들어 계산하려고 했음

2. 나머지는 연산자를 통해 해결하려고 했음

그러나 생각하지 못한 부분이 많았음 1번 방법은 비효율적이면서 정확하지 않았음

정답:

while True:
    # 입력 받기
    A, B, C = map(int, input().split())
    
    # 종료 조건
    if A == 0 and B == 0 and C == 0:
        break
    
    # 유효성 검사: 가장 긴 변의 길이보다 나머지 두 변의 합이 길어야 함
    if A + B <= C or A + C <= B or B + C <= A:
        print("Invalid")
    else:
        # 삼각형 유형 판별
        if A == B == C:
            print("Equilateral")
        elif A == B or A == C or B == C:
            print("Isosceles")
        else:
            print("Scalene")

내가 틀린 이유는 다음과 같음

1. 리스트의 정렬 문제

  • 처음 코드는 리스트의 정렬을 시도하고 있지만, 정렬이 필요한 것이 아니다. 대신 세 변의 길이를 직접 비교하여 삼각형의 유효성을 검사해야 한다.

2. 유효성 검사

  • if list[2] > list[1] + list[0]:와 같은 조건을 사용하는 것보다 먼저 모든 조건을 함께 고려하여 삼각형의 유효성을 검사해야 한다. 예를 들어, A + B > C, A + C > B, B + C > A를 검사해야 한다.

3. 비교 연산자 사용 오류

  • &와 |는 비트 연산자이며, 논리 연산자(and, or)를 사용해야 한다. 삼각형의 유형을 판단하는 부분에서 이 오류로 인해 조건이 잘못 평가될 수 있다.

4. 종료 조건을 넣지 않음

  • 종료 조건도 없었음

기존에 알았던 내용

map() 함수의 주요 용도는 데이터 변환

나머지는 언급하지 않음

 

새롭게 알게 된 내용

없음

 

궁금한점

없음


자기 평가

1. 문제 해결 능력:

  • 다양한 문제를 통해 출력 형식과 이스케이프 문자의 중요성을 이해했다. 특히, 문자열 출력에서 발생할 수 있는 오류를 해결한 경험은 실력을 향상시키는 데 도움이 되었다.

2. 자료 구조와 알고리즘 이해:

  • 삼각형의 유효성 검사 문제를 통해 조건문과 리스트를 사용하는 방법에 대해 고민했다. 하지만 잘못된 접근 방식으로 인해 처음에는 비효율적인 코드를 작성하게 되었다. 이 과정에서 문제를 여러 방향으로 분석하고 해결하는 능력을 키울 수 있었다.

3. 디버깅 경험:

  • 코드에서 오류를 발견하고 수정하는 과정에서 디버깅 능력이 향상되었다. 특히, 논리 연산자와 비트 연산자의 차이를 이해한 점은 중요한 발전이다.

다음 단계

1. 자료 구조와 알고리즘 강화:

  • 앞으로는 자료 구조(스택, 큐, 트리 등)와 알고리즘(정렬, 탐색, 그래프 등)에 대한 깊이 있는 학습이 필요하다. 이러한 기본기를 다지면 복잡한 문제를 해결하는 데 큰 도움이 될 것이다.

2. 문제 풀이 연습:

  • 백준과 같은 코딩 테스트 플랫폼에서 다양한 문제를 꾸준히 풀어보는 것이 중요하다. 특히, 특정 주제나 알고리즘에 집중해서 문제를 풀어보는 것이 좋을 것이다.

3. 최적화 및 성능 고려:

  • 처음 작성한 코드는 비효율적이었기 때문에, 문제를 해결한 후에는 항상 코드 최적화를 고려해야 한다. 시간 복잡도와 공간 복잡도를 계산해보는 연습도 필요하다.

4. 협업 및 코드 리뷰:

  • 다른 사람들과 함께 문제를 해결하거나 코드를 리뷰하는 경험을 통해 다양한 접근 방식을 배울 수 있다. 이는 코드 품질을 향상시키는 데 큰 도움이 될 것이다.

5. 이론적 배경 강화:

  • 문제를 해결하면서 사용한 이론적 배경(예: 삼각형의 성질, 이스케이프 문자 등)을 더 깊이 있게 공부하는 것도 중요하다. 이를 통해 새로운 문제에 접근할 때 더 큰 자신감을 가질 수 있을 것이다.
반응형