ahlight
개발 저장소
ahlight
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • Java (7)
    • Spring (5)
    • JPA (2)
    • JavaScript (0)
    • Computer Science (12)
      • 디자인패턴, 프로그래밍 패러다임 (1)
      • 네트워크 (4)
      • 운영체제 (4)
      • 데이터베이스 (3)
      • 자료구조 (0)
    • 알고리즘 (1)
    • 프로그래머스 (13)
    • 백준 (94)
    • 서평 (3)
    • 회고 (1)
    • TIL (58)
    • 기타 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • Java
  • 클린코드
  • TDD
  • 넥스트스텝
  • 라즈베리파이4 #홈서버 #포트포워딩 #dhcp

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ahlight

개발 저장소

백준

백준 1157번

2022. 11. 1. 10:38

문제

https://www.acmicpc.net/problem/1157

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

----------------------------------------첫번째 방법----------------
import java.util.Scanner;

public class Main1157 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		String string = sc.next();
		sc.close();
		
		char checkString = ' ';
		char maxString = ' ';
		int max = 0;
		int count = 0;
		int maxCount = 0;
		
		for (int i=0; i<string.length(); i++) {
			count = 0;
			checkString = string.charAt(i);
			 
			for (int j=0; j<string.length(); j++) {
				
				if (checkString == string.charAt(j)) {
					count++;
				}
			}
			
			if (max == count) {
				maxString = '?';
			} else if (max < count) {
				max = count;
				maxString = checkString;
			}
		}
		
		if (maxCount == max) {
			maxString = '?';
		}
		
		System.out.println(maxString);
	}
}
------------------------------두번째 방법---------------------------
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main1157_1 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		String string = sc.next();
		List<Character> checkString = new ArrayList<Character>();
		
		string = string.toLowerCase();
		sc.close();
		
		for (int i=0; i<string.length(); i++) {
			if (!checkString.contains(string.charAt(i))) {
				checkString.add(string.charAt(i));
			}
		}

		int max = 0;
		char maxChar = ' ';
		int[] count = new int[checkString.size()];
		
		for (int i=0; i<string.length(); i++) {
			if (checkString.contains(string.charAt(i))) {
				count[checkString.indexOf(string.charAt(i))]++;
			}
		}

		if (count.length == 1) {
			maxChar = checkString.get(0);
		}
		
		for (int i=0; i<count.length; i++) {
			if (max < count[i]) {
				max = count[i];
				maxChar = checkString.get(i);
			} 
			
			if (i == count.length-1) {
				break;
			}
			if (count[i] == count[i+1]) {
				maxChar = '?';
			}
		}

		System.out.println(Character.toUpperCase(maxChar));
	}
}

1. 틀렸다.

2. 여태 풀은 문제 중 제일 오랜시간이 걸렸다. 뭔가 풀릴듯 말듯해서 더 시간을 끈듯하다. 하지만 결과는 오답.. 이클립스 내에선 다 올바르게 나왔는데 백준 홈페이지에선 오답처리가 되었다.

3. 사실 풀면서 너무 주먹구구식으로 접근을 해서 긴가민가 했는데, 아무래도 내가 놓친 부분이 있는 듯하다.

4. 첫번째 풀이를 하면서 먼저 입력된 문자의 중복을 제거해야 한다고 생각을 했고, 두번째 풀이에서 적용을 했다. 다른 블로그의 글과 비교했을 때 로직의 큰 흐름은 비슷한듯 하다.

5. 다만 처음 접근 방법 자체가 달랐는데, 아래 코드 처럼 문자의 코드값으로 접근을 해야했다는 점이다.

mport java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
 
		int[] arr = new int[26]; // 영문자의 개수는 26개임
		String s = in.next();
 
		for (int i = 0; i < s.length(); i++){
 
			if ('A' <= s.charAt(i) && s.charAt(i) <= 'Z') { // 대문자 범위
				arr[s.charAt(i) - 'A']++;	// 해당 인덱스의 값 1 증가
			}
    
			else {	// 소문자 범위
				arr[s.charAt(i) - 'a']++;
			}
		}
 
 
		int max = -1;
		char ch = '?';
 
		for (int i = 0; i < 26; i++) {
			if (arr[i] > max) {
				max = arr[i];
				ch = (char) (i + 65); // 대문자로 출력해야하므로 65를 더해준다.
			}
			else if (arr[i] == max) {
				ch = '?';
			}
		}
 
		System.out.print(ch);
	}
 
}

6. 문자코드로 접근하는 방법만 인지하면 크게 어려움없는 문제였는데 해당 방식을 생각해내지 못해 풀이에 어려움이 컸다. 다음에 비슷한 문제를 또 풀게된다면 잊지말고 문자코드를 활용해서 접근하자.

 

출처 : https://st-lab.tistory.com/64

'백준' 카테고리의 다른 글

백준 10819번 ☆  (0) 2022.11.03
백준 2941번  (0) 2022.11.01
백준 11720번  (0) 2022.10.27
백준 4673번  (0) 2022.10.26
백준 2738번  (0) 2022.10.26
    '백준' 카테고리의 다른 글
    • 백준 10819번 ☆
    • 백준 2941번
    • 백준 11720번
    • 백준 4673번
    ahlight
    ahlight

    티스토리툴바