알고리즘/[항해99] 1일 1알고리즘 스터디

99클럽 코테 스터디 1일차 TIL ✒️char[] 문자열 비교하기

hooooolly 2025. 4. 1. 04:21

1일차 시작!

 

✅ 오늘의 학습 키워드

  • Scanner 사용 시 남아있는 개행 문자 처리
  • 반복문으로 문자열 비교
  • char[]을 이용

 


🔍 오늘의 문제 분석

↘️ 오늘의 문제 바로가기 ↘️

 

  • 1~50개의 길이가 같은 문자열이 주어진다.
  • 알파벳 소문자로만 이루어져 있어 대소문자를 따로 구분하지 않아도 된다.
  • 주어진 문자열을 모두 비교해야 한다.
  • 공통된 문자는 남기고 다른 문자는 물음표로 대체해야 한다.

 

문제를 분석한 후 모든 문자열의 길이는 같기 때문에 첫 번째 들어오는 문자열의 길이만큼 반복적으로 비교해 줘야겠다고 생각했다. 문자열의 각 자리를 비교해야 하기 때문에 문자열 데이터를 저장하는 자료구조 중에서도 문자열 배열을 통해서 charAt 메서드를 사용하기로 했다. 그리고 처음에 주어지는 총 문자열의 개수대로 반복문을 사용해서 배열의 인덱스별로 비교해가고 싶었다. 

 


✨ 오늘의 회고

더보기
import java.util.Scanner;

public class Day1_1032 {

  public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    scan.nextLine();

    String s = scan.nextLine();
    char[] chars = s.toCharArray();

    for (int i = 0; i < n - 1; i++) {
      String ss = scan.nextLine();

      for (int k = 0; k < chars.length; k++) {
        if (ss.charAt(k) != chars[k]) {
          chars[k] = '?';
        }
      }
    }

    System.out.println(new String(chars));

  }

}

 

오랜만에 푸는 자료구조 알고리즘 문제이다 보니 방향을 잡는데 시간이 오래 걸렸다. 반복문의 순서를 여러 번 바꿔가면서 풀었다. 첫 번째 문제는 Scanner 클래스를 사용하면서 처음 nextInt()로 숫자를 입력받으면 개행 문자(\n)가 남아있어서 그 후에 빈 문자열이 한번 들어가는 문제가 있었다. nextInt() 호출 후 scan.nextLine();을 한 번 더 호출해서 개행 문자를 없애고 입력을 받도록 해결했다. 그리고 마지막에 chars[] 에 담긴 데이터를 출력하는 과정에서 System.out.println(chars.toString());을 사용했더니 배열의 주소값이 출력되는 문제가 발생했다. char[] 배열을 바로 출력하면 문자열이 아니라 객체의 메모리 주소가 출력되므로, new String(chars)이나 String.valueOf()를 사용해서 String 클래스로 변환해서 출력했다.

 

new String(char[]) 형식이 익숙하지 않아서 문서를 확인했다. String 객체를 생성하는 생성자인데, String 내부적으로 char[]을 복사하여 저장하고 원본 배열을 수정해도 영향이 미치지 않는다고 한다.

 

어떻게 String 객체 생성자에 char[] 문자 배열을 입력할 수 있는지 궁금해졌다🤔 

 

그래서 String 생성자에 대해 더 알아보았다. 자바에서 String은 내부적으로 char 문자가 여러 개 이어진 시퀀스를 저장하기 위한 자료형이다. 결국 String 객체는 가장 기본적인 자료 구조인 char[] 그 자체라고 봐도 되기 때문에 초기값으로 사용될 수 있다고 한다. 또 다른 String 생성자 파라미터 종류로는 byte[] 바이트배열,  String 객체, 바이트 배열과 인코딩 방식, StringBuffer, 유니코드 포인트 배열이 있다는 것을 알게 되었다.

 

Scanner 대신 더 효율적으로 입력받기 위해서 BufferedReader를 사용해야겠다고 생각했다. 그리고 내일부터는 최적화한 코드와 메모리와 속도 부분에서 어떻게 달라지는지 확인해 봐야겠다. 99클럽 스터디는 다른 참가자들과 소통할 수 있고 원하면 코드를 공유할 수 있어서 좋은 것 같다. 나와 다른 풀이를 보면서 더 발전할 수 있을 것 같아 앞으로 기대가 된다.