본문 바로가기
코테 - 자바

99클럽 코테 스터디 1일차 TIL + 팰린드롬

by BIGENGINEER 2025. 3. 31.

팰린드롬인지 확인하기

 

문제

알파벳 소문자로만 이루어진 단어가 주어진다. 이때, 이 단어가 팰린드롬인지 아닌지 확인하는 프로그램을 작성하시오.

팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다. 

level, noon은 팰린드롬이고, baekjoon, online, judge는 팰린드롬이 아니다.

입력

첫째 줄에 단어가 주어진다. 단어의 길이는 1보다 크거나 같고, 100보다 작거나 같으며, 알파벳 소문자로만 이루어져 있다.

출력

첫째 줄에 팰린드롬이면 1, 아니면 0을 출력한다.

 

 


 

1) 우선 어떻게 구현할지 생각해보자

1. 단어에서 알파벳 하나하나를 보아야하므로 배열을 사용해야될듯

2. 반복문을 통해서 알파벳을 확인

3. level의 알파벳을 확인하는 클래스와 online의 알파벳을 확인하는 클래스를 만듦

4. main에서 각 클래스에서 나온 배열의 값을 가지고

if 문으로 배열 첫 번째부터 읽은 것과 뒤에서부터 읽은 것이 같으면 즉, 팰린드롬이면 1, 아니면 0 출력함.

 

 

 

 2) 코드 짜기

- 자바 구조 다 까먹음

- 배열을 클래스 안에서 만드는지 main에서 만드는지 까먹음

- 처음에 main에서 배열 생성하고 클래스로 가져와서 배열의 값 확인하는 것이라 생각

- 당연히 막힘

 

 

3) 코드 1차

public class palindrome{

    public static void main(String[] args) {
        
        String[] pal = 'level';
        String[] pal2 = 'online';
        arr(pal);
        rev(pal);
        arr(pal2);
        rev(pal2);

        if(arr(pal) == rev(pal)){
            return 1;
        }
        else {
            return 0;
        }

    }

}

public String arr(String x){

    int i;
    for(i=0; i<x.length(); i++){
        System.out.println(x[i]);
    }

    return x[i];
}

public String rev(String k){
    int i;
    for(i=k.length(); i>=0; i--){
        System.out.println(k[i]);
    }

    return k[i];
}

 

 - 이게 뭐지 .. 올리기 부끄럽다

- 총체적 난국이다.

- 결국 30분 제한시간을 넘겼다.

 

 

 

 

 

3) 클럽장님 코드 1

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {


        Scanner sc = new Scanner(System.in); 

        String word = sc.nextLine();

        int left = 0; 
        int right = word.length() - 1;

        while (left < right) {

            if (word.charAt(left) != word.charAt(right)) {
                System.out.println(0);
                return;
            }

            left++;
            right--; 

        }

        System.out.println(1);

    }
}

 

- System.in으로 받아오는거였다. 자바 책 사서 다시 공부해야될듯. 하나도 모르겠다 흡

- left는 0으로 설정하면되는데 right에서는 length() -1을 해주어야한다. 인덱스는 0부터 시작하기 때문에!!!!

 

String을 가져올 때 .charAt(1)이면 level일 때 e를 가져옴.

- charat()은?

-> char 타입으로 변환됨.

 

- 내 코드와 비교하면 정말 간단하다 따흑

 

 

 

 

 

 4) 클럽장님 코드 2

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        String word = sc.nextLine();
        String reversedWord = new StringBuilder(word).reverse().toString();

//        if (word == reversedWord) {
        if (word.equals(reversedWord)) {
            System.out.println(1); 
        } else {
            System.out.println(0);
        }

    }
}

 

- 이건 더 간단하다. 

- .reverse()를 통해 바꿔주고 toString()으로 이어준다.

- 여기서 주의해야할 점은 == 을 사용하게되면 String은 주소값을 참조하므로 .equals를 사용해야된다.

 

 

 

 

 

 

!!정리하면

1) String을 활용할 때는 ==을 사용하면 안된다.

-> 왜 ? String은 주소값을 가지고 있기 때문에 noon과 거꾸로 바꾼 noon의 각각 n의 주소값은 다르기 때문이다. 

-> String을 비교할 때는 equals를 사용하자 => 담긴 값을 비교함.

 

 

2) word.length() -1 -> 크기로 할 때는 항상 -1 해줘야함. (인덱스와 다르기 때문에)

 

 

??질문??

1) scanner와 bufferdReader의 차이

 

->  scanner는 하나씩 가져와서 느림

bufferdReader br = new BufferedReader(new InputStreamReader(System.in));4

br.readLine(); 

-> 몇 만개를 가져와야한다고 했을 때 값들을 가져온 상태에서 활용해서 사용하다보니 속도 측면에서 훨씬 빠름 

 

 

 

** 내가 질문한 것

??? 배열로 풀면 안되나요?

- > 풀어도 okay. 배열로 푼 분들 많음

-> 음 근데 클럽장님 코드가 간결하고 이해가 빠른듯

 

 

[내일 공부할 것들]

- 자바 기본 구조 익히기..

- 자바 함수 공부

 

)))) 더 공부하자 .........